寧成明,蔡恒雨,鄭啟龍,2,耿 銳
1(中國科學(xué)技術(shù)大學(xué) 計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院,合肥 230026)2(中國科學(xué)技術(shù)大學(xué) 高性能計(jì)算安徽省重點(diǎn)實(shí)驗(yàn)室,合肥 230026)3(安徽芯紀(jì)元科技有限公司,合肥 230088)
隨著信息化的發(fā)展,CPU在處理海量數(shù)據(jù)時遇到越來越多的性能瓶頸,而且由于多核心處理器的結(jié)構(gòu)復(fù)雜,功耗過高使得僅僅增加CPU的核心數(shù)無法解決CPU所面臨的性能瓶頸[1].在這樣的背景下,通過使用CPU與多種計(jì)算設(shè)備互聯(lián)組成的異構(gòu)計(jì)算系統(tǒng)加速計(jì)算任務(wù)已經(jīng)成為并行計(jì)算領(lǐng)域的研究熱點(diǎn)之一.
HXDSP系列處理器是由中國電子科技集團(tuán)公司第三十八所在單核BWDSP100處理器基礎(chǔ)上自主研制的雙核DSP處理器.每個處理器核都采用分簇架構(gòu),最大工作頻率為500Mhz,能達(dá)到30GOPS和8GFMACS的運(yùn)算能力,可以滿足多種高性能計(jì)算領(lǐng)域的需求.設(shè)計(jì)面向HXDSP的異構(gòu)計(jì)算框架能夠充分利用HXDSP的優(yōu)勢,發(fā)揮HXDSP的高效計(jì)算能力,提高異構(gòu)系統(tǒng)的處理性能.尤其是在信號處理[2],深度學(xué)習(xí)[3],數(shù)據(jù)分析[4]等應(yīng)用領(lǐng)域,大量的數(shù)據(jù)和密集的計(jì)算迫切需要異構(gòu)加速.因此設(shè)計(jì)面向HXDSP的異構(gòu)計(jì)算框架具有重要的學(xué)術(shù)價值和實(shí)用價值.
目前,國際上針對不同的異構(gòu)系統(tǒng)提出了許多異構(gòu)并行編程模型,主要有CUDA[5],OpenCL[6],C++AMP[7],OpenACC[8]等,其中CUDA和OpenCL應(yīng)用最為廣泛.雖然CUDA和OpenCL的目標(biāo)都是通用并行計(jì)算,但是也存在著明顯的差異.首先,在通用性方面,CUDA由NVIDIA提出并且只能運(yùn)行在NVIDIA的GPU上,對于其它廠商的計(jì)算設(shè)備無法適用.OpenCL是由Khronos Group提出的一個跨平臺的異構(gòu)計(jì)算的工業(yè)標(biāo)準(zhǔn),是一個面向異構(gòu)系統(tǒng)的開放的,通用的標(biāo)準(zhǔn).OpenCL通過將硬件平臺層以及存儲器模型進(jìn)行抽象,在軟件層面彌補(bǔ)了不同平臺設(shè)備間的差異,從而使得OpenCL可以支持所有異構(gòu)系統(tǒng).其次,在易用性方面,由于CUDA有一套完整的工具鏈以及豐富的庫的支持,使得CUDA在開發(fā)使用方面更加方便.然而,OpenCL為了支持不同類型的計(jì)算設(shè)備暴露了過多的底層硬件細(xì)節(jié),增加了編程人員的負(fù)擔(dān).最后,在性能方面,OpenCL和CUDA各有優(yōu)點(diǎn),CUDA在數(shù)據(jù)并行方面占有優(yōu)勢,而OpenCL在任務(wù)并行方面的優(yōu)勢是CUDA所沒有的.為了充分發(fā)揮多HXDSP設(shè)備的計(jì)算優(yōu)勢,減少平臺軟件移植的開銷,本文選擇OpenCL編程標(biāo)準(zhǔn)設(shè)計(jì)完成HXDSP的異構(gòu)計(jì)算框架.
在越來越多的廠商和設(shè)備支持OpenCL的同時,學(xué)術(shù)界也展開了對OpenCL的研究和應(yīng)用.Singhal V在使用異構(gòu)計(jì)算平臺進(jìn)行實(shí)時數(shù)據(jù)分析實(shí)驗(yàn)中對比OpenCL,pthread,OpenMP[9]和MPI[10]編程模型發(fā)現(xiàn)跨平臺的OpenCL是異構(gòu)計(jì)算環(huán)境的正確選擇[11].Tu C H使用OpenCL加速Linux操作系統(tǒng)內(nèi)核[12].Nozal R基于OpenCL設(shè)計(jì)了新的異構(gòu)并行編程語言,簡化異構(gòu)系統(tǒng)編程[13].在應(yīng)用OpenCL進(jìn)行異構(gòu)計(jì)算框架設(shè)計(jì)方面,國內(nèi)外學(xué)者也做出了大量貢獻(xiàn).坦佩雷大學(xué)提出的pocl(Portable Computing Language)是OpenCL的一個開源實(shí)現(xiàn),目前可以支持CPU,GPU等設(shè)備[14].首爾大學(xué)基于OpenCL提出了針對CPU/GPU異構(gòu)集群的編程框架[15].國內(nèi)相關(guān)工作包括基于OpenCL設(shè)計(jì)的面向神威太湖之光異構(gòu)眾核加速器的異構(gòu)計(jì)算系統(tǒng),提高了國產(chǎn)異構(gòu)眾核加速器的使用效率[16]以及為支持OpenCL設(shè)計(jì)的異構(gòu)多核SoC平臺[17]等.
本文采用OpenCL計(jì)算標(biāo)準(zhǔn)設(shè)計(jì)并實(shí)現(xiàn)面向HXDSP異構(gòu)平臺的計(jì)算框架,主要工作包括:1)設(shè)計(jì)并實(shí)現(xiàn)基于OpenCL的HXDSP異構(gòu)計(jì)算框架;2)針對HXDSP異構(gòu)系統(tǒng)的OpenCL應(yīng)用程序進(jìn)行性能優(yōu)化.
2.1.1 CPU/HXDSP異構(gòu)系統(tǒng)
CPU/HXDSP異構(gòu)系統(tǒng)如圖1所示,該異構(gòu)系統(tǒng)中包含一個CPU和一個HXDSP板塊,板卡上包含4個HXDSP設(shè)備,CPU與HXDSP以及HXDSP與HXDSP之間共享一塊DDR存儲區(qū)域.每個HXDSP中包含兩個核心,每個核心有自己的內(nèi)核數(shù)據(jù)存儲空間.為了使兩個核心之間的數(shù)據(jù)交互更加方便,HXDSP采用NUMA的方式來實(shí)現(xiàn)兩個核心內(nèi)核數(shù)據(jù)的互訪,兩個核心數(shù)據(jù)存儲使用統(tǒng)一的地址空間,但是通過DMA訪問對方內(nèi)核數(shù)據(jù)的速度慢于訪問本地內(nèi)核數(shù)據(jù).基于RapidIO協(xié)議實(shí)現(xiàn)的交換芯片提供了HXDSP之間的一種快速交互方式,主要包括HXDSP之間的同步控制以及數(shù)據(jù)傳輸.在使用交換芯片傳輸數(shù)據(jù)時,最快數(shù)據(jù)傳輸速率為4.416Gb/s,并且使用交換芯片可以實(shí)現(xiàn)數(shù)據(jù)通信與數(shù)據(jù)計(jì)算并行的效果[18].
圖1 CPU/HXDSP異構(gòu)系統(tǒng)Fig.1 CPU/HXDSP heterogeneous system
設(shè)計(jì)基于OpenCL的HXDSP異構(gòu)計(jì)算框架首先要確定的是OpenCL異構(gòu)計(jì)算編程框架與CPU/HXDSP異構(gòu)計(jì)算平臺的映射關(guān)系.
2.1.2 OpenCL異構(gòu)并行編程框架
OpenCL異構(gòu)并行編程框架的主要包括OpenCL平臺模型,OpenCL存儲模型和OpenCL執(zhí)行模型,這些模型之間既相互獨(dú)立,又相互聯(lián)系,概括了OpenCL編程框架的核心思想.
平臺模型:平臺模型是OpenCL對一個異構(gòu)系統(tǒng)硬件的抽象描述.OpenCL平臺模型由主機(jī)和OpenCL加速設(shè)備組成,OpenCL加速設(shè)備內(nèi)部可以劃分出多個計(jì)算單元(Compute Units,CU),每個計(jì)算單元內(nèi)又包含多個處理單元(Processing Elements,PE),處理單元是OpenCL設(shè)備上執(zhí)行計(jì)算的最小單元.
執(zhí)行模型:OpenCL加速設(shè)備收到OpenCL內(nèi)核任務(wù)后,根據(jù)主機(jī)端的配置自動生成一個N維的索引空間NDRange,OpenCL設(shè)備按照NDRange的組織形式并發(fā)執(zhí)行.NDrange中每個工作線程稱為工作項(xiàng),多個工作項(xiàng)可以組織成工作組.當(dāng)內(nèi)核執(zhí)行時,每個工作項(xiàng)映射到處理單元執(zhí)行,工作組則對應(yīng)計(jì)算單元.
存儲模型:OpenCL將異構(gòu)系統(tǒng)的存儲抽象成具有5種層次的存儲器模型.主機(jī)內(nèi)存:主機(jī)可以直接使用的存儲區(qū)域.全局存儲器:全局存儲器中的數(shù)據(jù)允許所有設(shè)備的所有工作組以及工作項(xiàng)進(jìn)行讀寫訪問.常量存儲器:常量存儲器是全局存儲器中一塊特殊的區(qū)域,這塊區(qū)域由主機(jī)分配和初始化,對于設(shè)備而言,這塊存儲區(qū)域是只讀的.局部存儲器:局部存儲對工作組是局部可見的,由一個工作組內(nèi)的所有工作項(xiàng)共享.私有存儲器:私有存儲器是工作項(xiàng)私有的,對其他所有工作項(xiàng)不可見.
2.1.3 OpenCL編程框架到CPU/HXDSP異構(gòu)系統(tǒng)的映射
通常并行計(jì)算應(yīng)用程序包括數(shù)據(jù)并行應(yīng)用以及任務(wù)并行應(yīng)用.在數(shù)據(jù)并行應(yīng)用中數(shù)據(jù)并行計(jì)算程度高,單個計(jì)算任務(wù)就能夠充分利用HXDSP板卡上的計(jì)算資源.在任務(wù)并行應(yīng)用中,計(jì)算任務(wù)本身的數(shù)據(jù)并行計(jì)算程度低,但是計(jì)算任務(wù)間并行程度高,此時可以將多個可以并行的計(jì)算任務(wù)同時部署到不同的HXDSP上執(zhí)行.由于在OpenCL命令隊(duì)列順序執(zhí)行的模式下,OpenCL計(jì)算設(shè)備一次只能執(zhí)行一個內(nèi)核任務(wù),為了充分利用HXDSP計(jì)算資源并減少能耗,本文針對不同的應(yīng)用場景設(shè)計(jì)了一種可配置的映射方式.一種適用于數(shù)據(jù)并行執(zhí)行模式,該配置將整個HXDSP板卡作為一個OpenCL設(shè)備,充分利用板卡上的計(jì)算資源做數(shù)據(jù)并行計(jì)算.一種適用于任務(wù)并行執(zhí)行模式,該配置中HXDSP作為計(jì)算設(shè)備,每個HXDSP可以同時執(zhí)行不同的計(jì)算任務(wù).第3種配置將板卡上的HXDSP0和HXDSP1作為一個OpenCL設(shè)備,HXDSP2和HXDSP3作為另一個OpenCL設(shè)備,該配置兼顧了數(shù)據(jù)并行執(zhí)行模式以及任務(wù)并行執(zhí)行模式.
平臺模型到CPU/HXDSP異構(gòu)系統(tǒng)的映射:OpenCL平臺模型中定義了主機(jī),設(shè)備,計(jì)算單元以及處理單元.在3種配置模式中,HXDSP處理器核作為HXDSP中最基本的處理單元對應(yīng)OpenCL處理單元,由兩個處理器核組成HXDSP對應(yīng)OpenCL的計(jì)算單元.3種配置中不同的是OpenCL設(shè)備的映射關(guān)系,在第一種配置中OpenCL設(shè)備映射為HXDSP板卡,該設(shè)備中包含4個計(jì)算單元;在第二種配置中OpenCL設(shè)備映射為HXDSP,每個設(shè)備中僅包含一個計(jì)算單元;在第3種配置中將HXDSP0和HXDSP1作為一個OpenCL設(shè)備,HXDSP2和HXDSP3作為另一個OpenCL設(shè)備,每個OpenCL設(shè)備中包含兩個計(jì)算單元.平臺模型的映射方式如圖2所示.
圖2 3種配置下的平臺模型映射方式Fig.2 Platform model mapping methods under three configurations
執(zhí)行模型到CPU/HXDSP異構(gòu)系統(tǒng)的映射:在OpenCL執(zhí)行模型中定義了工作組和工作項(xiàng),工作組執(zhí)行在計(jì)算單元上,工作項(xiàng)執(zhí)行在處理單元上.在3種配置中,每個工作組映射到一個HXDSP上執(zhí)行,每個工作項(xiàng)映射到HXDSP中的處理器核上執(zhí)行,區(qū)別在于,當(dāng)OpenCL設(shè)備包含多個計(jì)算單元時,內(nèi)核任務(wù)可以包含多個工作組在多個計(jì)算單元即HXDSP上執(zhí)行.當(dāng)OpenCL設(shè)備僅包含一個計(jì)算單元時,每個內(nèi)核任務(wù)只能包含一個工作組在一個設(shè)備即HXDSP上執(zhí)行.工作項(xiàng)ID與處理核的映射關(guān)系如表1所示.
表1 工作項(xiàng)ID與處理核的映射關(guān)系
Table 1 Mapping relationship between work item ID and processing core
HXDSPID處理器核配置1全局ID局部ID配置2全局ID局部ID配置3全局ID局部ID0Core0000000Core11111111Core0200020Core13111312Core0400000Core15111113Core0600020Core1711131
存儲模型到CPU/HXDSP異構(gòu)系統(tǒng)的映射:在CPU/HXDSP異構(gòu)平臺下,本文將共享存儲的一部分存儲空間作為主機(jī)內(nèi)存,將共享存儲中剩下的存儲空間作為全局存儲器提供給HXDSP平臺使用.按照HXDSP內(nèi)核數(shù)據(jù)的訪問方式,本文將私有存儲器映射到每個核心的內(nèi)核數(shù)據(jù)存儲空間,同時由于每個核內(nèi)的數(shù)據(jù)存儲空間也能夠通過DMA的方式被另一個核所訪問,故也將內(nèi)核數(shù)據(jù)存儲空間作為局部存儲器供兩個處理單元訪問.存儲模型的映射在3種配置模式中是一致的.
根據(jù)OpenCL到CPU/HXDSP異構(gòu)系統(tǒng)的映射關(guān)系,本文設(shè)計(jì)的CPU/HXDSP異構(gòu)系統(tǒng)運(yùn)行時內(nèi)存布局示意圖如圖3所示.
圖3 CPU/HXDSP異構(gòu)系統(tǒng)運(yùn)行時內(nèi)存布局Fig.3 CPU/HXDSP heterogeneous system runtime memory layout
本文將共享存儲分為兩部分,一部分作為CPU內(nèi)存用來保存OpenCL應(yīng)用程序數(shù)據(jù),剩下的一部分作為HXDSP平臺的全局存儲用來保存OpenCL內(nèi)核程序執(zhí)行相關(guān)數(shù)據(jù).HXDSP執(zhí)行內(nèi)核任務(wù)所需要的內(nèi)核程序以及內(nèi)核程序參數(shù)數(shù)據(jù)均需要從主機(jī)內(nèi)存拷貝到全局存儲中,然后才能被HXDSP訪問.
2.1.4 CPU/HXDSP異構(gòu)系統(tǒng)編譯運(yùn)行時設(shè)計(jì)
本文根據(jù)OpenCL異構(gòu)并行編程框架到CPU/HXDSP異構(gòu)平臺的映射關(guān)系設(shè)計(jì)CPU/HXDSP異構(gòu)系統(tǒng)編譯運(yùn)行時框架如圖4所示.
圖4 CPU/HXDSP異構(gòu)系統(tǒng)編譯運(yùn)行時框架Fig.4 CPU/HXDSP heterogeneous system compilation runtime framework
異構(gòu)系統(tǒng)編譯環(huán)境包括OpenCL主機(jī)端編譯環(huán)境和OpenCL內(nèi)核程序編譯環(huán)境.OpenCL主機(jī)端編譯環(huán)境使用C編譯器編譯OpenCL應(yīng)用程序生成CPU上可執(zhí)行文件.OpenCL內(nèi)核程序編譯環(huán)境使用基于LLVM的HXDSP編譯器編譯內(nèi)核程序生成HXDSP上的可執(zhí)行程序.OpenCL主機(jī)端程序通過HXDSP設(shè)備驅(qū)動層調(diào)用HXDSP編譯程序在線編譯內(nèi)核程序.
CPU/HXDSP異構(gòu)系統(tǒng)運(yùn)行時分為主機(jī)端運(yùn)行時和設(shè)備端運(yùn)行時.主機(jī)端運(yùn)行時執(zhí)行在CPU上,包括OpenCL應(yīng)用層和HXDSP設(shè)備驅(qū)動層.設(shè)備端運(yùn)行時執(zhí)行在HXDSP上.OpenCL應(yīng)用層負(fù)責(zé)創(chuàng)建并調(diào)度內(nèi)核任務(wù),HXDSP設(shè)備驅(qū)動層為主機(jī)訪問全局存儲以及主機(jī)與HXDSP之間的通信提供服務(wù),HXDSP設(shè)備運(yùn)行時主要負(fù)責(zé)加載內(nèi)核任務(wù)并執(zhí)行.
OpenCL應(yīng)用層由OpenCL語義規(guī)范定義,本部分的重點(diǎn)在于HXDSP設(shè)備驅(qū)動層的設(shè)計(jì)以及HXDSP設(shè)備端運(yùn)行時的設(shè)計(jì).
HXDSP設(shè)備驅(qū)動層主要為OpenCL應(yīng)用層提供服務(wù).包括主機(jī)對全局存儲的使用,主機(jī)與HXDSP設(shè)備之間的通信等服務(wù).相關(guān)的主要接口定義如下:
void* share_alloc(size_t size):在全局存儲中申請size大小的空間,并返回共享存儲物理地址.
void share_free(void* share_ptr,size_t size):釋放全局存儲空間.
void share_write(void* share_ptr,void* host_ptr,size_t size):主機(jī)將數(shù)據(jù)寫到全局存儲.
void share_read(void* share_ptr,void* host_ptr,size_t size):主機(jī)從全局存儲讀取數(shù)據(jù).
void compile(int target,char*src):編譯內(nèi)核程序.
void wait_event(event e):主機(jī)等待事件完成.
void submit(queue cq,command* node):主機(jī)向設(shè)備提交命令.
OpenCL應(yīng)用層與HXDSP設(shè)備驅(qū)動的主要調(diào)用關(guān)系如圖5所示.
圖5 OpenCL應(yīng)用層與HXDSP設(shè)備驅(qū)動層調(diào)用關(guān)系Fig.5 Calling relationship between OpenCL application layer and HXDSP device driver layer
HXDSP設(shè)備端運(yùn)行的程序包括兩部分,一部分為HXDSP設(shè)備端運(yùn)行時程序,一部分為OpenCL內(nèi)核程序.HXDSP設(shè)備端運(yùn)行時主要負(fù)責(zé)對命令隊(duì)列中的命令解析以及創(chuàng)建內(nèi)核任務(wù)執(zhí)行環(huán)境,OpenCL內(nèi)核程序則負(fù)責(zé)具體任務(wù)的執(zhí)行.
當(dāng)OpenCL設(shè)備包含多個計(jì)算單元時,首先選擇其中一個計(jì)算單元中的一個處理器核作為Master負(fù)責(zé)控制OpenCL設(shè)備中的其它計(jì)算單元即HXDSP并與CPU進(jìn)行通信.當(dāng)CPU提交任務(wù)到命令隊(duì)列中后,CPU通知Master任務(wù)到達(dá),Master對命令進(jìn)行解析,然后根據(jù)解析后得到的內(nèi)核任務(wù)執(zhí)行配置信息通過交換芯片的send()接口根據(jù)HXDSP ID將解析后的數(shù)據(jù)發(fā)送給相關(guān)的HXDSP,接著HXDSP便開始創(chuàng)建內(nèi)核任務(wù)執(zhí)行環(huán)境及執(zhí)行內(nèi)核任務(wù),并調(diào)用wait()接口等待其它HXDSP同步信號.當(dāng)HXDSP上內(nèi)核任務(wù)執(zhí)行完成后,HXDSP通過signal()接口向Master發(fā)送同步信號告知HXDSP上的內(nèi)核任務(wù)完成,由于此時的HXDSP可能只是完成了整個內(nèi)核任務(wù)的一部分,所以Master需要驗(yàn)證整個內(nèi)核任務(wù)的完成狀態(tài),在驗(yàn)證之后通知CPU或是從命令隊(duì)列中選擇下一個命令.
當(dāng)OpenCL設(shè)備中僅包含一個計(jì)算單元時,此時HXDSP作為OpenCL設(shè)備單獨(dú)與CPU進(jìn)行通信,各個HXDSP從各自的命令隊(duì)列中讀取命令,創(chuàng)建內(nèi)核執(zhí)行環(huán)境并執(zhí)行內(nèi)核程序.
圖6 內(nèi)核程序加載與執(zhí)行示意圖Fig.6 Kernel program loading and execution diagram
創(chuàng)建內(nèi)核執(zhí)行環(huán)境包括準(zhǔn)備內(nèi)核參數(shù)以及加載內(nèi)核程序.準(zhǔn)備內(nèi)核參數(shù)指的是根據(jù)HXDSP應(yīng)用程序二進(jìn)制接口將全局存儲器中內(nèi)核參數(shù)地址與內(nèi)核程序?qū)?yīng)的參數(shù)寄存器相關(guān)聯(lián).加載內(nèi)核程序時,為了支持OpenCL內(nèi)核程序的動態(tài)加載,本文將HXDSP的片內(nèi)共享程序存儲空間分為兩部分,一部分用來加載HXDSP設(shè)備端運(yùn)行時程序,一部分用來加載OpenCL內(nèi)核程序.在OpenCL內(nèi)核程序執(zhí)行前由HXDSP設(shè)備端運(yùn)行時程序?qū)penCL內(nèi)核程序從全局存儲器中拷貝到OpenCL內(nèi)核程序的存儲空間,接著HXDSP設(shè)備端運(yùn)行時程序跳轉(zhuǎn)到OpenCL內(nèi)核程序執(zhí)行內(nèi)核任務(wù).內(nèi)核程序加載方式如圖6所示.
在HXDSP異構(gòu)計(jì)算平臺下數(shù)據(jù)傳輸包含兩個部分,一部分指的是主機(jī)與全局存儲器之間的數(shù)據(jù)傳輸,一部分指的是在多任務(wù)執(zhí)行模式下HXDSP之間的數(shù)據(jù)傳輸.對于主機(jī)與全局存儲之間的數(shù)據(jù)傳輸,本文設(shè)計(jì)并實(shí)現(xiàn)了共享虛擬存儲器功能.對于HXDSP設(shè)備之間的數(shù)據(jù)傳輸,本文設(shè)計(jì)并實(shí)現(xiàn)了針對HXDSP平臺的通道功能.
3.1.1 共享虛擬存儲器
在OpenCL1.2標(biāo)準(zhǔn)中,主機(jī)無法訪問設(shè)備端的指針指向的數(shù)據(jù),OpenCL內(nèi)核程序也無法訪問主機(jī)端指針指向的數(shù)據(jù).OpenCL2.0標(biāo)準(zhǔn)使用共享虛擬存儲器解決了主機(jī)與設(shè)備間關(guān)于指針類型數(shù)據(jù)訪問的問題.同時,由于主機(jī)和設(shè)備可以直接使用共享指針,不需要在主機(jī)和設(shè)備間進(jìn)行數(shù)據(jù)拷貝,從而減少了主機(jī)與全局存儲器之間的數(shù)據(jù)傳輸?shù)臅r間.
指針數(shù)據(jù)的共享關(guān)鍵在于保證指針數(shù)據(jù)在主機(jī)地址空間和HXDSP地址空間的地址一致性.共享虛擬存儲器內(nèi)存布局如圖7所示.本文將全局存儲器的一部分存儲空間作為SVM緩沖區(qū),同時在主機(jī)端開辟一段虛擬地址空間用來映射SVM緩沖區(qū).由于HXDSP采用的是實(shí)地址訪問方式,所以只需保證SVM緩沖區(qū)的物理地址與主機(jī)端的虛擬地址的一致即可.配置過程如下:
1.配置SVM緩沖區(qū)的起始物理地址svm_addr以及SVM緩沖區(qū)的大小svm_size.其中svm_addr大于0x80000000,因?yàn)镈DR被映射到了HXDSP的0x80000000以上的地址空間中.
2.在主機(jī)進(jìn)程地址空間中創(chuàng)建.svm段映射SVM緩沖區(qū),并且配置.svm段的起始地址的大小分別為svm_addr和svm_size.
在使用時通過OpenCL定義的規(guī)范接口svmAlloc()函數(shù)檢查獲取空閑的SVM緩沖區(qū)并將其分配給主機(jī)進(jìn)程使用.
通過這種方式不僅解決了主機(jī)與設(shè)備間關(guān)于指針類型數(shù)據(jù)訪問的問題,而且主機(jī)可以直接將數(shù)據(jù)寫到全局存儲器中減少了數(shù)據(jù)在主機(jī)內(nèi)存與全局存儲器之間的拷貝時間.
圖7 共享虛擬存儲器內(nèi)存布局Fig.7 Shared virtual storage memory layout
3.1.2 通道
通道的作用在于提高不同內(nèi)核任務(wù)之間的通信效率,在任務(wù)并行執(zhí)行模式下,內(nèi)核任務(wù)執(zhí)行在各個HXDSP上,內(nèi)核任務(wù)間的通信等價為不同的HXDSP之間的通信.本文設(shè)計(jì)基于交換芯片的通道功能實(shí)現(xiàn)在不同的HXDSP之間的快速通信.
首先為了避免通道數(shù)據(jù)與其他程序數(shù)據(jù)的沖突,需要在每個HXDSP的內(nèi)存空間中申請固定的通道緩沖區(qū)用來保存通道數(shù)據(jù).由于HXDSP平臺上包含4個HXDSP設(shè)備,所以在每個HXDSP內(nèi)存中需要創(chuàng)建3個通道緩沖區(qū)用來保存來自其它3個HXDSP的通道數(shù)據(jù).內(nèi)核程序在計(jì)算完成后將計(jì)算的結(jié)果通過write_channel()函數(shù)根據(jù)HXDSP ID發(fā)送到指定HXDSP中的通道緩沖區(qū)中.接受方通過read_channel()函數(shù)根據(jù)發(fā)送方HXDSP ID從通道緩沖區(qū)中獲取通道數(shù)據(jù).write_channel()函數(shù)基于交換芯片提供的發(fā)送數(shù)據(jù)功能實(shí)現(xiàn),最高的數(shù)據(jù)發(fā)送速率為4.416Gb/s.
本文設(shè)計(jì)的通道的優(yōu)點(diǎn)在于需要進(jìn)行數(shù)據(jù)通信的HXDSP設(shè)備無需依賴共享存儲采用讀寫拷貝的方式進(jìn)行數(shù)據(jù)通信,可以使用通道進(jìn)行HXDSP內(nèi)存到HXDSP內(nèi)存的數(shù)據(jù)傳輸,從而減少了OpenCL內(nèi)核任務(wù)間數(shù)據(jù)通信的代價.由于發(fā)送方在發(fā)送數(shù)據(jù)時不需要接受方阻塞接受,對于接受方而言,可以達(dá)到數(shù)據(jù)預(yù)取,數(shù)據(jù)接收與任務(wù)計(jì)算并行的效果.
數(shù)據(jù)訪問優(yōu)化指對DDR全局存儲器訪問優(yōu)化.通常HXDSP訪問片內(nèi)存儲只需要1~2個時鐘周期,而訪問全局存儲器DDR可能需要幾十甚至上百個周期,并且HXDSP內(nèi)部沒有數(shù)據(jù)緩存,因此如果內(nèi)核任務(wù)頻繁訪問全局存儲器會嚴(yán)重影響到程序的性能.為了優(yōu)化HXDSP對全局存儲器的訪問,可以在內(nèi)核任務(wù)執(zhí)行前先將內(nèi)核的參數(shù)數(shù)據(jù)從全局存儲器拷貝到局部存儲器即HXDSP的片內(nèi)存儲,然后再執(zhí)行內(nèi)核任務(wù).內(nèi)核任務(wù)計(jì)算完成后將計(jì)算結(jié)果拷貝到全局存儲器中,從而減少內(nèi)核任務(wù)對全局存儲器的訪問次數(shù).
實(shí)驗(yàn)過程主要是對HXDSP異構(gòu)計(jì)算框架性能進(jìn)行分析.實(shí)驗(yàn)環(huán)境為Intel Core i5-2400 CPU @ 3.10Hz × 4,HXDSP虛擬平臺和BWDSP模擬器.HXDSP虛擬平臺是對CPU/HXDSP異構(gòu)系統(tǒng)的軟件模擬,在該虛擬平臺中模擬實(shí)現(xiàn)了4個HXDSP,并且通過RapidIO協(xié)議實(shí)現(xiàn)了HXDSP之間的快速通信.BWDSP模擬器是對HXDSP執(zhí)行核心的軟件模擬,BWDSP模擬器能夠在Linux系統(tǒng)環(huán)境下模擬執(zhí)行HXDSP端可執(zhí)行代碼.實(shí)驗(yàn)在HXDSP虛擬平臺上對本文設(shè)計(jì)的HXDSP異構(gòu)計(jì)算框架進(jìn)行評估分析.由于BWDSP的模擬器只能模擬使用片內(nèi)存儲,無法提供對片外存儲DDR的訪問,本章實(shí)驗(yàn)參照BWDSP對DDR的配置,以DDR的訪存延時[19]分析BWDSP模擬器對DDR訪問時間.DDR的訪存延時參照公式(1)和公式(2)進(jìn)行估算,公式(1)為讀訪存延遲,公式(2)為寫訪存延時.
latency_read=tRP+tRCD+tCL+tBURST
(1)
latency_write=tRP+tRCD+tBURST+tWR
(2)
其中tRP為Bank為下一次行激活準(zhǔn)備進(jìn)行的預(yù)充電時間,tRCD為行激活到列獲取命令發(fā)送延遲,tBURST為數(shù)據(jù)在數(shù)據(jù)總線上BURST傳輸時間,tCL為列地址讀操作潛伏期,tWR為寫回延遲.
以DDR3-1333為例,DDR的數(shù)據(jù)位寬為64位,突發(fā)長度BL設(shè)置為8.在BWDSP工作頻率為500MHz的情況下,tRP設(shè)置為7個時鐘周期,tRCD設(shè)置為7個時鐘周期,tCL設(shè)置為7個時鐘周期,tWR設(shè)置為8個時鐘周期,tBURST為突發(fā)傳輸長度的一半即4個時鐘周期,計(jì)算DDR的讀訪存時延結(jié)果為25個時鐘周期,寫訪存時延結(jié)果為26個時鐘周期.
在使用DMA在DDR與片內(nèi)存儲進(jìn)行連續(xù)拷貝時,一次突發(fā)傳輸可以傳輸16個字,只有前兩個字需要DDR讀寫訪存延遲,剩下的每兩個字只有傳輸時延tBURST.由此可以估算采用DMA連續(xù)傳輸時每讀16個字需要53個時鐘周期,每寫16個字需要個54時鐘周期.
本節(jié)實(shí)驗(yàn)以向量加法為例測試HXDSP異構(gòu)計(jì)算框架的基本性能,實(shí)驗(yàn)結(jié)果如表2所示.
本節(jié)實(shí)驗(yàn)在HXDSP異構(gòu)計(jì)算平臺上測試的異構(gòu)計(jì)算程序性能指標(biāo)包括數(shù)據(jù)傳輸時間、內(nèi)核編譯時間、創(chuàng)建執(zhí)行環(huán)境的時間以及內(nèi)核任務(wù)執(zhí)行時間.數(shù)據(jù)傳輸時間指的是主機(jī)將參數(shù)數(shù)據(jù)寫到全局存儲以及從全局存儲中讀取結(jié)果的時間.內(nèi)核編譯時間指的是在主機(jī)端動態(tài)編譯內(nèi)核程序的時間.創(chuàng)建執(zhí)行環(huán)境的時間指的是主機(jī)端配置內(nèi)核任務(wù)執(zhí)行環(huán)境以及設(shè)備端創(chuàng)建內(nèi)核任務(wù)執(zhí)行環(huán)境的時間.內(nèi)核任務(wù)執(zhí)行時間指的是內(nèi)核程序在僅使用一個HXDSP處理器核執(zhí)行的時間.其中內(nèi)核編譯時間及創(chuàng)建執(zhí)行環(huán)境的時間為平均時間.通常使用異構(gòu)計(jì)算并行編程框架一方面會帶來內(nèi)核任務(wù)執(zhí)行效率的提升,另一方面也會帶來一些額外的時間開銷.內(nèi)核任務(wù)執(zhí)行效率的提升主要來自于在異構(gòu)并行編程模型下使用多個處理器核同時執(zhí)行內(nèi)核任務(wù).額外的時間開銷主要包括數(shù)據(jù)傳輸時間,動態(tài)編譯內(nèi)核程序的時間以及創(chuàng)建執(zhí)行環(huán)境的時間.若要使得異構(gòu)并行編程模型下的程序性能高于傳統(tǒng)編程模型下的程序性能,那么內(nèi)核任務(wù)提升的效率必須要大于額外的時間開銷.
表2 基本性能評測實(shí)驗(yàn)
Table 2 Basic performance evaluation experiment
向量長度數(shù)據(jù)傳輸時間內(nèi)核編譯時間創(chuàng)建執(zhí)行環(huán)境的時間內(nèi)核任務(wù)執(zhí)行時間200036us141us224us540us400081us141us224us1080us6000102us141us224us1620us8000129us141us224us2160us
實(shí)驗(yàn)以向量加為例,將向量加內(nèi)核任務(wù)部署在HXDSP板卡上使用4個HXDSP同時執(zhí)行,分析異構(gòu)計(jì)算并行編程模型使用數(shù)據(jù)并行執(zhí)行模式在HXDSP異構(gòu)計(jì)算平臺上運(yùn)行的程序性能.并將異構(gòu)計(jì)算并行程序性能與傳統(tǒng)編程模型下程序在HXDSP上運(yùn)行的程序性能對比,分析程序在兩種不同編程模型下的性能差異,實(shí)驗(yàn)結(jié)果如表3所示.
表3 數(shù)據(jù)并行向量加法實(shí)驗(yàn)
Table 3 Data parallel vector addition experiment
向量長度傳統(tǒng)編程模型異構(gòu)并行編程模型加速比2000763us686us1.1140001511us807us1.8760002260us929us2.4380003008us1027us2.93
實(shí)驗(yàn)使用4個HXDSP八個處理器核并行執(zhí)行內(nèi)核任務(wù),理論上程序性能的提升效率應(yīng)接近8倍.但是從表3的實(shí)驗(yàn)結(jié)果中得知實(shí)驗(yàn)中程序性能的加速比最大只有2.93.原因在于向量加運(yùn)算本身耗時較少,使得內(nèi)核任務(wù)提升的效率與使用異構(gòu)計(jì)算并行編程帶來的時間開銷的比值較小.
實(shí)驗(yàn)2是采用數(shù)據(jù)并行執(zhí)行模式,單個內(nèi)核任務(wù)在HXDSP板卡上的實(shí)驗(yàn).對于內(nèi)核任務(wù)并行程度低,但是多個內(nèi)核任務(wù)間可以并行執(zhí)行時,CPU/HXDSP異構(gòu)計(jì)算平臺依然能夠利用多任務(wù)并性模式充分發(fā)揮平臺的計(jì)算能力.本節(jié)實(shí)驗(yàn)以矩陣乘加為例分析任務(wù)并行執(zhí)行模式下的程序性能,矩陣乘加的計(jì)算公式為RES=A×B+C×D.其中RES,A,B,C,D為5個N×N的矩陣.實(shí)驗(yàn)過程包含3個內(nèi)核任務(wù),兩個矩陣乘內(nèi)核任務(wù)分別計(jì)算A×B和C×D,一個矩陣加內(nèi)核任務(wù)負(fù)責(zé)對兩個矩陣乘的結(jié)果求和,3個內(nèi)核任務(wù)分別運(yùn)行在3個HXDSP上.實(shí)驗(yàn)中兩個矩陣乘的內(nèi)核任務(wù)分別在兩個HXDSP上并行執(zhí)行,并且每個內(nèi)核任務(wù)都采用兩個核心計(jì)算,理論上當(dāng)數(shù)據(jù)量增大,矩陣運(yùn)算成為程序性能瓶頸時加速比應(yīng)接近4,實(shí)驗(yàn)結(jié)果如表4所示.
表4 多任務(wù)并行矩陣乘法實(shí)驗(yàn)
Table 4 Multi-task parallel matrix multiplication experiment
矩陣維度N傳統(tǒng)編程模型異構(gòu)并行編程模型加速比10930us1102us0.84206664us2446us2.723021662us5992us3.624050336us12881us3.90
從實(shí)驗(yàn)結(jié)果可知,隨著數(shù)據(jù)量的不斷增大,加速比不斷增加,實(shí)驗(yàn)結(jié)果最好的加速比為3.90,符合理論預(yù)期的結(jié)果.同時,由于HXDSP異構(gòu)計(jì)算平臺包含4個HXDSP,根據(jù)實(shí)驗(yàn)結(jié)果可以預(yù)測當(dāng)有多個可以并行執(zhí)行的內(nèi)核任務(wù)時,若充分利用4個HXDSP,那么理論上最大的程序性能加速比應(yīng)趨近于8.
本節(jié)實(shí)驗(yàn)在數(shù)據(jù)并行實(shí)驗(yàn)和多任務(wù)并行實(shí)驗(yàn)的基礎(chǔ)上對異構(gòu)計(jì)算平臺程序進(jìn)行數(shù)據(jù)傳輸與數(shù)據(jù)訪問優(yōu)化.
在對數(shù)據(jù)并行實(shí)驗(yàn)進(jìn)行優(yōu)化時,首先在主機(jī)端使用共享虛擬存儲器減少主機(jī)與全局存儲器之間數(shù)據(jù)傳輸?shù)倪^程,然后在HXDSP板卡執(zhí)行內(nèi)核任務(wù)計(jì)算之前由每個HXDSP使用兩個處理器核并行地將兩個參數(shù)數(shù)據(jù)從全局存儲器中拷貝到局部存儲器即HXDSP片內(nèi)存儲,之后再執(zhí)行內(nèi)核任務(wù),減少內(nèi)核任務(wù)對全局存儲器的訪問次數(shù),實(shí)驗(yàn)結(jié)果如表5、表6所示.
表5 向量加實(shí)驗(yàn)優(yōu)化結(jié)果
Table 5 Vector add experimental optimization results
數(shù)據(jù)量優(yōu)化前優(yōu)化后加速比2000686us638us1.084000807us702us1.156000929us792us1.1780001027us851us1.21
表6 向量加數(shù)據(jù)傳輸與數(shù)據(jù)訪問優(yōu)化時間
Table 6 Vector add data transmission and data optimization time
數(shù)據(jù)量數(shù)據(jù)傳輸優(yōu)化的時間數(shù)據(jù)訪問優(yōu)化的時間數(shù)據(jù)拷貝消耗的時間200036us25us13us400081us50us27us6000102us75us40us8000129us100us53us
多任務(wù)并行實(shí)驗(yàn)使用了3個HXDSP執(zhí)行3個內(nèi)核任務(wù)包括兩個矩陣乘內(nèi)核任務(wù)和一個矩陣加內(nèi)核任務(wù),兩個矩陣乘內(nèi)核任務(wù)并行執(zhí)行.在對實(shí)驗(yàn)3進(jìn)行優(yōu)化時,針對矩陣乘內(nèi)核任務(wù),首先將內(nèi)核任務(wù)所需的兩個參數(shù)由HXDSP的兩個處理器核并行地從全局存儲拷貝到局部存儲,然后再執(zhí)行矩陣乘計(jì)算,最后將計(jì)算結(jié)果以通道的方式發(fā)送到矩陣加內(nèi)核任務(wù)所在HXDSP設(shè)備的通道數(shù)據(jù)緩沖區(qū).對于矩陣加內(nèi)核任務(wù)首先從管道中讀取數(shù)據(jù),然后執(zhí)行計(jì)算任務(wù),最后將計(jì)算結(jié)果拷貝到全局存儲器中.同樣地,本次實(shí)驗(yàn)在主機(jī)端使用共享虛擬存儲器減少主機(jī)與全局存儲器之間的數(shù)據(jù)拷貝時間,實(shí)驗(yàn)結(jié)果如表7、表8所示.
表7 矩陣乘實(shí)驗(yàn)優(yōu)化結(jié)果
Table 7 Matrix multiplication experiment optimization results
矩陣維度N優(yōu)化前優(yōu)化后加速比101102us977us1.13202446us1586us1.54305992us3181us1.884012881us6280us2.05
表8 矩陣乘數(shù)據(jù)傳輸與數(shù)據(jù)訪問優(yōu)化時間
Table 8 Matrix multiplication data transmission and data optimization time
矩陣維度數(shù)據(jù)傳輸優(yōu)化的時間SVM管道數(shù)據(jù)訪問優(yōu)化的時間數(shù)據(jù)拷貝消耗的時間1020us1us108us2us2030us1us838us4us3035us5us2795us12us4050us8us6585us20us
從實(shí)驗(yàn)數(shù)據(jù)可知,數(shù)據(jù)傳輸量越大,全局存儲器訪問次數(shù)越多,相應(yīng)的數(shù)據(jù)傳輸優(yōu)化以及全局存儲器訪問優(yōu)化的結(jié)果越好,實(shí)驗(yàn)結(jié)果最好的加速比為2.05,相對于傳統(tǒng)編程模型下的程序性能加速比為8.02.實(shí)驗(yàn)結(jié)果表明,數(shù)據(jù)傳輸優(yōu)化和全局存儲器訪問優(yōu)化可以有效的提高程序性能,在使用HXDSP異構(gòu)計(jì)算平臺時應(yīng)重點(diǎn)關(guān)注數(shù)據(jù)傳輸與全局存儲器訪問對程序性能的影響.
本文采用OpenCL異構(gòu)并行計(jì)算規(guī)范設(shè)計(jì)并實(shí)現(xiàn)了面向CPU/HXDSP異構(gòu)系統(tǒng)的異構(gòu)計(jì)算框架.針對不同的并行計(jì)算應(yīng)用場景,設(shè)計(jì)了不同的OpenCL設(shè)備映射方式.在HXDSP異構(gòu)計(jì)算框架完成的基礎(chǔ)上,本文針對CPU/HXDSP異構(gòu)系統(tǒng)OpenCL應(yīng)用程序進(jìn)行性能優(yōu)化,包括數(shù)據(jù)傳輸優(yōu)化以及數(shù)據(jù)訪問優(yōu)化.針對主機(jī)與全局存儲之間的數(shù)據(jù)傳輸本文設(shè)計(jì)了共享虛擬存儲器進(jìn)行優(yōu)化,針對HXDSP之間的數(shù)據(jù)傳輸本文設(shè)計(jì)了基于交換芯片的通道進(jìn)行優(yōu)化.根據(jù)全局存儲與局部存儲的訪問效率不同本文針對全局存儲訪問進(jìn)行優(yōu)化.
本文通過實(shí)驗(yàn)評估了CPU/HXDSP的基本性能,并將OpenCL應(yīng)用程序與傳統(tǒng)編程模型下程序性能對比,證明了HXDSP異構(gòu)計(jì)算框架的可行性并且能有效地提升程序性能.在未來的工作中可以針對OpenCL內(nèi)核任務(wù)的調(diào)度進(jìn)行優(yōu)化以進(jìn)一步提升OpenCL應(yīng)用程序的性能.