文/韓菲 李煒
隨著大數據時代的到來,數據量和數據種類急劇增加,計算難度越來越大,串行計算已經難以滿足超大規模復雜問題的計算需求,GPU以其全新的架構優勢突破摩爾定律的束縛為計算力注入新的力量。
如圖1所示,CPU在設計之初主要精力集中在控制和緩存等非計算功能,著力于低延遲,快速響應完成某個操作,優化串行計算;GPU則適合計算密集、高度并行化、高計算強度(計算/訪存比)的并行計算任務主要致力于設計大量的ALU(Arithmetic Logical Unit)計算單元,使計算能力大幅度增強。
GPU由若干個流多處理器(Streaming Multiprocessor,簡稱SM)組成,如圖2所示,1個SM由8個標量流處理器(Stream Processor,簡 稱SP)、1個 指 令 單 元、1個32位的寄存器、共享存儲器(Shared Memory)、常量存儲器(Constant Cache)、紋理存儲器(Texture Cache)等硬件組成。

圖1:CPU與GPU架構的比較

圖2:SM的硬件結構
GPU的“核心”通常指的是SP的數量。而真正GPU的核心需要包含取指、解碼、分發邏輯和執行單元。因此,SM被稱為“GPU的核心”更加合適,SP僅僅是執行單元,不是完整的處理核心。CUDA模型中Thread對應SP,Block中的1個Thread被發射到1個SP上,8個SP組成1個SM,共用1個SM中的共享存儲器,共享1個SM中的一套取指與發射單元,因此1個Block中的線程可以共享數據;1個Block必須對應1個SM,但為了隱藏延遲提高執行單元的資源利用率,1個SM可以同時有多個活躍線程塊(active Block)等待執行。在SM中,線程的創建、調度和執行等操作均由硬件完成,沒有時間開銷,一旦1個Block執行高延遲操作,則另1個Block馬上占用SM資源執行程序。
NVIDIA提出了支持在GPU上做通用計算的統一計算設備架構CUDA(Compute Unif ied Device Architecture),編程人員可以利用CUDA編程模型使用擴展的C語言在開發環境下編寫程序,使GPU程序輕松地運行在GPU上,大大降低了利用GPU進行通用計算的難度,降低編程門檻,省去程序員學習GPU復雜結構和底層復雜運行模式的難度,提高程序的性能,減輕早期GPU計算中存在的一些限制。
CUDA程序分為主機代碼和設備代碼兩部分。主機是CPU,主機代碼一般為串行代碼在CPU上執行;設備是GPU,設備代碼是在GPU上并行執行的代碼,被稱為內核函數。該函數并發成千上萬個線程,并行執行程序,1個內核函數(Kernel)對應1個線程網格(Grid),1個線程網格最多由65535個線程塊(Block)組成,1個線程塊最多由512個線程(Thread)組成,則512*65535=33553920是1個線程網格可以擁有的最多線程數,足夠大多數程序使用。
在內核函數定義中,要建立對Block和Thread的索引,對任務進行劃分。同時還建立了四個內置變量:gridDim、BlockDim、BlockIdx、ThreadIdx,對應關系如下:

表1:CPU與GPU運行時間對比
GPU最廣泛的應用領域之一就是地震勘探。地震波傳播時遇到斷棱或不整合面上的突變點后將變為新震源,發出球面波向四周傳播形成的波被稱為繞射波。為計算旅行時,設采樣點5000個,采樣間隔0.002s,CDP 200個,道頭文件包含炮點橫縱坐標Sx、Sy,檢波點橫縱坐標Rx,Ry四個信息,坐標文件包含地下反射點橫縱坐標coorx、coory兩個信息。對每個CDP的每個時間點進行計算,nt0代表采樣點,ncdp代表cdp數,算法步驟如下:
S1:0=>i
S2:讀入反射點坐標,炮點檢波點坐標
S3:反射點地面橫坐標-炮點橫坐標=>炮點反射點地面橫向距離
S4:反射點地面縱坐標-炮點縱坐標=>炮點反射點地面縱向距離
S5:炮點反射點橫向距離平方+炮點反射點縱向距離平方=>炮點反射點地面距離的平方
S6:反射點地面橫坐標-檢波點橫坐標=>檢波點反射點地面橫向距離
S7:反射點地面縱坐標-檢波點縱坐標=>檢波點反射點地面縱向距離
S8:檢波點反射點橫向距離平方+檢波點反射點縱向距離平方=>檢波點反射點地面距離的平方
S9:0=>j
S10:i*nt0+j=>當前cdp的時間采樣點
S11:對當前點獲取速度
S12:求取當前速度的倒數
S13:求取倒數的平方
S14:求取炮點旅行時
S15:求取檢波點旅行時
S16:炮點旅行時+檢波點旅行時=>總旅行時
S17:j+1=>j
S18:如果j<5000,返回S9,否則執行S19
S19:i+1=>i
S20:如果i<200,返回S2,否則算法結束

圖3:GPU計算反射點旅行時流程
CPU計算旅行時花費的時間:344.60000s
通過對CUDA的并行機制的分析,作出以下分塊策略。根據計算旅行時的實際數據需求,時間采樣點nt0=5000個,cdp數200個,因此首先將5000個t(x,y)的計算與1個Block對應,設200個Block,1個Block(x,y)計算1個t(x,y),并行計算直到200*5000個t(x,y)計算完畢,之后將計算結果傳回CPU,通過循環輸出1000000個點的旅行時。
每一個線程處理一個炮點旅行時ts和檢波點旅行時tg的計算,得到一個總旅行時t值,當計算點增大時,不會受到線程數量限制的影響。具體計算流程如圖3。
GPU計算旅行時花費的時間:25.30000s
計算旅行時的GPU算法理論帶寬:
Theoretical Bandwidth=效地對算法進行加速,在累加和算法中采用最優化方法時GPU是CPU的14倍左右。
(2)結合GPU的硬件特點對大數據量的并行計算是非常有效的。當計算的數據量較小時,GPU算法中,啟動的線程計算量不滿載,大部分時間花在了系統調度開銷上,GPU并行計算的優勢沒有展現,時間與CPU計算時間差別不明顯;隨著計算的數據量增大,每個線程的計算漸漸滿載,時間花在系統調度的比例降低,GPU并行程度提高,加速比上升。=143.36GB/s (Tesla C2075內存時鐘為1120MHz,內存接口寬度為512 bit)。
實際帶寬距離理論帶寬還有一定差距,算法中還存在一定的瓶頸。
除此之外,本論文還計算了采樣點=500個,CDP=20個的反射點旅行時,CPU與GPU運行效率對比如表1。
(1)CPU的串行計算是通過多次循環逐一計算各點旅行時,因此時間為所有循環結束后的總時間,而GPU的并行計算時間為計算一點旅行時的時間加上主機與設備間互相傳遞參數的時間。當計算量小時,CPU與GPU的計算時間差別不大,但隨著計算量的逐漸加大,GPU的并行計算逐漸體現其優勢,它可以有