, , ,,,
(1.山東科技大學(xué) 計(jì)算機(jī)科學(xué)與工程學(xué)院,山東 青島 266590;2.山東省計(jì)算中心(國(guó)家超級(jí)計(jì)算濟(jì)南中心),山東 濟(jì)南 2501013.中國(guó)科學(xué)院計(jì)算技術(shù)研究所 計(jì)算機(jī)體系結(jié)構(gòu)國(guó)家重點(diǎn)實(shí)驗(yàn)室,北京 100190)
地球系統(tǒng)模式已成為研究和預(yù)測(cè)全球變化的有力工具,也是當(dāng)前大氣科學(xué)領(lǐng)域的研究熱點(diǎn)之一。中科院大氣物理所研發(fā)的大氣環(huán)流模式(atmospheric general circulation models,AGCM),利用偏微分方程求解物理問題,是典型的高性能應(yīng)用,是整個(gè)中科院地球系統(tǒng)模式CAS-ESM(earth system model)中最復(fù)雜的部分。其動(dòng)力框架基于準(zhǔn)一致網(wǎng)格[1]實(shí)現(xiàn),在分辨率提高的同時(shí),計(jì)算量增大,進(jìn)程間通信量也隨之增加。如何提升較高分辨率下的AGCM模式性能,已成為重要的研究課題。
“神威·太湖之光”是由我國(guó)自主研發(fā)的高性能異構(gòu)眾核處理器“申威(SW)26010”構(gòu)建的超級(jí)計(jì)算機(jī)系統(tǒng),其峰值性能超過(guò)100Pflops,曾4次蟬聯(lián)世界超級(jí)計(jì)算機(jī)Top500榜首,目前在世界超算平臺(tái)排名第3。申威眾核處理器支持眾核加速編程模型(神威OpenACC,簡(jiǎn)稱SWACC)和加速線程庫(kù)(Athread庫(kù))兩種并行編程模型。徐金秀等[2]在神威平臺(tái)上開展耦合算法的多級(jí)并行優(yōu)化,并使用SWACC實(shí)現(xiàn)耦合算法的眾核并行;李億淵等[3]基于神威平臺(tái),利用Athread在線程級(jí)層面,對(duì)稀疏矩陣向量乘法進(jìn)行并行算法設(shè)計(jì)和優(yōu)化實(shí)現(xiàn)。眾核異構(gòu)平臺(tái)相比傳統(tǒng)的高性能硬件平臺(tái)能提供更強(qiáng)大的計(jì)算能力和訪存帶寬[4],在國(guó)內(nèi)當(dāng)前主流的異構(gòu)眾核高性能平臺(tái)上對(duì)AGCM進(jìn)行眾核并行化,成為目前的重要研究方向之一。
本研究面向國(guó)產(chǎn)眾核異構(gòu)平臺(tái)“神威·太湖之光”,以中科院大氣物理研究所研發(fā)的IAP AGCM4.0為基礎(chǔ),對(duì)其熱點(diǎn)程序動(dòng)力框架的適應(yīng)過(guò)程構(gòu)造Tend_lin應(yīng)用,利用神威OpenACC編程模型實(shí)現(xiàn)Tend_lin應(yīng)用的眾核并行化。通過(guò)循環(huán)分布、循環(huán)分塊并行將計(jì)算任務(wù)分配到計(jì)算核心,以高效DMA的方式將計(jì)算需要的數(shù)據(jù)批量傳輸?shù)綇暮司执?,消除?jì)算過(guò)程中低效的全局離散訪存,實(shí)現(xiàn)了Tend_lin應(yīng)用在國(guó)產(chǎn)異構(gòu)眾核平臺(tái)上的OpenACC并行化。
圖1 申威眾核處理器結(jié)構(gòu)圖
“神威·太湖之光”整機(jī)由40 960塊SW26010處理器組成,并通過(guò)計(jì)算插件板、計(jì)算超節(jié)點(diǎn)和計(jì)算機(jī)倉(cāng)等模式進(jìn)行系統(tǒng)擴(kuò)展。“申威(SW)26010”為主從核結(jié)構(gòu)的異構(gòu)眾核處理器,集成4個(gè)運(yùn)算核組共260個(gè)運(yùn)算核心,采用片上計(jì)算陣列集群和分布式共享存儲(chǔ)相結(jié)合的體系結(jié)構(gòu)(圖1)。
每個(gè)CPU包括4個(gè)異構(gòu)核組(core-groups,CGs),每個(gè)異構(gòu)核組由1個(gè)管理核心(management processing element,MPE,主核)、1個(gè)運(yùn)算核心簇(computing processing elements clusters,CPE Cluster)、1個(gè)存儲(chǔ)控制器(memory controller,MC)和系統(tǒng)接口(system interface,SI)組成[5]。
主核在大規(guī)模計(jì)算過(guò)程中通常用于完成管理計(jì)算核心以及與其他核組進(jìn)行通信的任務(wù)[7]。CPE Cluster包含64個(gè)運(yùn)算核心(computing processing elements,CPE,從核),以8×8的Mesh布局通過(guò)簇通信網(wǎng)絡(luò)進(jìn)行連接。每個(gè)從核具備私有的L1指令Cache,一個(gè)運(yùn)算核心簇共享L2指令Cache,從核只能運(yùn)行于用戶模式并且不支持中斷,適用于處理邏輯簡(jiǎn)單而計(jì)算相對(duì)密集的過(guò)程[8]。核組內(nèi)共享內(nèi)存。主/從核通過(guò)MC完成與主存的數(shù)據(jù)傳輸。每個(gè)從核均包括一個(gè)以SPM(scratch pad memory)方式組織的64 kB大小的局部數(shù)據(jù)存儲(chǔ)器(local data memory,LDM),該空間需要用戶顯式的設(shè)計(jì)規(guī)劃使用。
SW26010處理器從核LDM空間有限,往往無(wú)法滿足使用大數(shù)組的科學(xué)計(jì)算程序存儲(chǔ)要求,大部分?jǐn)?shù)據(jù)存儲(chǔ)在主存中。在計(jì)算過(guò)程中,必須通過(guò)一定的方式完成主存到從核LDM的數(shù)據(jù)傳輸。從核支持兩種主存訪問模式:1)全局讀入/寫出(gld/gst),直接完成主存到從核寄存器間的零散數(shù)據(jù)訪問;2)直接內(nèi)存訪問(direct memory access,DMA),批量完成從內(nèi)存到LDM的大量數(shù)據(jù)拷貝,通常延時(shí)較大,但帶寬利用率較高。相比其他異構(gòu)平臺(tái),從核由于存儲(chǔ)空間和帶寬限制,數(shù)據(jù)傳輸往往成為程序性能瓶頸。Xu等[9]在主存數(shù)據(jù)128字節(jié)對(duì)齊的前提下,在一個(gè)核組內(nèi)64個(gè)從核中進(jìn)行Stream Triad,PE模式下測(cè)得DMA的帶寬可以達(dá)22.6 GB/s,而gld/gst方式每個(gè)核組帶寬利用只有1.5 GB/s左右;延遲方面,從核gld單核延遲需要177個(gè)cycles,而從核訪問局存的1d只需要4個(gè)cycles??梢?,DMA方式比gld/gst能夠更有效的利用帶寬,但啟動(dòng)一次DMA需要300 cycles左右,開銷較大,若DMA次數(shù)過(guò)多會(huì)大大降低程序性能。因此在SW26010異構(gòu)眾核處理器上,獲得更好的數(shù)據(jù)傳輸性能的關(guān)鍵在于一次完整數(shù)據(jù)傳輸?shù)臄?shù)據(jù)量要盡可能大,并減少DMA的啟動(dòng)次數(shù)。
圖2 單核組訪存周期
CAS-ESM是以耦合器為核心的模塊化軟件,集成了大氣、陸面、陸冰、海冰和海洋等分量模式的復(fù)雜系統(tǒng),AGCM是其中最復(fù)雜的分量模式。
IAP AGCM主要由物理過(guò)程和動(dòng)力框架兩個(gè)過(guò)程組成。其中,物理過(guò)程計(jì)算量占比小,并行可擴(kuò)展性較高;動(dòng)力框架主要是用來(lái)求解關(guān)于時(shí)間的偏微分方程組,其計(jì)算在空間上是三維的,數(shù)值方法復(fù)雜,是主要的優(yōu)化部分。IAP AGCM 4.0[12]的動(dòng)力框架采用均勻經(jīng)緯網(wǎng)格,并在高緯度采用靈活跳點(diǎn)格式[13]。格點(diǎn)模式中極區(qū)計(jì)算難以處理,模式引入濾波模塊,將緯度劃分為3個(gè)緯度帶,不同緯度采用不同濾波方法以增加時(shí)間步長(zhǎng),避免計(jì)算不穩(wěn)定。本研究提取IAP AGCM 4.0的熱點(diǎn)動(dòng)力框架中的適應(yīng)過(guò)程Tend_lin作為研究對(duì)象。
圖3 Tend_lin應(yīng)用中fft計(jì)算函數(shù)調(diào)用層次圖
Tend_lin的計(jì)算過(guò)程主要包括兩個(gè)不同的階段,兩個(gè)階段的計(jì)算數(shù)據(jù)來(lái)自不同的數(shù)組,但都主要由stencil和1維fft兩類計(jì)算組成,主要包括積分、濾波和平滑等計(jì)算類型;通信模式主要是近鄰?fù)ㄐ藕图贤ㄐ?。其中stencil計(jì)算涉及22組計(jì)算循環(huán),占應(yīng)用串行運(yùn)行時(shí)間的71%,計(jì)算中用到臨近若干點(diǎn),每個(gè)計(jì)算循環(huán)的總訪問足跡較大,其中14個(gè)緯度-高度-經(jīng)度三維空間全遍歷,計(jì)算訪問3維數(shù)組較多。濾波和平滑功能的計(jì)算分別在filt和smoother中,不同緯度選擇了不同的濾波方法,函數(shù)調(diào)用層次深(圖3)。該階段計(jì)算循環(huán)面對(duì)的是同一個(gè)高度上的數(shù)組區(qū)域,包含緯度-經(jīng)度上遍歷的兩層循環(huán),每個(gè)高度上要進(jìn)行多階段處理,不同高度間無(wú)數(shù)據(jù)依賴關(guān)系。雖然數(shù)據(jù)訪問量小,但計(jì)算循環(huán)個(gè)數(shù)較多。
Tend_lin應(yīng)用涉及73個(gè)計(jì)算循環(huán)和單入單出的代碼塊,數(shù)據(jù)訪問多以數(shù)組形式在函數(shù)內(nèi)動(dòng)態(tài)分配內(nèi)存空間。Tend_lin程序具有以下特點(diǎn):①?zèng)]有熱點(diǎn)循環(huán),任務(wù)并行代碼散落于73個(gè)并行循環(huán)和單入單出的代碼塊上;②氣候模式算法現(xiàn)狀導(dǎo)致網(wǎng)格點(diǎn)分辨率不高,每個(gè)循環(huán)的并行度都不是很大,充分利用眾核資源難度大;③循環(huán)間大小不一,并行度差異大;④計(jì)算/訪存比值較低,訪存優(yōu)化為應(yīng)用性能提升的關(guān)鍵;⑤各進(jìn)程的計(jì)算行為不同構(gòu),在緯度方向上,不同進(jìn)程采用不同濾波方法,且南北極需要特別處理。
為方便并行化,除適應(yīng)過(guò)程的主函數(shù)Tend_lin之外,本研究增加了緯度和高度方向的區(qū)域分解,以及變量初始化部分,并為應(yīng)用配備3個(gè)不同的問題規(guī)模A、B、C以匹配低、中、高不同分辨率,建立了包含59個(gè)源文件、2萬(wàn)行左右的benchmark程序。
下面,將AGCM中的Tend_lin串行代碼移植到SW26010的主核上,并選取網(wǎng)格中典型分辨率即經(jīng)度×緯度×高度為1.4°×1.4°×30L(下稱規(guī)模B)闡述并行化過(guò)程;將B規(guī)模在經(jīng)緯度的分辨率擴(kuò)大2倍,得到計(jì)算規(guī)模是B規(guī)模4倍的C規(guī)模,用來(lái)進(jìn)行全程序評(píng)估。B規(guī)模下,單個(gè)緊嵌計(jì)算循環(huán)最大訪問足跡達(dá)62.8 M(stencil_11);2個(gè)計(jì)算循環(huán)為緯度-經(jīng)度的二維計(jì)算,保持了緯度上的并行度,但缺少高度維,計(jì)算量較小;4個(gè)單入單出的代碼塊,包含經(jīng)度-高度方向的規(guī)約操作;2個(gè)經(jīng)度方向的單層循環(huán)計(jì)算。
眾核并行化主要目標(biāo)就是將最耗時(shí)的循環(huán)迭代分散到多個(gè)從核線程上并行執(zhí)行。下面主要從循環(huán)分布、循環(huán)分塊及并行化、數(shù)據(jù)傳輸?shù)膬?yōu)化以及函數(shù)調(diào)用的從核化4個(gè)方面描述Tend_lin應(yīng)用在神威平臺(tái)上的眾核并行化方案。
循環(huán)分布是在保證應(yīng)用程序正確性的前提下,將源循環(huán)分解為多個(gè)獨(dú)立的目標(biāo)循環(huán)。Tend_lin應(yīng)用中,并行循環(huán)均為典型的DOALL循環(huán),DO循環(huán)中所有的循環(huán)實(shí)例都可以并行的執(zhí)行,每個(gè)循環(huán)實(shí)例中的所有語(yǔ)句均串行執(zhí)行。應(yīng)用中包含了兩類需要特殊處理的并行循環(huán):一類是不同分支的數(shù)組讀區(qū)域,難以被SWACC編譯器合并,導(dǎo)致編譯錯(cuò)誤;另一類循環(huán)體中包含了多個(gè)訪問區(qū)間不同的子循環(huán)且數(shù)據(jù)足跡較大,其循環(huán)體內(nèi)訪問了大量數(shù)據(jù)重用較低的數(shù)組,計(jì)算訪存比過(guò)低。由于LDM尺寸有限,若直接并行該類循環(huán),由于分塊尺寸較小,數(shù)據(jù)重用低,會(huì)出現(xiàn)較大的數(shù)據(jù)傳輸開銷,需要在并行化之前進(jìn)行循環(huán)分布。
為避免出現(xiàn)激進(jìn)的循環(huán)分布帶來(lái)的開銷可能會(huì)大于并行收益的情況,在對(duì)以上兩種并行循環(huán)進(jìn)行循環(huán)分布的同時(shí)要進(jìn)行空間優(yōu)化。
1) 分支結(jié)構(gòu)的循環(huán)分布
stencil計(jì)算中存在帶有分支結(jié)構(gòu)的循環(huán),不同分支間數(shù)組的J維訪問區(qū)域沖突,如GHI(IB:IE, beglev:endlev, JB)和GHI(IB:IE, beglev:endlev, loc_JB:loc_JE),將其抽象為如圖4左側(cè)代碼。由于并不知道JB和loc_JB:loc_JE的大小關(guān)系,編譯器無(wú)法給出統(tǒng)一規(guī)則完成合并,進(jìn)而不能完成編譯。
圖4 分支結(jié)構(gòu)分布示意
經(jīng)過(guò)對(duì)該循環(huán)的不同分支分布為圖4右側(cè)所示循環(huán)代碼,程序能夠正常編譯且數(shù)據(jù)傳輸總量并沒有變化。
2) 大數(shù)據(jù)足跡循環(huán)的循環(huán)分布
Tend_lin應(yīng)用的02_stencil階段存在非緊嵌循環(huán)(如圖5左側(cè)),并且:①最外層J循環(huán)內(nèi),有多個(gè)非緊嵌K-I子循環(huán),這些子循環(huán)訪問變量眾多,對(duì)從核空間需求較大(約47 360 kB),即便最外層J維分塊大小為1(約370 kB),仍遠(yuǎn)超從核LDM空間(64 kB);②不同的K-I子循環(huán)間訪問數(shù)據(jù)足跡大小不一,不同循環(huán)間訪問的數(shù)組不同,且循環(huán)間訪問的數(shù)據(jù)無(wú)任何依賴或者重用;③K維訪問區(qū)間各異,難以合并為緊嵌循環(huán),且K維空間過(guò)小,不能提供有效的并行度,不適合K維并行。
對(duì)內(nèi)層循環(huán)進(jìn)行循環(huán)分布時(shí),必須兼顧合法性和收益性問題。分布合法性指循環(huán)分布的原有數(shù)據(jù)依賴語(yǔ)義必須保持,既要保證源循環(huán)套并列循環(huán)間沒有跨迭代依賴,又要保證兩個(gè)語(yǔ)句組之間沒有反向的數(shù)據(jù)依賴。而為保證循環(huán)分布后的收益,有數(shù)據(jù)重用的盡量放到一個(gè)循環(huán)套內(nèi)[14],減少因拆分導(dǎo)致的同一數(shù)組的多次讀取,避免額外開銷。
本研究在保證J維并行的前提下進(jìn)行循環(huán)分布,將一個(gè)執(zhí)行次數(shù)較多的非緊嵌循環(huán)分割成若干個(gè)執(zhí)行次數(shù)較少、訪問足跡較小的完美緊嵌子循環(huán)(如圖5右側(cè)),以求每個(gè)小循環(huán)并行時(shí),獲得更大的循環(huán)分塊尺寸,提高DMA效率。
圖5 大數(shù)據(jù)足跡循環(huán)分布示意
神威OpenACC按照OpenACC 2.0[11]標(biāo)準(zhǔn)進(jìn)行循環(huán)并行化,使用parallel和loop語(yǔ)句指示加速區(qū)代碼,加載到從核并行執(zhí)行。但與標(biāo)準(zhǔn)OpenACC不同的是,由于硬件結(jié)構(gòu)的區(qū)別,神威上gang、worker、vector的三層循環(huán)設(shè)計(jì)沒有分層的需求,默認(rèn)gang設(shè)置成64,worker為1,vector也并未做SIMD功能支持。將硬件特征與程序特征進(jìn)行匹配的循環(huán)分塊可以充分的開發(fā)硬件架構(gòu)的潛能,將串行程序生成適合粒度的并行分塊程序。
1) 線程并行維度的選擇
Tend_lin應(yīng)用中進(jìn)程間保留了IAPAGCM4.0中的緯度-高度二維的進(jìn)程劃分,本研究在線程間使用神威OpenACC進(jìn)行眾核并行化,支持一維的并行。應(yīng)用中的并行DOALL循環(huán)除stencil_09外,數(shù)組索引與循環(huán)索引緊耦合,可直接選取循環(huán)索引最外層,即選擇數(shù)組的最高維為并行維,以有效避免低效的低維跨步傳輸,提升DMA傳輸性能。
應(yīng)用中并行循環(huán)之間訪問足跡大小差距較大,導(dǎo)致對(duì)LDM空間的需求差異大,若使用全局一致的循環(huán)分塊策略,則導(dǎo)致大部分的并行區(qū)LDM空間利用率不高,且OpenACC作為同步式的并行模型不需要全局一致的分塊,故本文采取局部最優(yōu)劃分策略,保證每個(gè)循環(huán)執(zhí)行時(shí)間最優(yōu)。由于LDM空間有限,對(duì)于數(shù)據(jù)傳輸量較大的循環(huán),即便并行維最小分塊,也無(wú)法滿足LDM空間需求。為了避免低效的跨步傳輸,本文選取最高維(緯度)和次高維(高度)使用循環(huán)分塊子句tile進(jìn)行二維劃分,即緯度維循環(huán)并行分塊,高度維做DMA流水分塊。對(duì)于只劃分并行維就可以滿足空間需求的并行循環(huán),則不再做次高維的流水劃分。對(duì)于非耦合循環(huán)stencil_09,由于存在最內(nèi)層K維的規(guī)約操作,不宜調(diào)整循環(huán)順序,僅選取次高維(經(jīng)度)流水分塊。
2) 循環(huán)分塊尺寸的選擇
為充分利用從核LDM空間,并保證最少的DMA通信次數(shù),編譯器在對(duì)循環(huán)進(jìn)行分塊時(shí),既要保證內(nèi)循環(huán)塊中訪問的數(shù)據(jù)總量不超過(guò)LDM的大小,又要保證使用盡可能大的LDM空間。根據(jù)文獻(xiàn)[14]中的面向異構(gòu)多核處理器的循環(huán)分塊方案,以訪問足跡最大的緊嵌并行循環(huán)stencil_11為例,求解循環(huán)分塊的可行解。分析過(guò)程如下:
step 1:計(jì)算并行循環(huán)的總空間需求
stencil_11使用的數(shù)組數(shù)據(jù)類型為雙精度浮點(diǎn)類型,每個(gè)元素8個(gè)字節(jié),計(jì)算該循環(huán)用到8個(gè)三維數(shù)組、3個(gè)二維數(shù)組和4個(gè)一維數(shù)組,另外還訪問1個(gè)緯度方向跨度為1的3維數(shù)組和1個(gè)緯度方向跨度為2的2維數(shù)組作為陰影區(qū),則共需要的數(shù)組尺寸為((256×128×30×8+256×128×3+256×4+256×1×30×1+256×2×1)×8)=63 774 720字節(jié)=62 280 kB,遠(yuǎn)超LDM空間64 kB,須進(jìn)行循環(huán)分塊后才能夠放入局存當(dāng)中。
step 2:確定最高維緯度j層分塊大小
令該層的分塊大小為1,這時(shí)循環(huán)訪問的數(shù)組所占空間即數(shù)據(jù)足跡為558 kB,仍超過(guò)LDM空間,說(shuō)明即便使分塊大小為1,僅進(jìn)行最外層(最高維)的循環(huán)分塊,仍不能滿足LDM空間需求的,需要對(duì)下一維進(jìn)行劃分。
step 3:確定次高維高度k層分塊大小
當(dāng)最外層大小為1時(shí),數(shù)據(jù)足跡是LDM空間的8.7倍。由于循環(huán)訪問的數(shù)組形狀差異大,數(shù)據(jù)足跡和k層分塊之間并不是嚴(yán)格成比例。當(dāng)k層循環(huán)分塊大小取3(30/8.7=3)時(shí),數(shù)據(jù)足跡大小72 kB,超過(guò)LDM空間;當(dāng)k層循環(huán)次外層分塊大小取2時(shí),數(shù)據(jù)足跡為54 kB,為本分塊策略下最大可用空間,并為最大次外層分塊尺寸。
通過(guò)以上3步,得到循環(huán)分塊維度劃分方案:最外層(并行維)按分塊大小1劃分,次外層按照分塊大小2或1進(jìn)行劃分,最內(nèi)層不劃分。
在第1部分介紹的從核線程的兩種訪存方式中,直接訪存比全局離散訪存能更好的利用帶寬,因此從應(yīng)用特征出發(fā),最大可能地將計(jì)算所需的數(shù)據(jù)以DMA方式批量拷貝到LDM存儲(chǔ),消除計(jì)算過(guò)程中的離散全局訪存是性能優(yōu)化步驟的關(guān)鍵。
本研究采用將計(jì)算中所需的數(shù)據(jù)都存儲(chǔ)在從核LDM中的數(shù)據(jù)管理策略,Tend_lin應(yīng)用計(jì)算過(guò)程中訪問的數(shù)組多為動(dòng)態(tài)數(shù)組,編譯器無(wú)法直接獲取其區(qū)域信息;循環(huán)間訪問行為各異,需要對(duì)數(shù)據(jù)傳輸進(jìn)行差異化表達(dá)。經(jīng)過(guò)3.1節(jié)循環(huán)分布,實(shí)現(xiàn)了循環(huán)中訪問數(shù)組索引變量與循環(huán)的索引變量緊耦合,這些循環(huán)直接使用tile子句由編譯器自動(dòng)完成數(shù)組劃分,搭配copy/copyin/copyout語(yǔ)句,在每個(gè)并行循環(huán)分塊計(jì)算前,以DMA傳輸方式將所需數(shù)據(jù)傳輸?shù)礁鱾€(gè)從核的LDM中,實(shí)現(xiàn)數(shù)據(jù)的提前拷貝。具體進(jìn)行數(shù)據(jù)傳輸時(shí)需要解決以下幾個(gè)問題:
1) 動(dòng)態(tài)數(shù)組區(qū)域信息的表達(dá)
應(yīng)用中的大量動(dòng)態(tài)數(shù)組,在編譯時(shí)編譯器不能獲得其維度信息,其形狀不能被分析出來(lái),無(wú)法在從核LDM中申請(qǐng)對(duì)應(yīng)循環(huán)分塊尺寸的空間,需要使用暗示制導(dǎo)語(yǔ)句annotate(dimension(array))來(lái)指明數(shù)組維度,為編譯器劃分?jǐn)?shù)組提供依據(jù)。如圖6所示,并行循環(huán)中DGH和GHI1數(shù)組為動(dòng)態(tài)數(shù)組,利用copy/copyin子句搭配dimension暗示制導(dǎo)語(yǔ)句的形式實(shí)現(xiàn)動(dòng)態(tài)數(shù)組的DMA傳輸。
圖6 Dimension使用示意
2) 最低維的傳輸區(qū)域表達(dá)
Tend_lin應(yīng)用的并行循環(huán)中,存在對(duì)非并行維非全維度的訪問,如圖7所示,J維為并行維,VT為動(dòng)態(tài)分配內(nèi)存空間的三維數(shù)組,在計(jì)算中I維只訪問了區(qū)間[IB:IE],占全維度的98%,并沒有訪問全維度。
系統(tǒng)提供的parallel copy子句僅支持標(biāo)量和數(shù)組,不支持子數(shù)組形式,因此copy子句只能傳輸全維度數(shù)據(jù),而不是該維度的子區(qū)間(IB:IE)。若要實(shí)現(xiàn)非全維度的準(zhǔn)確低維區(qū)間傳輸,只能利用數(shù)組聲明進(jìn)行手工修改。但由于精確傳輸?shù)膁ma_get為跨步傳輸,單從核帶寬為6.33 GB/s,64核帶寬為30.48 GB/s。而直接使用copy子句進(jìn)行I維全維度傳輸為非跨步傳輸,雖然數(shù)據(jù)量增加了2%,但單從核帶寬可達(dá)8.14 GB/s,64核帶寬為30.18 GB/s。導(dǎo)致兩個(gè)方案在64線程時(shí)的DMA差別不到1%,即全維度傳輸雖然多使用了2%的存儲(chǔ)空間,但未明顯影響傳輸時(shí)間。因此最終選用copy子句實(shí)現(xiàn)I維全維度傳輸。
3) 循環(huán)不變數(shù)組的拷貝
圖8中,相對(duì)于并行維J,只讀數(shù)組A是循環(huán)不變數(shù)組,在并行循環(huán)中的每個(gè)實(shí)例是相同的,存在讀讀重用。循環(huán)中數(shù)組A的訪問區(qū)域只與流水循環(huán)索引有關(guān),編譯器依照流水分塊尺寸在流水循環(huán)內(nèi)生成的多次DMA傳輸。這時(shí)利用annotate(entire(array))將整個(gè)數(shù)組在流水循環(huán)外以一次DMA的方式傳輸?shù)矫總€(gè)從核LDM中,使每個(gè)從核的LDM中都保有該數(shù)組的一個(gè)完整副本。但由于LDM空間有限,該方式只適用于傳輸較小的數(shù)組。
圖7 非并行維非全維度訪問示意
圖8 循環(huán)不變數(shù)組用法示意
4) 數(shù)組的轉(zhuǎn)置后傳輸
如圖9中的stencil_09循環(huán),并行循環(huán)維度從高到低順序?yàn)镴、I、K,I循環(huán)內(nèi)存在子循環(huán)K,對(duì)應(yīng)TT1數(shù)組的最高維,循環(huán)內(nèi)對(duì)TT1數(shù)組的訪問是跨步訪問,需要利用轉(zhuǎn)置子句swapin對(duì)原始數(shù)據(jù)進(jìn)行重新布局,改善數(shù)據(jù)傳輸效率。如圖9所示,在數(shù)據(jù)傳輸前,主核使用swapin語(yǔ)句數(shù)據(jù)進(jìn)行轉(zhuǎn)置,使循環(huán)索引與數(shù)組索引的高低維順序?qū)?yīng),以轉(zhuǎn)置后的數(shù)組代替原數(shù)組訪問,再按照循環(huán)分塊進(jìn)行傳輸。
圖9 Swapin子句使用示意
對(duì)于該計(jì)算循環(huán),轉(zhuǎn)置前由于不能使用copyin將TT1拷入LDM,計(jì)算過(guò)程只能使用gld訪存,計(jì)算時(shí)間占總執(zhí)行時(shí)間的近80%;使用swapin轉(zhuǎn)置后,該數(shù)組訪問由低效的gld變?yōu)楦咝У膌d操作,計(jì)算時(shí)間縮短了13倍,這樣雖然轉(zhuǎn)置時(shí)間占到了轉(zhuǎn)置后計(jì)算循環(huán)總執(zhí)行時(shí)間的30%,但計(jì)算時(shí)間的大幅縮短使整個(gè)循環(huán)執(zhí)行時(shí)間減少2倍以上,該循環(huán)在整個(gè)程序中占計(jì)算比重20%,為tend_lin全程序帶來(lái)5%左右的影響。
5) 標(biāo)量的傳輸
每個(gè)并行循環(huán)中訪問的標(biāo)量最多有12個(gè),平均5個(gè)左右,按照讀寫類型分為只寫和只讀兩類。只寫標(biāo)量都為線程私有變量,可直接使用local子句本地化。
只讀標(biāo)量多帶有parameter屬性,即便不在制導(dǎo)語(yǔ)句中有任何體現(xiàn),編譯器仍然可以根據(jù)其parameter屬性自動(dòng)添加到copyin和annotate readonly子句中,在從核LDM中生成對(duì)等的parameter變量,直接賦值。對(duì)于不具備parameter屬性的只讀循環(huán)邊界量,編譯器也可自動(dòng)添加到copyin和annotate readonly子句中,在每個(gè)從核LDM中生成一份拷貝,每個(gè)變量以一次gld的形式load到LDM中;對(duì)于不具備parameter屬性的只讀循環(huán)內(nèi)部變量,編譯器無(wú)法分析出該變量是否需要私有化,必須手動(dòng)添加到copyin子句中才能在LDM中生成拷貝并以gld形式拷入。經(jīng)過(guò)以上處理,將從核計(jì)算過(guò)程中所需要的數(shù)據(jù)在計(jì)算前存入從核LDM中。
為避免計(jì)算過(guò)程中不存在的低效gld/gst操作,利用“神威·太湖之光”上的性能分析工具penv_slave2_ gld_count和penv_slave2_gst_count,在編譯器生成的中間代碼中統(tǒng)計(jì)計(jì)算過(guò)程中從核gld/gst請(qǐng)求次數(shù),確保完全消除了計(jì)算過(guò)程中的全局離散訪存。
應(yīng)用中,加速區(qū)存在大量routine函數(shù)調(diào)用,且關(guān)系復(fù)雜,若直接在routine函數(shù)調(diào)用層的循環(huán)外使用制導(dǎo)語(yǔ)句,循環(huán)內(nèi)的routine函數(shù)調(diào)用無(wú)法直接生成從核版本,導(dǎo)致生成的從核代碼找不到對(duì)應(yīng)被調(diào)routine函數(shù)。
對(duì)于加速區(qū)的函數(shù)調(diào)用,在被調(diào)用函數(shù)內(nèi)使用函數(shù)指示routine處理,為加速代碼區(qū)中被調(diào)用的函數(shù)自動(dòng)創(chuàng)建可在從核上執(zhí)行的版本。
本研究以Tend_lin應(yīng)用在SW26010處理器1個(gè)主核上,使用-O3優(yōu)化選項(xiàng)的串行版本為測(cè)試基準(zhǔn),并以主核串行版本輸出為標(biāo)準(zhǔn),相對(duì)誤差控制在10-10以下。針對(duì)第3節(jié)提出的并行化方案,分別利用B、C規(guī)模進(jìn)行實(shí)驗(yàn)性能評(píng)估。
根據(jù)3.2節(jié),在B規(guī)模下,以最高維緯度為并行維,分塊大小為1,次高維高度為流水維,最大訪問足跡的并行循環(huán)流水分塊分別使用1(36 kB)或者2(54 kB)對(duì)比測(cè)試;在最大訪問足跡循環(huán)流水分塊為2的基礎(chǔ)上,為每個(gè)并行循環(huán)選取空間需求不超過(guò)LDM空間的最大流水分塊尺寸,記為n。依此共設(shè)置三組對(duì)照實(shí)驗(yàn),分別取分塊大小為1×1、1×2和1×n,多線程相比主核單線程獲得的加速比結(jié)果如圖10所示。
圖10 神威OpenACC版多線程不同分塊尺寸性能對(duì)比
由圖10(a)可看出,隨著線程增加,純計(jì)算階段按比例加速,具有強(qiáng)擴(kuò)展性,應(yīng)用性能提升的關(guān)鍵在于優(yōu)化訪存性能。由圖10(b)可知,隨著流水分塊的增大,應(yīng)用性能不斷提升,說(shuō)明在滿足LDM空間限制的前提下,DMA傳輸總量不變,隨著流水分塊尺寸的增大,DMA傳輸啟動(dòng)次數(shù)減少,降低了DMA開銷;同時(shí)隨著流水分塊尺寸的增加,每次dma_get傳輸?shù)南蛄块L(zhǎng)度增加,帶寬利用率增大。以上兩方面訪存性能的提升使全程序性能隨之提升。
圖11 Tend_lin應(yīng)用不同規(guī)模多進(jìn)程下加速比
在B、C兩規(guī)模下使用二維進(jìn)程布局,每個(gè)進(jìn)程選取最優(yōu)線程數(shù)下表現(xiàn)的性能,得到Tend_lin應(yīng)用最終獲得的全程序性能(如圖11),在B規(guī)模下最終獲得相比主核串行25倍的加速;隨著分辨率的進(jìn)一步擴(kuò)大,在C規(guī)模下64進(jìn)程時(shí)最高獲得69倍加速。
本研究基于國(guó)產(chǎn)異構(gòu)眾核平臺(tái)“神威·太湖之光”,使用神威OpenACC并行編程模型對(duì)Tend_lin應(yīng)用進(jìn)行了并行化,分別從循環(huán)分布、循環(huán)分塊、數(shù)據(jù)傳輸表達(dá)和函數(shù)調(diào)用從核化4個(gè)方面說(shuō)明并行化方案。為保證高效的數(shù)據(jù)傳輸效率,從核并行選擇數(shù)組的最高維為并行維,對(duì)于最高維并行不能滿足LDM空間需求的循環(huán),在次高維進(jìn)行流水劃分,并為每個(gè)并行循環(huán)選取最大的流水分塊尺寸;從核并行化使用高效的DMA完成主存與LDM之間的數(shù)據(jù)傳輸,保證計(jì)算過(guò)程中只訪問從核LDM空間,并重點(diǎn)對(duì)典型數(shù)據(jù)傳輸?shù)谋磉_(dá)進(jìn)行討論。最終應(yīng)用在國(guó)產(chǎn)異構(gòu)眾核平臺(tái)上,B規(guī)模單核組多線程獲得6.8倍的全程序加速,多進(jìn)程獲得25倍加速;隨著分辨率擴(kuò)大,加速更加明顯,C規(guī)模多進(jìn)程下最多獲得69倍加速。