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