文/韓菲 李煒
隨著大數(shù)據(jù)時代的到來,數(shù)據(jù)量和數(shù)據(jù)種類急劇增加,計算難度越來越大,串行計算已經(jīng)難以滿足超大規(guī)模復(fù)雜問題的計算需求,GPU以其全新的架構(gòu)優(yōu)勢突破摩爾定律的束縛為計算力注入新的力量。
如圖1所示,CPU在設(shè)計之初主要精力集中在控制和緩存等非計算功能,著力于低延遲,快速響應(yīng)完成某個操作,優(yōu)化串行計算;GPU則適合計算密集、高度并行化、高計算強度(計算/訪存比)的并行計算任務(wù)主要致力于設(shè)計大量的ALU(Arithmetic Logical Unit)計算單元,使計算能力大幅度增強。
GPU由若干個流多處理器(Streaming Multiprocessor,簡稱SM)組成,如圖2所示,1個SM由8個標(biāo)量流處理器(Stream Processor,簡 稱SP)、1個 指 令 單 元、1個32位的寄存器、共享存儲器(Shared Memory)、常量存儲器(Constant Cache)、紋理存儲器(Texture Cache)等硬件組成。
圖1:CPU與GPU架構(gòu)的比較
圖2:SM的硬件結(jié)構(gòu)
GPU的“核心”通常指的是SP的數(shù)量。而真正GPU的核心需要包含取指、解碼、分發(fā)邏輯和執(zhí)行單元。因此,SM被稱為“GPU的核心”更加合適,SP僅僅是執(zhí)行單元,不是完整的處理核心。CUDA模型中Thread對應(yīng)SP,Block中的1個Thread被發(fā)射到1個SP上,8個SP組成1個SM,共用1個SM中的共享存儲器,共享1個SM中的一套取指與發(fā)射單元,因此1個Block中的線程可以共享數(shù)據(jù);1個Block必須對應(yīng)1個SM,但為了隱藏延遲提高執(zhí)行單元的資源利用率,1個SM可以同時有多個活躍線程塊(active Block)等待執(zhí)行。在SM中,線程的創(chuàng)建、調(diào)度和執(zhí)行等操作均由硬件完成,沒有時間開銷,一旦1個Block執(zhí)行高延遲操作,則另1個Block馬上占用SM資源執(zhí)行程序。
NVIDIA提出了支持在GPU上做通用計算的統(tǒng)一計算設(shè)備架構(gòu)CUDA(Compute Unif ied Device Architecture),編程人員可以利用CUDA編程模型使用擴展的C語言在開發(fā)環(huán)境下編寫程序,使GPU程序輕松地運行在GPU上,大大降低了利用GPU進行通用計算的難度,降低編程門檻,省去程序員學(xué)習(xí)GPU復(fù)雜結(jié)構(gòu)和底層復(fù)雜運行模式的難度,提高程序的性能,減輕早期GPU計算中存在的一些限制。
CUDA程序分為主機代碼和設(shè)備代碼兩部分。主機是CPU,主機代碼一般為串行代碼在CPU上執(zhí)行;設(shè)備是GPU,設(shè)備代碼是在GPU上并行執(zhí)行的代碼,被稱為內(nèi)核函數(shù)。該函數(shù)并發(fā)成千上萬個線程,并行執(zhí)行程序,1個內(nèi)核函數(shù)(Kernel)對應(yīng)1個線程網(wǎng)格(Grid),1個線程網(wǎng)格最多由65535個線程塊(Block)組成,1個線程塊最多由512個線程(Thread)組成,則512*65535=33553920是1個線程網(wǎng)格可以擁有的最多線程數(shù),足夠大多數(shù)程序使用。
在內(nèi)核函數(shù)定義中,要建立對Block和Thread的索引,對任務(wù)進行劃分。同時還建立了四個內(nèi)置變量:gridDim、BlockDim、BlockIdx、ThreadIdx,對應(yīng)關(guān)系如下:
表1:CPU與GPU運行時間對比
GPU最廣泛的應(yīng)用領(lǐng)域之一就是地震勘探。地震波傳播時遇到斷棱或不整合面上的突變點后將變?yōu)樾抡鹪矗l(fā)出球面波向四周傳播形成的波被稱為繞射波。為計算旅行時,設(shè)采樣點5000個,采樣間隔0.002s,CDP 200個,道頭文件包含炮點橫縱坐標(biāo)Sx、Sy,檢波點橫縱坐標(biāo)Rx,Ry四個信息,坐標(biāo)文件包含地下反射點橫縱坐標(biāo)coorx、coory兩個信息。對每個CDP的每個時間點進行計算,nt0代表采樣點,ncdp代表cdp數(shù),算法步驟如下:
S1:0=>i
S2:讀入反射點坐標(biāo),炮點檢波點坐標(biāo)
S3:反射點地面橫坐標(biāo)-炮點橫坐標(biāo)=>炮點反射點地面橫向距離
S4:反射點地面縱坐標(biāo)-炮點縱坐標(biāo)=>炮點反射點地面縱向距離
S5:炮點反射點橫向距離平方+炮點反射點縱向距離平方=>炮點反射點地面距離的平方
S6:反射點地面橫坐標(biāo)-檢波點橫坐標(biāo)=>檢波點反射點地面橫向距離
S7:反射點地面縱坐標(biāo)-檢波點縱坐標(biāo)=>檢波點反射點地面縱向距離
S8:檢波點反射點橫向距離平方+檢波點反射點縱向距離平方=>檢波點反射點地面距離的平方
S9:0=>j
S10:i*nt0+j=>當(dāng)前cdp的時間采樣點
S11:對當(dāng)前點獲取速度
S12:求取當(dāng)前速度的倒數(shù)
S13:求取倒數(shù)的平方
S14:求取炮點旅行時
S15:求取檢波點旅行時
S16:炮點旅行時+檢波點旅行時=>總旅行時
S17:j+1=>j
S18:如果j<5000,返回S9,否則執(zhí)行S19
S19:i+1=>i
S20:如果i<200,返回S2,否則算法結(jié)束
圖3:GPU計算反射點旅行時流程
CPU計算旅行時花費的時間:344.60000s
通過對CUDA的并行機制的分析,作出以下分塊策略。根據(jù)計算旅行時的實際數(shù)據(jù)需求,時間采樣點nt0=5000個,cdp數(shù)200個,因此首先將5000個t(x,y)的計算與1個Block對應(yīng),設(shè)200個Block,1個Block(x,y)計算1個t(x,y),并行計算直到200*5000個t(x,y)計算完畢,之后將計算結(jié)果傳回CPU,通過循環(huán)輸出1000000個點的旅行時。
每一個線程處理一個炮點旅行時ts和檢波點旅行時tg的計算,得到一個總旅行時t值,當(dāng)計算點增大時,不會受到線程數(shù)量限制的影響。具體計算流程如圖3。
GPU計算旅行時花費的時間:25.30000s
計算旅行時的GPU算法理論帶寬:
Theoretical Bandwidth=效地對算法進行加速,在累加和算法中采用最優(yōu)化方法時GPU是CPU的14倍左右。
(2)結(jié)合GPU的硬件特點對大數(shù)據(jù)量的并行計算是非常有效的。當(dāng)計算的數(shù)據(jù)量較小時,GPU算法中,啟動的線程計算量不滿載,大部分時間花在了系統(tǒng)調(diào)度開銷上,GPU并行計算的優(yōu)勢沒有展現(xiàn),時間與CPU計算時間差別不明顯;隨著計算的數(shù)據(jù)量增大,每個線程的計算漸漸滿載,時間花在系統(tǒng)調(diào)度的比例降低,GPU并行程度提高,加速比上升。=143.36GB/s (Tesla C2075內(nèi)存時鐘為1120MHz,內(nèi)存接口寬度為512 bit)。
實際帶寬距離理論帶寬還有一定差距,算法中還存在一定的瓶頸。
除此之外,本論文還計算了采樣點=500個,CDP=20個的反射點旅行時,CPU與GPU運行效率對比如表1。
(1)CPU的串行計算是通過多次循環(huán)逐一計算各點旅行時,因此時間為所有循環(huán)結(jié)束后的總時間,而GPU的并行計算時間為計算一點旅行時的時間加上主機與設(shè)備間互相傳遞參數(shù)的時間。當(dāng)計算量小時,CPU與GPU的計算時間差別不大,但隨著計算量的逐漸加大,GPU的并行計算逐漸體現(xiàn)其優(yōu)勢,它可以有