邱浩淼
(汕頭市超聲儀器研究所有限公司,廣東 汕頭515000)
CPU+GPU 異構(gòu)計(jì)算系統(tǒng)是一種新型的計(jì)算系統(tǒng),對傳統(tǒng)計(jì)算機(jī)系統(tǒng)進(jìn)行了設(shè)計(jì)與改善,計(jì)算任務(wù)由加速部件GPU 與CPU 共同完成。這種異構(gòu)方式具有顯著的運(yùn)用優(yōu)勢,增強(qiáng)了GPU 的運(yùn)算能力,例如對追求浮點(diǎn)運(yùn)算性能的結(jié)構(gòu)中具有非常遠(yuǎn)超CPU 浮點(diǎn)運(yùn)算能力的GPU。同時(shí)GPU 在具有傳統(tǒng)圖像處理能力的同時(shí)也具有一定的計(jì)算能力。隨著目前技術(shù)的的不斷發(fā)展,GPU 運(yùn)用過程中在、編程模型、如硬件結(jié)構(gòu)等層面上存在則問題也得到了不同程度的改善。隨著目前計(jì)算機(jī)系統(tǒng)的逐漸完善,在其功能與擴(kuò)展性等層面上也出現(xiàn)了一些問題,GPU 加速部件的運(yùn)用能夠?qū)Υ擞行Ы鉀Q[1]。
圖1 GPU 計(jì)算模型
CPU+GPU 異構(gòu)計(jì)算在目前多項(xiàng)領(lǐng)域中均得到快速發(fā)展,但是由于技術(shù)以及實(shí)際運(yùn)用等多種層面的制約,在具體的計(jì)算過程中依然存在著一些不足之處。程序開發(fā)難度較大。 GPU的設(shè)計(jì)初衷是處于圖形,因此將其進(jìn)行通用計(jì)算層面上存在一定的限制,硬件建設(shè)性不足,重點(diǎn)表現(xiàn)為雙精度性能有限,數(shù)據(jù)校驗(yàn)機(jī)制建設(shè)不足,數(shù)據(jù)傳輸有限。目前國內(nèi)在GPU 軟件開發(fā)編程模型與方式依然發(fā)展不夠成熟,設(shè)備架構(gòu)(CUDA)技術(shù)的開發(fā)具有重要意義,但是在運(yùn)用過程中需要考慮到CPU 模式中長久存在的X86 編程習(xí)慣。目前針對異構(gòu)計(jì)算中標(biāo)準(zhǔn)開放計(jì)算語言(OpenCL)的運(yùn)用時(shí)間較短,尚沒有形成統(tǒng)一開放的運(yùn)用體系[2]。
這一開發(fā)方式運(yùn)用較早,在目前CPU+GPU 異構(gòu)計(jì)算方式中依然適用,運(yùn)用過程中要求對GPU 硬件底層圖形API 做到靈活運(yùn)用,將其中的程序與圖形處理進(jìn)行一一對應(yīng)。在編程處理過程中一般采用開發(fā)圖形庫著色語言(GLSL)等方式。GPU 產(chǎn)品在早期開發(fā)過程中包括頂點(diǎn)處理、片段處理等圖形渲染過程,GPU 可編程能力較為有限。目前已經(jīng)出現(xiàn)并運(yùn)用了素級可編程性,在一般代數(shù)問題的求解過程中可以采用像素程序解決,能夠?qū)τ邢薏罘址匠探M求解(PDEs)進(jìn)行有效解決。底層圖形API的運(yùn)用為程序員進(jìn)行技術(shù)處理與解決提供了新的方式與途徑。目前主要采用DirectX、OpenGL 的開發(fā)圖形語言[3]。
圖2 CPU 指令執(zhí)行流程
CUDA 的運(yùn)用有效彌補(bǔ)了傳統(tǒng)方式中需要圖形API 來實(shí)現(xiàn)GPU 的訪問的不足,是一種能夠直接訪問硬件的軟硬件體系,建立的圖形處理器(GPGPU),能夠進(jìn)行通用目的的計(jì)算,是C語言中的編程語言,開發(fā)了大量高性能的開發(fā)語言。能夠在實(shí)現(xiàn)GPU 計(jì)算能力的同時(shí)建立一種密集數(shù)據(jù)計(jì)算方式。OpenCL能夠運(yùn)用在Cell 類型架構(gòu)、GPU、CPU、DSP 等并行處理器之中,是一種基于通用計(jì)算方式開發(fā)的運(yùn)用體系。能夠編程GPU、CPU及其他其他分離的計(jì)算設(shè)備組成的異構(gòu)群。OpenCL 運(yùn)用過程中可以不把算法映射到底層圖形API 之中,在開發(fā)過程中同時(shí)包含了API 庫、開發(fā)語言以運(yùn)行系統(tǒng)。
CUDA 快速傅里葉變換(CUFFT)運(yùn)用中設(shè)計(jì)了與標(biāo)準(zhǔn)C 語言程序庫(FFTW)相近的接口,通過GPU 建立了一個(gè)函數(shù)庫,能夠?qū)崿F(xiàn)傅里葉變換。對FFTW 操作方式中數(shù)據(jù)存儲(chǔ)內(nèi)存之中進(jìn)行了有效互補(bǔ),CUDA 離散傅里葉變換(CUFFT)在存儲(chǔ)方式中具有顯存特征,在數(shù)據(jù)交換中要求在內(nèi)存與顯存之間進(jìn)行交換。CUDA 線性代數(shù)基礎(chǔ)子程序庫(CUBLAS)運(yùn)用中能夠進(jìn)行簡單的矩陣計(jì)算,具有和BLAST 差不多的接口,屬于基本的矩陣與向量的運(yùn)算庫。運(yùn)用中可以將其運(yùn)用到線性代數(shù)程序包(LAPACK)等復(fù)雜函數(shù)包之中。CUBLAS 也為顯存的存儲(chǔ)方式,要求完成封裝之后才能替代線性代數(shù)子程序(BLAST)函數(shù)。
可以采用高層次抽象編譯器的處理方式,運(yùn)用復(fù)雜的代碼分析技術(shù)、指示語句、語言運(yùn)行時(shí)系統(tǒng)、算法模板等自動(dòng)生成GPU 內(nèi)核程序。例如PGI x86+GPU 編譯器,設(shè)計(jì)了一種新指示語句(PRAGMAS),目前得到了一定運(yùn)用。
目前很多開發(fā)者是從底層圖形API 方法程序逐漸開發(fā)設(shè)計(jì)而言,在遺留代碼的處理過程中依然可以運(yùn)用底層圖形API 處理方法,可以不用太大修改原來的運(yùn)用程序。但是在具體的運(yùn)用過程中存在著一些局限性。在運(yùn)用過程中要求程序員編寫構(gòu)造圖形素元,并分配紋理存儲(chǔ)。因此要求程序員在開發(fā)設(shè)計(jì)過程中詳細(xì)掌握GPU 硬件特點(diǎn)、限制因素以及圖形API 的運(yùn)用方式。同時(shí)在設(shè)計(jì)算法的表達(dá)上可以采用三角形、紋理等方式。這種方式在推行過程中在GPU 產(chǎn)品運(yùn)行代碼執(zhí)行效率難以達(dá)到理想效果,與新程序相比運(yùn)用優(yōu)勢不明顯。
針對這一方式,在處理過程中可以采用OpenCL、CUDA 等較低層次的編程工具,此時(shí)只有少量程序段會(huì)影響性能,只需將這些代碼自己編寫即可。運(yùn)用過程中為了獲得良好的效果,要求積極優(yōu)化GPU 具體數(shù)據(jù)結(jié)構(gòu),但是對開發(fā)者提出了較高的要求,要求其掌握一門新的編程語言。
執(zhí)行標(biāo)準(zhǔn)函數(shù)應(yīng)用程序運(yùn)用過程中,為了提升了其運(yùn)行效率,可以采用GPU 加速版本的標(biāo)準(zhǔn)函數(shù)庫的處理方式,運(yùn)行中要求降低GPU 和主機(jī)之間的通訊。但是在實(shí)際運(yùn)用中,函數(shù)庫的靈活性較為有限,有可能出現(xiàn)多余的存儲(chǔ)器訪問。
針對需要專業(yè)領(lǐng)域算法應(yīng)用程序,開發(fā)者難以自己編寫程序,而標(biāo)準(zhǔn)函數(shù)庫中又難以找到對應(yīng)程序的情況,可以采用編譯器來解決。這一方式目前運(yùn)用時(shí)間較短,存在著一定的局限性。Portland Group 運(yùn)用中難以在嵌套循環(huán)結(jié)構(gòu)與底層流處理器之間建立良好的映射關(guān)系,需要用戶自己做較大量的工作,內(nèi)核程序并行化復(fù)雜度,沒有得到很好地隱藏。
CPU+GPU 異構(gòu)計(jì)算模式在目前計(jì)算機(jī)領(lǐng)域中運(yùn)用較為廣泛,在程序開發(fā)方面存在著一定的局限性,目前GPU 產(chǎn)品的硬件架構(gòu)設(shè)計(jì)中正在積極向著程序設(shè)計(jì)層面演變,工業(yè)界與學(xué)術(shù)界目前正在對此積極研發(fā),CPU+GPU 的異構(gòu)計(jì)算系統(tǒng)設(shè)計(jì)正在逐步完善。