在本文中,我們將舉例介紹如何展開有限差分 (FD) 計算內(nèi)核,在分布式系統(tǒng)上運行。 此外,我們還將介紹一項技術(shù),展示如何處理不同節(jié)點或計算設備提供不同的計算速度時,異構(gòu)分布式系統(tǒng)出現(xiàn)的負載失衡的問題。 本文提供了一個示例源代碼,對我們的實施進行例證。
我們的構(gòu)建模塊是 FD 計算內(nèi)核,是地震成像 RTM (逆時偏移)算法中經(jīng)常用到的內(nèi)核。 ISO-3DFD (各向同性三維有限差分)stencil 執(zhí)行的計算在油氣調(diào)查和勘探復雜地下結(jié)構(gòu)精確成像方面起著重要作用。 在本文中,我們利用 [1] 和 [2] 中介紹的 ISO-3DFD 闡釋了簡單的基于 MPI 的分布式實施,支持分布式 ISO-3DFD 計算內(nèi)核在包括主要的英特爾® 至強™ 處理器和附加的英特爾® 至強融核™ 協(xié)處理器的混合硬件配置上運行。 此外,我們還對英特爾® 軟件工具進行了探索,以期幫助對負載均衡進行分析,提高性能和可擴展性。
分布式 ISO-3DFD
我們的說明案例是對 ISO-3DFD 計算 stencil 的一維分解。 我們設置了一個計算區(qū)域,該區(qū)域可跨所有 MPI 進程劃分。 對于此示例,我們在每臺計算設備(英特爾至強處理器或英特爾至強融核協(xié)處理器)上設置了一個 MPI 進程。 這一實施包括 MPI 進程之間(即處理器和協(xié)處理器之間)所需的 halo 交換。 當區(qū)域分解按照 [1, 2] 中描述的方式應用到 FD stencil 上時,應以每個算法時間步長為單位在子域內(nèi)實施 halo 交換。 這是因為靠近子域邊界的域的點值更新要求值在臨近子域上計算:
1
for(int k=1; k<=HL; k++)
//Stencil Half-Length HL
2
u_0 += W[k]*(
3
U0(ix+k,iy ,iz ) + U0(ix-k,iy ,iz ) +
4
U0(ix ,iy+k,iz ) + U0(ix ,iy-k,iz ) +
5
U0(ix ,iy ,iz+k) + U0(ix ,iy ,iz-k));
三維 stencil 的階由其半長 (HL) 值定義:比如,一個模板的第八階 stencil 由其半長 HL=8/2=4 的值定義。 相鄰子域之間要交換的 halo 的寬度也等于 HL。
這一示例代碼使用對稱執(zhí)行模型:代碼在主處理器和協(xié)處理器上運行。 這可通過完全對稱的 MPI 執(zhí)行來完成,其中英特爾至強處理器和英特爾至強融核協(xié)處理器上可以運行不同的進程。 例如,假定有一個名為hostname1 的雙插座系統(tǒng),其中有兩個英特爾至強融核協(xié)處理器插卡(名為 hostname1-mic0 和hostname1-mic1)連接至系統(tǒng)的 x16 PCIe* 插槽。 同時假定有兩個可執(zhí)行二進制:rtm.cpu (面向處理器架構(gòu)編譯,如英特爾® 高級矢量擴展指令集 2(英特爾® AVX2)和 rtm.phi (面向英特爾至強融核協(xié)處理器架構(gòu)編譯)。 使用英特爾® MPI 庫,開發(fā)人員可在 MPI+OpenMP* 對稱模式執(zhí)行中同時利用兩個可執(zhí)行二進制:
mpirun \
-n 1 -host hostname1 -env I_MPI_PIN_DOMAIN=socket -env OMP_NUM_THREADS=14 ./rtm.cpu : \
-n 1 -host hostname1 -env I_MPI_PIN_DOMAIN=socket -env OMP_NUM_THREADS=14 ./rtm.cpu : \
-n 1 -host hostname1-mic0 –env OMP_NUM_THREADS=244 ./rtm.phi : \
-n 1 -host hostname1-mic1 –env OMP_NUM_THREADS=244 ./rtm.phi
上述簡化的單節(jié)點示例假定 rtm.cpu 和 rtm.phi 均按照 [1, 2] 中描述的方式通過 OpenMP 線程并行。 MPI 用來幫助在節(jié)點、處理器和協(xié)處理器之間交換和同步數(shù)據(jù)。 OpenMP 用來通過指定處理器或協(xié)處理器的內(nèi)核劃分 MPI 進程計算工作。 上述示例還可擴展至多個采用處理器和協(xié)處理器的節(jié)點。 請參見 [3],了解有關(guān) MPI 對稱模式執(zhí)行的更多詳情。
以下是簡化的 MPI harness: 1) 假定每個英特爾至強融核協(xié)處理器相當于一個獨立的計算節(jié)點,未使用卸載編程語法 2) 允許通過非阻塞 MPI 調(diào)用進行異步 halo 交換。 用鄰近子域覆蓋計算并交換 halo 需要在每個子域上考慮兩種計算區(qū)域:
本地計算:隨距離變化的點 > 距離鄰近邊界的 HL。 即,進行 stencil 計算的點僅取決于以前在同一個子域計算的值。
Halo 計算:隨距離變化的點 <= 距離鄰近邊界的 HL。 即,進行 stencil 計算的點僅取決于以前在同一個子域計算的值。
按計劃,我們應具備以下條件:
MPI 實施的風格是簡單的最近鄰居 halo 交換。 首先,使用緩沖區(qū) BufferPrev 和 BufferNext 發(fā)布鄰近子域所需的 halo 異步接收:
接下來,先更新 Halo 計算區(qū)域中的點,因為鄰近子域?qū)⑿枰@些點:
halo 計算區(qū)域中的更新值異步發(fā)送至鄰近域:
當進行異步 halo 交換后,本地計算區(qū)域內(nèi)的點可進行更新,因為這些計算不依賴于鄰近域的值:
然后,使用 MPI_Waitall 同步調(diào)用檢查異步 halo 交換的完成情況。 最后將傳輸緩沖區(qū) BufferPrev 和BufferNext 中接收到的值復制到子域:
實際實施可參見本文所附的示例源代碼包。 它包含一個運行在 ISO-3DFD 代碼(以前在 [1, 2] 中發(fā)布)上的 MPI 層。 每個 MPI 進程可通過硬件設置(如睿頻加速模式、超線程和 ECC 模式(英特爾至強融核協(xié)處理器))調(diào)整性能,也可通過軟件優(yōu)化調(diào)整高速緩存阻塞、線程關(guān)聯(lián)和數(shù)據(jù)預取距離進行調(diào)整。參考原文,了解有關(guān)單個進程優(yōu)化和調(diào)整的詳情。 |