王 巍,徐傳福,車永剛
(國防科技大學 計算機學院 量子信息研究所兼高性能計算國家重點實驗室, 湖南 長沙 410073)
計算流體力學(Computational Fluid Dynamics, CFD)采用數值方法求解流體運動相關微分方程,從而揭示流動現象和規(guī)律,是涉及流體力學、數學和計算機科學等多個學科領域的交叉學科。20世紀60年代以來,隨著高性能計算技術的發(fā)展,CFD也獲得了迅速的發(fā)展,目前已被廣泛應用于航空航天、航海、汽車制造、生物醫(yī)療、環(huán)境工程、核工業(yè)等眾多領域。然而,在研究和設計中要使CFD手段達到高保真度水平將引入巨大的計算量,這對現代高性能計算平臺的計算和存儲能力等提出了極高的要求[1-2]。
另一方面,自2008年的P級計算機問世,超級計算機的發(fā)展向E級計算能力水平推進,以滿足應用領域的迫切需求。這也使得一系列相關技術,如網絡通信、存儲結構等,都面臨著新的挑戰(zhàn),然而最重要和最根本的是解決能耗問題[3]。為此,異構超級計算機的概念作為解決方案被提出來。概念上,異構超級計算機主要是指計算單元集成了處理器和所謂的加速器,或稱協(xié)處理器。目前一種被廣泛使用的加速器是通用圖形處理器(GPGPU),目前世界超級計算機排行榜(Top500)中最快的超級計算機——Summit就使用了27 648塊NVIDIA Volta V100 GPU作為加速器。另一種重要的加速器是Intel Xeon Phi系列協(xié)處理器(MIC),這是一種基于片上系統(tǒng)架構的眾核加速器,在“天河二號”、Stamped等超級計算機中得到使用[4-5]?,F今,異構系統(tǒng)正成為在能耗允許的范圍內建造更大規(guī)模和更強計算能力的超級計算機的有力選擇[6-7]。
然而,要使CFD應用在異構平臺上獲得良好的性能,將面臨新的問題,如異構計算資源之間的數據傳輸開銷、計算能力的差別,以及負載均衡等。針對異構超級計算機系統(tǒng)的特點,將CFD應用以合適的方式面向異構平臺移植,是使CFD應用充分發(fā)揮異構超級計算機性能的關鍵技術,也是領域內的熱點課題,已有大量相關研究工作。美國橡樹嶺國家實驗室與CRAY、NVIDIA等[8]合作實現了燃燒模擬軟件S3D的MPI/OpenMP混合并行,并基于OpenACC實現了其GPU并行計算,使用Fermi GPU相對于CPU的加速為1.2倍,在Titan超級計算機上的測試規(guī)模最大達8192節(jié)點。俄羅斯凱爾迪什應用數學研究所Gorobets等[9]基于MPI+OpenMP+OpenCL并行編程,實現了一個采用有限體積法求解可壓縮Navier-Stoke方程的CFD軟件的大規(guī)模并行,并在多核CPU、MIC、GPU等體系結構上進行了性能測試與對比,其大規(guī)模異構并行計算擴展到了320個GPU,相對于48個GPU的并行效率超過90%。西班牙加泰羅尼亞技術大學lvarez 等[10]基于MPI+OpenMP + OpenCL編程實現了HPC2框架,在此基礎上實現了一個不均勻加熱充氣腔中的湍流流動算例的并行計算,在一個每結點含2塊NVIDIA K80 GPU的集群上,從1個節(jié)點擴展到64節(jié)點時的并行效率達到94%。國內Cai等[11]在神威太湖之光超級計算機上,針對極大規(guī)模三維爆震波模擬中高階WENO計算問題設計了高效的并行算法和優(yōu)化技術,測試表明可擴展到998萬核,獲得23.1Pflops的性能。
對此,本文針對一個基于有限差分和4階龍格-庫塔(Runge-Kutta)方法顯式時間推進的高階精度CFD求解器——CNS,提出了一種Offload模式下的,對任務內外子區(qū)域劃分的異構混合算法,從而提升程序在異構平臺上的單節(jié)點性能。工作和貢獻如下:
第一,對CNS求解器在Offload模式下的異構程序引入了一種新的內外子區(qū)域的任務劃分策略。這種內外子區(qū)域的任務劃分策略把CNS求解器已有的任務子塊再次劃分為內部區(qū)域和外環(huán)區(qū)域兩個子區(qū)域,將程序在內部區(qū)域的計算放在加速器端來執(zhí)行,外環(huán)區(qū)域的計算和MPI 通信放在CPU端執(zhí)行。這種方式讓加速器端的任務子塊成為被外環(huán)區(qū)域包裹的彼此獨立的內部區(qū)域塊,這樣使加速器的計算之間相互獨立,沒有數據關聯;并且可以通過調整內部子區(qū)域和外部子區(qū)域的大小比例,來靈活地控制CPU端和加速器端的計算負載,獲得良好的負載均衡。
第二,在內外子區(qū)域的任務劃分策略基礎上針對顯式算法的特點進一步設計ghost網格點區(qū)域,并通過引入ghost區(qū)域提出了一種ghost網格點縮減計算模式,這種模式僅在一個時間推進步開始和結束的時候進行CPU和加速器之間的數據傳輸,而在4 階Runge-Kutta法計算的內部則完全不進行CPU和加速器之間的數據通信。這極大地減少了Offload模式下異構程序異構計算資源之間的數據傳輸開銷,并且使得CPU端的任務和加速器端的任務在一個時間推進循環(huán)內部,完全獨立地各自分別進行,僅隨著循環(huán)開始和結束同步,這樣,在負載均衡的情況下,CPU端的計算和MPI通信,與加速器端的計算完全地重疊起來。給出了可以保證計算正確性的ghost網格點區(qū)域的寬度。
第三,基于OpenMP 4.5實現了該異構算法,并分析了負載均衡的條件,最后對程序在CPU+MIC結構的平臺上進行了性能測試。測試表明,基于內外子區(qū)域劃分的異構算法顯著提升了CNS程序在異構平臺上的性能,相較于已有的直接以網格子塊為單位進行任務分配的異構并行算法,在本文測試的三種數據規(guī)模下,平均有5.9倍的性能提升。在單節(jié)點上,相對于不使用加速器時,基于內外子區(qū)域劃分的異構算法在使用單塊MIC卡和兩塊MIC卡時,分別獲得了最大1.27倍和1.45倍的性能加速。
CNS(compressible Navier Stokes)程序是一款用于求解空氣動力學問題的高精度CFD求解器,是一款in-house代碼。該程序提出的穩(wěn)定有限差分格式,滿足能量估計和分部求和規(guī)則[12],求解全三維可壓縮Navier-Stokes方程組。CNS在航空航天科研領域具有良好的應用背景,同時,程序包含復雜的計算。
CNS求解的控制方程組包括方程(1)~(4):
(1)
(2)
p=P(γ,ρ,e)
(3)
T=Temp(γ,Ma,ρ,p)
(4)
CNS程序基于結構化網格求解控制方程組,網格點沿著xyz方向均勻分布,如圖1,針對網格點i,j,k,圖中用灰色表示,在計算某一個坐標方向的數值偏導數的時候,將使用前后各6個相鄰的網格點的數值來構建差分形式(xyz方向分別為圖1中綠色、藍色、橙色)。同時,時間推進采用顯式4階Runge-Kutta方法,并且所有的計算矩陣都是稠密的。這些不僅帶來巨大的數據量和計算量,也增加了MPI 通信開銷和使用異構平臺時異構計算資源之間的數據傳輸開銷。
CNS程序的原始版本基于MPI的并行程序,它將一個正六面體空間計算區(qū)域均勻地分解成nprocsx×nprocsy×nprocsz個子塊,采用笛卡爾進程通信拓撲,每一個進程承擔一個子塊的計算,每一個任務子塊有相同數量的網格,這樣負載是均衡的。初始版本的CNS程序本身具有良好的并行可擴展性。
圖1 CNS程序的網格和差分示意Fig.1 Finite difference stencil in CNS
CNS程序主循環(huán)的計算內核RK4包含了4階Runge-Kutta法的4個計算階段,如圖2(a)所示。控制方程組所有項和結果的計算都在RK4函數中執(zhí)行,其中包括兩大主要計算模塊:通量項的計算,即函數cacul_flux,如圖2(a)中步驟③所示;Φ項的計算,即函數cacul_Φ,如圖2(a)中步驟⑤所示。cacul_flux和cacul_Φ包括了CNS程序全部的差分操作,為了保障cacul_flux和cacul_Φ中的差分計算在邊界附近可以順利執(zhí)行,程序通過MPI通信對子塊外圍的數據緩沖區(qū)進行了填充,如圖2(a)步驟②和④所示。
Offload模式是以CPU為主,加速器為輔的一種異構執(zhí)行模式。相對于加速器和CPU對等模式、加速器原生模式等來說,Offload模式更有利于異構平臺計算資源的充分利用和CPU端與加速器端的負載均衡。所以,一般使用Offload模式來構建和執(zhí)行異構程序。
由于CNS程序原始代碼采用一個進程計算一個任務子塊的模式,要將其重構成Offload模式的異構程序,最直接的做法是將一部分子塊(進程)的計算遷移到加速器上去,將一部分子塊的計算保留在CPU端進行,后面我們將在加速器上計算的子塊稱為Offload子塊,在加速器上計算的子塊對應的進程稱為Offload進程。這樣,加速器和CPU上的計算資源都得到了利用,并可以通過調整在加速器上計算的子塊和在CPU上計算的子塊的數量比例,調整CPU端和加速器端的負載。
(a) 原始MPI并行算法過程示意(a) Original algorithm procedure
(b) Direct-Offload算法過程示意(b) Direct-Offload algorithm procedure
(c) Subdomain-Offload算法過程示意(c) Subdomain-Offload algorithm procedure注:①還原基本未知量,邊界條件加載;②MPI通信,填充基本未知量邊界;③計算通量項F、G、H;④MPI通信,填充通量項邊界;⑤計算Φ項:cacul_Φ;⑥更新U數組;⑦收斂檢驗、文件輸出等;⑧結束工作圖2 三種算法的執(zhí)行過程Fig.2 Procedure of three involved algorithm
本課題組的王銅銅[14]等,在CNS程序原始代碼的基礎上實現MPI/OpenMP的兩級并行后,在一個以MIC協(xié)處理器作為加速器的平臺上,基于OpenMP 4.5嘗試了上述方式來構建Offload模式下的異構程序。王銅銅等的工作顯著提高了CNS程序在CPU和MIC上的單核計算性能, OpenMP并行效率高,在“天河二號”超級計算機上的大規(guī)模并行測試展示了良好的并行可擴展性,然而其CPU+MIC異構并行算法相對于純CPU上MPI+OpenMP并行算法尚無性能加速。
通過分析,并參考同類研究,認為造成這種情況的重要原因之一是異構計算資源之間頻繁的數據傳輸帶來的開銷影響了程序整體的性能。在上述的異構算法中,Offload進程的執(zhí)行過程可以概括為圖2(b),可以看出,對于Offload進程,除了在時間推進步開始和結束時CPU和加速器端的數據傳輸和回收以外,每次當計算內核RK4執(zhí)行到步驟②和④都需要將加速器端的中間計算結果傳回CPU端進行MPI通信,再次傳至加速器端繼續(xù)計算。如圖2(b)所示,計算內核RK4的內部,由步驟②和④引起的異構計算資源的PCIe數據傳輸共有16次,這種數據傳輸開銷很大。另外,這也破壞了RK4在加速器端執(zhí)行的連續(xù)性,使得RK4內部的OpenMP并行區(qū)無法盡可能地合并,增加了線程管理開銷。為了便于描述,本文后面將這種Offload模式下,把部分任務子塊整個地遷移到加速器上計算的異構算法稱為direct-Offload算法(代碼)。
為此,不得不尋求新的方式來構建異構程序,提升程序在異構平臺上執(zhí)行的性能。結合前述direct-Offload程序的經驗,從如何降低異構計算資源之間的數據傳輸開銷出發(fā),設計了新的異構算法。Yang等[6]在將基于有限差分的HPCG(high performance conjugate gradient benchmark)程序向“CPU+加速器(MIC)”的異構平臺移植時,引入了一種對任務子塊的內外子區(qū)域劃分策略,使降低PCIe數據傳輸開銷成為可能,進而使異構程序獲得了較好的性能和加速。受此啟發(fā),得益于CNS程序本身規(guī)則的任務子塊和結構化網格的便利,本文借鑒了這種內外子區(qū)域再劃分的任務再劃分策略,并結合4階Runge-Kutta法這種顯式時間推進算法的特點,成功設計了一種適合CNS求解器的基于內外子區(qū)域劃分的ghost區(qū)域收縮式計算異構算法。
該算法極大地降低了Offload模式下異構程序CPU端和加速器端的數據傳輸開銷,提升了CNS 程序在異構平臺上的運行性能,我們從四個方面來介紹和討論該算法:
1)任務子塊的內外劃分策略和ghost區(qū)域;
2)算法的執(zhí)行過程;
3)ghost區(qū)域的寬度和收縮計算;
4)代碼實現與負載均衡。
基于二維的情況來描述CNS程序的任務子塊,圖3(a)是原始MPI并行版本的程序的任務子塊,本文對其進行如圖3(b)所示的內外子區(qū)域再劃分,任務子塊被再劃分成內部區(qū)域和外環(huán)區(qū)域。原來的任務子塊是一個整體,包裹在子塊外圍的是MPI數據緩沖區(qū),如圖3(a)所示;進行內外子區(qū)域再劃分后,原來的任務子塊成為兩部分:由加速器來計算的內部區(qū)域,和由CPU端負責的外環(huán)區(qū)域。值得注意的是,外環(huán)區(qū)域包含了原來的MPI通信數據緩沖區(qū)和實際計算的網格點兩部分,CPU端的任務包括了計算和通信兩部分。實際上,對于三維的任務子塊,本文將立方體區(qū)域劃分成內部的小立方塊和外部具有一定厚度的空心立方殼兩部分,其在二維情況下則退化為圖中矩形內部區(qū)域和框形外環(huán)區(qū)域,因此,從二維情況來討論已經足夠表達基于內外子區(qū)域劃分的異構算法的本質,同時,方便描述和理解。
所謂ghost區(qū)域,是指外環(huán)區(qū)域內邊界內部保留的一定寬度的網格點區(qū)域,和內部區(qū)域外周界外部保留的一定寬度的網格點區(qū)域,如圖3(c)和(d)灰色部分所示,分別稱為inner ghost區(qū)域和outer ghost區(qū)域。外環(huán)區(qū)域的inner ghost區(qū)域將保存內部區(qū)域在外周界附近的計算數值,內部區(qū)域的outer ghost區(qū)域將保存外環(huán)區(qū)域在內邊界附近的計算數值。當有兩個子塊分別使用兩塊加速器時,任務劃分和執(zhí)行的情況則如圖3(e)所示。
(a) 原始任務子塊(a) Original task block (b) 內外子區(qū)域劃分(b) Inner-out subdividing
(c) 外環(huán)區(qū)域(c) Outer halo region (d) 內部區(qū)域(d) Inner chunk region
(e) 兩個任務子塊內外劃分后的情況(e) Two task blocks with inner-out subdividing圖3 內外子區(qū)域任務劃分策略Fig.3 Inner-out subdomain dividing strategy
基于上述內外劃分策略,原來在整個任務子塊執(zhí)行的計算內核RK4,也隨之劃分為內部區(qū)域的RK4計算和外環(huán)區(qū)域的RK4計算,分別在加速器端和CPU端執(zhí)行。
對于一個任務子塊,重新設計的異構算法過程如圖2(c)所示。
Offload進程首先初始化加速器端的執(zhí)行環(huán)境,并將初值等傳遞到加速器端,該操作是在主循環(huán)的外部完成的。
隨之進入時間推進主循環(huán),在計算內核RK4開始之初,通過PCIe將內部區(qū)域邊界附近的值傳回CPU端,并保存在外環(huán)區(qū)域的inner ghost網格點上,同時,將外環(huán)區(qū)域內邊界附近的值傳至加速器端,并保存在內部區(qū)域的outer ghost網格點上。
隨后加速器端獨立地在內部區(qū)域上進行RK4的4階計算,步驟②和④的MPI通信被完全交給了在CPU端執(zhí)行的外環(huán)區(qū)域,在加速器端RK4的計算過程內部不再與CPU端通信,在outer ghost區(qū)域已經保存了需要的外環(huán)區(qū)域的值,從而完整的、連續(xù)地執(zhí)行,直到一次循環(huán)結束。
CPU端同時進行外環(huán)區(qū)域RK4的計算,并且進行步驟②和④來與其他進程通信以填充子塊外圍MPI緩沖區(qū)的值,而inner ghost網格點提供計算外環(huán)區(qū)域內邊界附近的差分所需的內部區(qū)域邊界附近的值,這樣CPU端也連續(xù)地執(zhí)行其任務,直到一次循環(huán)結束前都不需要與加速器進行數據傳輸。
最終,一次循環(huán)結束時,將內部區(qū)域的計算結果從加速器端回收到CPU端用以收斂檢驗和文件輸出等。
重新設計的異構算法,整個主循環(huán)的執(zhí)行過程僅隨著循環(huán)的開始和結束進行兩次PCIe數據傳輸。參照直接將子塊整個地遷移到加速器端計算的direct-Offload算法的過程,如圖2(b)所示,重新設計的異構算法一方面減少了異構計算資源之間的PCIe數據傳輸次數;另一方面,也比直接將整個子塊的數據在CPU和加速器端來回轉移具有更少的數據傳輸量。
重要的是,得益于顯式算法的便利性,對于CNS程序,這樣的異構算法可以保證計算結果正確,因為ghost區(qū)域的寬度,是計算結果正確性的關鍵。
以內部區(qū)域的outer ghost為例,來討論ghost區(qū)域的寬度。設子塊進行內外劃分后,內部區(qū)域在x方向上有nnx+1個網格點,y方向上有nny+1個網格點,z方向上有nnz+1個網格點,二維情況下,nnz+1可以為1(或是任意正整數,設它為1 即可)。
由于CNS程序在xy方向的差分計算,在形式上沒有任何區(qū)別,其ghost區(qū)域的寬度是一樣的。設xy方向outer ghost區(qū)域的寬度都為Wg個數據點。從圖1中可知,CNS程序在計算一個網格點在某一個方向的數值導數時,將使用該網格點前后各6個網格點的數值,xy坐標方向差分計算形式有如下形式:
Ai,j=f(Bi-1,j,Bi-2,j,Bi-3,j,Bi-4,j,Bi-5,j,Bi-6,j,Bi+1,j,Bi+2,j,Bi+3,j,Bi+4,j,Bi+5,j,Bi+6,j)
(5)
Ci,j=f(Bi,j-1,Bi,j-2,Bi,j-3,Bi,j-4,Bi,j-5,Bi,j-6,Bi,j+1,Bi,j+2,Bi,j+3,Bi,j+4,Bi,j+5,Bi,j+6)
(6)
式中,B表示泛指程序中某一變量,式(5)和(6)分別計算了變量B在xy兩個方向的數值導數并賦值給了變量A和變量C。
在cacul_flux中,CNS程序對物理場變量(如速度、溫度等)的空間x方向數值偏導數的計算,都具有上述式(5)的形式,y方向的數值偏導數的計算形式如式(6)所示。而cacul_Φ的計算,是對cacul_flux差分計算所得的結果,即通量項(F,G,H),進一步差分得到F項的,其計算形式同樣具有式(5)和(6)的形式。進一步,以x正方向的情況為例,規(guī)定內部區(qū)域(不包括ghost點)沿著x正方向的第一個網格點的i下標為0,下標沿著x正方向遞增,那么其ghost區(qū)域在x正方向的最后一個點的i下標為nnx+Wg。在cacul_flux中,ghost區(qū)域能保障式(5)形式的差分能夠正確計算的網格點的i下標的上界需要滿足條件:i+6=nnx+Wg,顯然可算得循環(huán)下標i的上界為nnx+Wg-6。
在計算完cacul_flux的結果的基礎上進一步執(zhí)行cacul_Φ,顯然要保證cacul_Φ中式(5)形式的差分能夠正確計算的網格點的i下標的上界需要滿足條件:i+6=nnx+Wg-6,因此能夠正確計算cacul_Φ的網格點的循環(huán)i下標的上界為nnx+Wg-12。
觀察圖2(c)不難發(fā)現,在RK4的第一階計算中包含差分計算的函數就是cacul_flux和cacul_Φ這兩個函數,第二階計算在第一階計算的基礎上重復與第一階類似的過程,因此第二階計算只能在i上界為nnx+Wg-12的范圍內進行。同理,第三階計算只能在i上界為nnx+Wg-24的網格點范圍內進行,第四階計算只能在i上界為nnx+Wg-36的網格點范圍內進行,第四階計算完,計算結果正確的網格點的i下標的上界為nnx+Wg-48,式(5)和(6)有完全相同的形式,并且是以i,j號網格點中心對稱的,所以i下標的下界和j下標的上下界都有上述“收縮”的規(guī)律。將這個ghost區(qū)域以12個網格點寬度,逐階收縮的過程表示為圖4,淺灰色表示最初的ghost區(qū)域,深灰色表示計算完一階后向內收縮了一層。
圖4 ghost區(qū)域的收縮計算Fig.4 ghost-region-shrinking computing scheme
顯然,保證RK4的四階計算結束后內部區(qū)域的網格點計算結果正確的條件是nnx+Wg-48=nnx,則有Wg=48。因此內部區(qū)域ghost網格點的寬度至少為48個網格點,外環(huán)區(qū)域的計算和內部區(qū)域的計算是一樣的,可證其ghost區(qū)域的寬度也需滿足這個條件。取ghost區(qū)域的寬度為48個網格點即可,我們沒必要取更寬的ghost區(qū)域,因為更寬的ghost區(qū)域除了增加主循環(huán)開始時CPU和加速器之間的數據傳輸量,以及帶來更多不必要的計算以外,沒有任何意義。三維情況下,上述收縮計算在z方向同樣執(zhí)行,所以對于三維的立方塊,ghost區(qū)域在xyz方向的寬度都為Wg=48。
值得注意的是,在這種算法中,應該保證外環(huán)區(qū)域和內部區(qū)域本身的大小,要使其能夠提取足夠的網格點來填充ghost區(qū)域的數值。
OpenMP 4.5對Offload模式的異構程序開發(fā)與移植已經有較好的支持,通過合適的編譯指導語句,便可以將代碼段放在加速器端執(zhí)行,并且支持數據異步傳輸等操作,同時支持多平臺,代碼具有良好的可移植性。在已有的CNS程序的MPI/OpenMP兩級并行代碼的基礎上,基于OpenMP 4.5,實現了上述基于內外子區(qū)域劃分的Offload模式的異構算法。為了敘述的方便,后面將基于內外子區(qū)域劃分的Offload模式的異構代碼稱為subdomain-Offload算法(代碼)。
MIC卡支持包括OpenMP在內的多種并行編程模型。將subdomain-Offload代碼放在本課題組一個CPU+MIC結構的服務器單節(jié)點上進行調試和運行,并檢驗了代碼執(zhí)行和計算結果,與原來的純CPU代碼是完全一致的。
CNS程序本身子塊具有相同的大小, 對于subdomain-Offload算法來說,將每一個進程的子塊都進行相同的內外子區(qū)域劃分,并將內部區(qū)域放在加速器端計算,外環(huán)區(qū)域放在CPU端計算,這樣進程和進程之間仍是負載均衡的,而更重要的是CPU和加速器之間的負載均衡。
從subdomain-Offload算法的過程來講,在主循環(huán)的一次執(zhí)行過程中,CPU端的計算和加速器端的計算在RK4內部完全獨立的執(zhí)行,僅在主循環(huán)開始和結束的時候存在同步和進行PCIe數據傳輸。因此,通過控制內外子區(qū)域劃分的比例調整CPU端和加速器端的負載分配,完全可以做到使一次主循環(huán)中的CPU端外環(huán)區(qū)域的計算及MPI通信和加速器端內部區(qū)域的計算在時間上幾乎相等。本文通過實測對此進行了驗證和分析。
表1 服務器的配置Tab.1 The Configuration of the Server
(a) RK4函數單步執(zhí)行時間(a) Single step execution time of RK4 function
(b) 程序執(zhí)行總時間(b) Total program execution time圖5 使用一塊加速卡時的負載均衡Fig.5 Load balance tuning with one accelerator
由于CNS程序本身的任務子塊都劃分成了相同的網格點數,而直接將部分子塊整個地傳輸到加速器端計算的direct-Offload算法,雖然可以調整CPU端和加速器端計算的負載,但是這種調整必須是以子塊為單位的,在實際操作中,這其實是難以真正做到CPU和加速器之間達到負載均衡的。所以相對于direct-Offload算法,subdomain-Offload 算法有更好的負載均衡。
特別地,當負載均衡的時候,CPU 端的計算和MPI通信與加速器端的計算在時間上可以完全重疊,程序有更好的異構協(xié)同并行性。
進一步在表1配置的服務器上對subdomain-Offload算法的單節(jié)點性能進行了測試和評估。選取三種較大的數據規(guī)模,網格點數分別為2.88×106、5.76×106和11.52×106,在測試的過程中,CPU端和MIC卡上的核心全部都被用滿,并關閉了CPU端超線程開關。測試了direct-Offload算法使用單塊加速卡的情況,以及重新設計的subdomain-Offload算法使用一塊和兩塊MIC卡的情況,同時,測試了只使用CPU核計算的MPI/OpenMP兩級并行代碼的情況作為對照。
圖6中藍色圖例是direct-Offload算法使用單塊加速卡MIC的情況,紅色圖例是subdomain-Offload算法使用MIC的情況。結果顯示,在測試的三種數據規(guī)模下,direct-Offload算法的程序執(zhí)行總時間平均為subdomain-Offload算法執(zhí)行總時間的5.9倍。subdomain-Offload算法相較于直接將部分子塊整個傳輸到加速器端計算的direct-Offload算法性能有較大提升,subdomain-Offload算法相較于direct-Offload算法一方面極大地消除和降低了異構計算資源之間的數據傳輸,另一方面,subdomain-Offload算法比direct-Offload算法做到更好的負載均衡,這些對CNS程序在異構平臺的性能提升是有效的。
圖6 相對于direct-Offload算法的性能提升Fig.6 Performance improvement over direct-Offload
圖7是subdomain-Offload算法分別使用單塊MIC以及兩塊MIC卡的情況。在單塊加速卡的性能測試中,使用一塊MIC加速卡計算內部區(qū)域,24個CPU核全部計算外環(huán)區(qū)域,任務分配如圖3(b)所示,依據負載均衡,使內部區(qū)域的網格點的數目占總區(qū)域網格點數目的26%左右,理論上應獲得的性能加速約為1.35倍。實際測試結果如圖7中藍色圖例所示(黃色圖例是純CPU核計算的情況):純CPU計算的程序執(zhí)行時間分別為三種規(guī)模下subdomain-Offload使用CPU+MIC計算執(zhí)行時間的1.23倍、1.24倍、1.27倍,實際的性能加速低于理論的性能加速,造成實際性能加速低于理論性能加速的因素包括異構計算資源之間的數據傳輸開銷,以及計算ghost網格點的額外開銷等。
圖7 服務器上subdomain-Offload算法的性能加速Fig.7 Acceleration of subdomain-Offload on server
在使用兩塊加速卡的性能測試中,任務分配如圖3(e)所示,任務被分配到兩個進程中,兩塊加速卡計算各自任務子塊的內部區(qū)域,兩塊MIC加速卡共同承擔總計算任務的42%左右,24個CPU核心此時承擔的外環(huán)區(qū)域的計算任務約占總計算任務的58%,此時負載是均衡的,理論上,可以獲得1.72倍左右的性能加速。實際測試結果如圖7中綠色圖例所示:純CPU計算的程序執(zhí)行時間分別為三種規(guī)模下subdomain-Offload使用CPU+2MICs計算執(zhí)行時間的1.40倍、1.42倍、1.45倍。
結果表明,subdomain-Offload異構算法,使用MIC卡加速器時可以獲得加速,在測試的服務器上,最大獲得了1.45倍的性能提升。比較三種數據規(guī)模的結果,發(fā)現單節(jié)點計算的數據規(guī)模越大,性能提升相應增加,使用兩塊加速卡比使用一塊加速卡能獲得更多的性能提升。
subdomain-Offload算法使CNS程序在異構平臺上得到了性能提升,但加速效果并不理想,在測試的數據規(guī)模中,使用一塊加速卡時的最大性能提升為1.27倍,使用兩塊加速卡的最大性能提升為1.45倍,原因有以下幾個方面。
首先,測試節(jié)點上的MIC加速卡在CNS程序中能發(fā)揮的計算性能,較CPU能發(fā)揮的計算性能是更劣勢的。結合圖5,不難發(fā)現,隨著Rd的增大,MIC上承擔的計算任務增加,CPU端的計算任務減少,計算任務從CPU端轉移到MIC上,MIC卡的任務執(zhí)行時間劇烈的增加(圖5 (a)中的藍線比紅線更陡),圖5 (b)中主循環(huán)的執(zhí)行時間也隨著MIC上任務的執(zhí)行時間增加而劇烈增加,這說明節(jié)點由CPU主要承擔計算轉向MIC主要承擔計算后,整個節(jié)點的等效計算能力是降低的。并且當負載均衡時,一塊MIC卡在CNS程序中發(fā)揮的計算性能僅相當于CPU計算性能的35%(Rd=0.26時負載均衡,MIC的計算時間和CPU 相等)。這意味著使用一塊加速卡最多也只能獲得性能提升至1.35倍,兩塊卡最多提升至1.72倍,這還沒有考慮數據傳輸等引起的開銷。
其次,subdomain-Offload算法在一次時間推進步中,仍需進行兩次PCIe數據傳輸,引起的開銷是不可忽略的。在每一次主循環(huán)開始的時候,CPU端和加速器端需要通過PCIe交換ghost區(qū)域的數值,這是保證subdomain-Offload算法正確性所需要的。這不僅帶來PCIe傳輸開銷,對填充ghost區(qū)域的數值在傳輸前后進行打包與釋放,以及ghost網格點本身也產生額外的計算,這些都將引入一些開銷。二維情況下,任務子塊的網格點總數為NX·NY·1(二維情況,可令NZ=1),內部區(qū)域的網格點數為(NX·δ)·(NY·ξ)。δ和ξ分別為內部區(qū)域xy方向上的長度占整個任務子塊對應長度的比例,即有Rd=δ·ξ。那么inner ghost網格點的數量可以表示為(2Wg+NX·δ)·(2Wg+NY·ξ)-NX·δ·NY·ξ,outer ghost區(qū)域的網格點數為NX·δ·NY·ξ-(2Wg-NX·δ)·(2Wg-NY·ξ),則ghost區(qū)域網格點的總數為兩者之和,可以整理為4Wg·(NX·δ+NY·ξ)。綜上,引入的ghost網格點的總數所占任務子塊網格點數的比例Pg可以表示為:
(7)
(8)
從式(7)或式(8)中不難發(fā)現ghost網格點數量占任務子塊網格點數量的比例Pg是隨著任務子塊網格點數的增加而降低的,因此,為了使ghost網格點引起的開銷對整個任務子塊計算性能的影響減小,就需要設置較大的子塊數據規(guī)模,如果我們在一個N=500的方形區(qū)域上,若Rd=0.26,那么由式(8)所估算出來ghost網格點所占任務子塊總網格點數量比例將達到40%。這時由ghost網格點引起的傳輸和計算等開銷對程序整體執(zhí)行性能的影響將是十分明顯的??梢酝ㄟ^增加子塊網格點數規(guī)模來降低ghost區(qū)域帶來的影響,但回收內部區(qū)域計算結果帶來的傳輸開銷是伴隨著加速器端任務增加而增加的。
再次,內外子區(qū)域劃分,造成CPU計算的外部區(qū)域的形狀是不規(guī)則的,降低了CPU端計算的訪存效率等,也是使異構程序性能受限的原因。
最后,測試平臺上的Haswell CPU的計算能力也很強,其峰值性能接近單塊MIC卡的峰值性能,因此CPU+MIC異構并行相對于純CPU并行的性能加速效果不那么顯著。
本文重新設計了高精度CFD求解器CNS在Offload模式下的異構程序,結合結構化網格下有限差分計算和4階Runge-Kutta顯式時間推進方法的特點,提出了一種基于對任務子塊內外子區(qū)域再劃分的“CPU+加速器”異構混合并行算法,即subdomain-Offload算法。該算法從降低異構計算資源之間的PCIe數據傳輸開銷出發(fā),同時改善了CPU和加速器之間的負載均衡,明顯地提高了異構程序的單節(jié)點性能。測試和分析結果表明:
1)subdomain-Offload算法相對原有異構并行版本(direct-Offload算法)有平均5.9倍的性能提升,降低異構計算資源之間的數據傳輸開銷,改善CPU和加速器的負載均衡對CNS異構程序的性能提升是顯著的。
2)基于內外子區(qū)域劃分的異構并行算法相較于純CPU的MPI/OpenMP兩級并行算法使用雙Intel Haswell CPU(Xeon E5-2670,每CPU 12核)計算的情況,使用單MIC卡(Xeon Phi 7120A)時的最大性能加速為1.27倍,使用雙MIC卡時的最大性能加速為1.45倍。
本文引入的基于內外子區(qū)域劃分的異構協(xié)同并行算法可進一步推廣到結構化網格下基于有限差分和顯式求解偏微分方程的其他問題,具有良好的可遷移性。未來,將從提高CNS 程序在MIC加速器端的單核計算能力和整體計算性能著手,進一步提升subdomain-Offload異構算法的單節(jié)點性能,包括進行向量化、編譯指令優(yōu)化等。同時,將嘗試將subdomain-Offload算法向其他結構的異構平臺(如CPU+GPU)進行移植并觀察其性能表現。