一種對cpu與mic間數據傳輸進行優化的方法
2023-05-24 00:32:51 4
一種對cpu與mic間數據傳輸進行優化的方法
【專利摘要】本發明給出了對CPU與MIC間數據傳輸進行優化的方法。該方法通過預先在MIC卡上申請數據空間並重複使用,降低了頻繁申請空間所帶來的開銷;通過減少計算過程中CPU與MIC端數據傳遞的次數,降低了頻繁進行數據傳輸帶來的開銷。採用該方法對大規模磁約束聚變GTC程序進行了優化,結果顯示優化後程序的性能提升了近3倍。
【專利說明】—種對CPU與MIC間數據傳輸進行優化的方法
[0001]【技術領域】
發明涉及高性能計算領域中的並行程序設計及優化,與計算機硬體領域中的一種協處理器技術=Intel的MIC設備,具體說是一種對CPU與MIC間數據傳輸進行優化的方法。
【背景技術】
[0002]高性能計算通常是指利用許多計算資源,如很多的CPU或協處理器,來完成單個(PU所不能完成的計算任務。高性能計算處於快速的發展之中,我們國家在2013年6月發布的天河2號是目前世界上最快的超級計算機。為使程序運行在多個計算設備上,需要採用一些特定的編程方法,目前較為通用的並行編程方法有MP1、0penMP與PThread等。這些方法提供了簡易的編程接口,利用這些方法可以相對較為容易的將僅能運行在單個CPU上的串行程序改編成為可運行在許多計算設備上的並行程序。
[0003]MIC (Many Integrated Core)是Intel公司在2012年11月發布的一款協處理器。目前MIC晶片上有61個精簡的x86核心,每個核心上包含4個硬體線程,每塊MIC晶片上最多可啟動244個線程,提供了高度並行的計算能力。同時MIC晶片提供了 512位的向量化寬度,運算性能超過lTFlops。與其它協處理器不同的是,由於MIC晶片是對Intel x86結構的精簡,所以原本運行在CPU上的程序可直接運行在MIC上,這意味著對程序無需或僅需要進行少量的改動即可利用MIC的計算資源。
[0004]在MIC卡上運行程序的方式主要有三種:本地模式,對等模式與offload模式。本地模式是指程序直接在MIC設備上執行,該模式下無需對原有的CPU程序進行任何的修改,僅在編譯時添加-mmic編譯選項即可。對等模式是將MIC視為與CPU同等的計算節點,程序主函數在CPU與MIC端同時發起。該模式同樣無需對原有的CPU程序進行修改。Offload模式是指程序主函數由CPU發起,執行到並行計算部分交給MIC執行,並行計算部分完全運行在MIC上。MIC技術仍處於發展之中,目前較通用的MIC計算方式為offload模式。MIC設備的啟動及數據的傳輸由offload語句控制,而MIC端線程的啟動由OpenMP語句控制,儘管二者的作用不同,但它們的使用方式非常類似,都是通過在程序中添加編譯誘導語句來完成,因此對代碼的修改較少,編程也較為便捷。
[0005]在offload模式中,數據的傳輸是影響程序性能的一個關鍵因素。CPU與MIC之間通過PC1-E通信,由於PC1-E的數據傳輸速度較慢,因此頻繁的進行CPU與MIC的通信將大大降低並行程序的性能。數據的傳輸同時涉及到在不同設備上數據空間的開闢與釋放,每一次數據空間的開闢與釋放都需要佔用一定的計算時間,隨著數據量的增大,開闢與釋放操作所佔用的時間也越來越多。因此在數據傳輸時如果不能很好的控制數據傳遞的次數以及數據空間的開闢與釋放的次數,程序的性能必然會受到很大的影響。
【發明內容】
[0006]本發明給出了採用nocopy技術優化offload模式中數據傳輸的方法,從而達到提升程序整體性能的目的。本發明中,把數據空間的開闢置於計算之前,把數據空間的釋放置於計算完成之後,從而把數據空間的開闢與釋放次數降到了最低;該方法同時降低了數據在設備間的傳入與傳出次數,而且在數據傳輸時避免了數據空間的申請與釋放,從而進一步的降低了數據傳輸時間。
[0007]本發明的技術方案為:CPU為任務的發起端,負責申請CPU端的數據空間,並隨後啟動MIC設備;MIC為計算端,負責數據的處理與計算。CPU與MIC之間的通信由offload語句控制。CPU與MIC端的通信包含兩種情況:a)數據由CPU端傳入MIC端;b)數據由MIC端傳回CPU端。
[0008]CPU在啟動計算之前,利用offload語句中的nocopy子句,預先在MIC卡上申請數據空間並保持該空間以便重複使用,MIC設備對數據進行處理或計算時不再開闢空間,數據在CPU端與MIC端進行傳輸時也不再開闢或釋放空間,計算結束後,在CPU端利用nocopy子句釋放空間。
[0009]按實現的先後次序該方法可分為以下8步:
(O定位需要在MIC上運行的所有程序片段;
(2)在這些程序片段中找出所有的數組變量;
(3)確定每一個數組在不同程序片段間的依賴關係;
(4)在主程序中對所有的數組變量進行CPU端空間的分配及初始化操作;確保這些空間的分配在程序的起始階段,並位於循環的外部。
[0010](5)利用offload的nocopy子句在MIC設備上為第(2)步中確定的所有數組申請空間,並確保空間不被釋放。這些操作通過ALL0C_IF(.TRUE.)與FREE_IF (.FALSE.)子句來分別實現。空間的申請應位於MIC計算開始之前。
[0011](6)在CPU端啟動MIC卡進行計算,在計算過程中,數據傳輸操作應按照以下的原則:
a)使數據在計算前統一傳入MIC卡;
b)避免計算中出現CPU端與MIC端數據的傳入與傳出操作,如果出現了數據的傳輸操作,可將運行在CPU端的串行代碼也offload到MIC卡上,這樣使所有與該數據相關的操作均位於MIC端,達到避免出現數據傳輸操作的目的。對於不能避免的數據傳輸操作,在傳輸時應使用ALL0C_IF(.FALSE.)與FREE_IF(.FALSE.)子句來避免MIC端數據空間的申請與釋放。
[0012](7)計算完成後將數據統一由MIC端傳回CPU端。
[0013](8)在CPU端利用offload的nocopy子句釋放MIC卡上的數據空間。這些操作通過 ALL0C_IF(.FALSE.)與 FREE_IF(.TRUE.)子句來分別實現。
[0014]本發明的有益效果是:
在最大程度上降低了數據空間的開闢與釋放次數,將其對數據傳輸性能的影響降到了最低。同時有效的降低了數據在CPU與MIC端的傳遞次數,達到了優化性能的目的。並且這種方法實現簡單,需要的開發成本低廉。
【具體實施方式】
[0015]為了更明確的闡述本發明的技術方案和優越性,下面結合具體的案例和偽代碼,對本發明做出詳細說明。[0016]大規模磁約束聚變程序GTC是一個高度並行的程序,也是非常適合MIC的一個應用。該程序中包含兩個熱點模塊pushe與shifte,其中pushe負責計算,shifte負責通信,程序中處理的數據主要與數組zelectron相關。GTC程序可以簡單表示成以下的偽代碼:
1.程序初始化,在CPU端為zelectron分配空間
2.Do istep=l, mstep !開始外層循環
3.......4.Call Poisson_Solver !求解泊松方程,其中zelectron被修改。
[0017]5.......6.Do i=l, ncycle !開始內層循環
7.......8.Call pushe !進行計算,其中zelectron被修改
9.Call shifte !發送並接收相鄰節點的zelectron數據
10.......11.Enddo !結束內層循環
12.Enddo !結束外層循環
13.釋放CPU端zelectron的空間
14.程序結束
在上面的偽代碼中,pushe負責計算,該模塊可完整的移植到MIC上。shifte負責相鄰節點間的MPI通信,其中調用MPI通信函數的部分不能移植到MIC上,只能放在CPU端執行。在內層與外層的迭代中,zelectron都會被修改。將GTC移植到MIC上後,沒有採用nocopy優化的MIC程序可以表示成以下的偽代碼:
1.程序初始化,在CPU端為zelectron分配空間
2.Do istep=l, mstep !開始外層循環
3.......4.Call Poisson_Solver !求解泊松方程,其中zelectron被修改。
[0018]5.......6.Do i=l, ncycle !開始內層循環
7.......8.!DIR$ offload begin target(mic: 0) inout (zelectron: alloc_if(.true.)free_if (.true.))
9.Call pushe !進行計算,其中zelectron被修改
10.!DIR$ end offload
11.Call shifte !發送並接收相鄰節點的zelectron數據
12.......13.Enddo !結束內層循環
14.Enddo !結束外層循環
15.釋放CPU端zelectron的空間
16.程序結束·
可以看到上述偽代碼將pushe模塊移植到了 MIC上。在pushe計算之前將zelectron傳入到MIC卡上,傳入的同時進行數據的申請操作,pushe計算結束後將zelectron從MIC傳回CPU,同時進行數據的釋放操作。移植完成後程序的計算時間為120秒。採用nocopy技術優化後,MIC程序可以表示成以下的偽代碼:
1.程序初始化,在CPU端為zelectron分配空間
2.!DIR$ offload begin target(mic: 0) nocopy(zelectron: alloc_if(.true.)free_if (.false.)) !在 MIC 卡上為 zelectron 申請空間
3.!DIR$ end offload
4.Do istep=l, mstep !開始外層循環
5.......6.Call Poisson_Solver !求解泊松方程,其中zelectron被修改。
[0019]7.......8.!DIR$ offload begin target(mic: 0) in (zelectron: alloc_if(.false.)free_if (.false.))
9.將zelectron 從 CPU 傳入 MIC
10.!DIR$ end offload
11.Do i=l, ncycle !開始內層循環
12.......13.Call pushe !進行計算,其中zelectron被修改
14.修改shifte程序,將與zelectron相關的部分移植到MIC上
15.Call shifte !發送並接收相鄰節點的zelectron數據
16.......17.Enddo !結束內層循環
18.!DIR$ offload begin target(mic: 0) out (zelectron: alloc_if(.false.) free_if (.false.))
19.!將 zelectron 從 MIC 傳回 CPU
20.!DIR$ end offload
21.Enddo !結束外層循環
22.釋放CPU端zelectron的空間
23.!DIR$ offload begin target(mic: 0) nocopy(zelectron: alloc_if(.true.) free_if (.false.)) !在 MIC 卡上釋放 zelectron 的空間
24.!DIR$ end offload
25.程序結束 在上述的偽代碼中,將zelectron的申請放在了程序的開始階段,位於循環體的外部。將shifte中將與zelectron相關的部分都移植到了 MIC上,這就使得在內層循環中無需頻繁的進行zelectron數組的傳入與傳出操作,由於內層循環的迭代次數較多,這就極大的節省了計算的時間。zelectron數組的傳輸位於外層循環中,在傳輸時採用alloc_if(.false.) free_if (.false.)語句禁止了 MIC卡上數據空間的開闢與釋放,同樣節省了大量的計算時間。優化後GTC程序的計算時間由未優化時的120秒降低至了 45秒,可以看到,程序計算性能提升了約3倍。[0020]本發明針對MIC offload模式中的數據傳輸問題,提出了利用nocopy技術對數據傳輸性能進行優化的方法。通過上述實例分析可見,採用nocopy技術對數據傳輸進行優化後程序的性能有了很大的提升,而且這種方法實現簡單,對程序的改動較小,需要的開發成本也相對較低。
【權利要求】
1.一種對CPU與MIC間數據傳輸進行優化的方法,該方法包括以下步驟:
CPU為任務的發起端,負責申請CPU端的數據空間,並隨後啟動MIC設備;MIC為計算端,負責數據的處理與計算,CPU與MIC之間的通信由offload語句控制。
2.CPU與MIC端的通信包含兩種情況:a)數據由CPU端傳入MIC端;b)數據由MIC端傳回CPU端; CPU在啟動計算之前,利用offload語句中的nocopy子句,預先在MIC卡上申請數據空間並保持該空間以便重複使用,MIC設備對數據進行處理或計算時不再開闢空間,數據在CPU端與MIC端進行傳輸時也不再開闢或釋放空間,計算結束後,在CPU端利用nocopy子句釋放空間。
3.按照權利要求1所述的方法,其特徵在於,所有的計算都運行在MIC設備上,在計算過程中僅存在CPU與MIC間數據的傳輸,而不涉及MIC設備上數據空間的開闢與釋放,以避免這些操作帶來的大量耗時。
4.按照權利要求2所述的方法,其特徵在於,當數據在CPU與MIC間傳輸時,利用ALL0C_IF (.FALSE.)與FREE_IF (.FALSE.)子句強制避免數據空間的申請與釋放。
5.按照權利要求3所述的方法,其特徵在於,所有參與計算的數組都需要預先在MIC上申請空間;參與計算的數組越多,在MIC上申請的空間也就越大,該方法帶來的性能的提升也就越明顯;在計算結束後所有預先申請的數據空間都要一一釋放。
6.按照權利要求4所述的方法,其特徵在於,在數據傳輸過程中要確保數據在第一次使用之前由CPU端傳入MIC端,在最後一次使用之後再由MIC端傳回CPU端,從而減少數據在CPU與MIC間傳輸的次`數,進一步的提升性能。
【文檔編號】G06F9/46GK103530174SQ201310447726
【公開日】2014年1月22日 申請日期:2013年9月27日 優先權日:2013年9月27日
【發明者】吳韶華, 張廣勇, 沈鉑, 張清 申請人:浪潮電子信息產業股份有限公司