曹立強,羅紅兵
(北京應用物理與計算數學研究所,北京 100088)
科學計算應用不僅輸出可視化(Visualization)和檢查點(Check Point)數據,也輸出采樣數據(Sample Data)。一般的串行科學計算應用中,數據場規模較小,采樣輸出量少,不容易發生采樣數據的I/O瓶頸。然而,一些并行科學計算應用設定的采樣點數量較多,I/O較為頻繁,采樣數據I/O容易發生瓶頸制約。以美國模擬慣性約束聚變的pF3D程序[1]為例。在超算TOP500上榜的Intrepid系統[2]中,16 000個進程的pF3D程序在完整的運行周期中輸出3.43 GB采樣點數據,耗時245 s,約占程序總運行時間的20%。采樣數據I/O的平均帶寬為14 MB/s,遠低于該機并行文件系統I/O帶寬[3]。在一些與實際問題密切相關的算例中,國內的電磁場仿真程序JEMS-TD等也出現了采樣數據I/O的性能瓶頸。
通常,可視化與檢查點數據在空間上是數據場的全集,采樣數據是數據場的子集。采樣數據以幾何拓撲或者其它形式約束在數據場的特定區域,價值密度高于可視化數據[4]。通過對可視化數據與采樣數據的統計分析,用戶可以發現代表性的科學規律。然而一些并行科學計算應用可以設置數以萬計的采樣點,并且在迭代循環中頻繁輸出采樣數據,因此它的I/O次數較多。
高性能計算機中,規模較小而讀寫較為頻繁的數據不容易發揮并行文件系統的性能[5]。除了pF3D程序外,國內的一些大規模并行應用,例如模擬三維電磁場的JEMS-TD程序[6]、電磁耦合程序LAP3D[7]等,也在一定程度上遇到采樣數據I/O的帶寬制約。此外,當并行程序發生動態負載平衡與重啟動運行時,一些應用還出現采樣數據存儲的不一致問題。優化采樣數據的并行I/O效率、確保并行采樣數據的I/O一致性成為提高并行程序運行效率、保障并行程序正常運行的關鍵問題。
面對大規模并行科學計算應用采樣數據快速存儲需求,本文研究采樣數據的并行聚集I/O優化方法。
現有采樣數據的并行I/O可以分為應用采樣和數據輸出兩個步驟。首先,應用采樣。應用程序從數據場中選擇、讀取、記錄采樣點位置的數值,記錄在〈key,value〉對中;然后程序查找采樣點對應的文件,將變量值寫入其中,形成與采樣點一一對應,按時間、列序存儲的采樣數據文件集合。
大部分科學計算應用中,每個采樣點每次僅僅輸出幾十到幾百字節數據。參與I/O的進程多,每次讀寫數據量少是造成采樣點I/O瓶頸的主要原因。通常,文件訪問開銷可分解為數據I/O開銷和文件系統元數據開銷兩部分[8]。前者主要與數據塊大小和I/O帶寬相關;后者主要與目錄(Directory)中的文件數量相關。在單機系統中,進程數量、計算規模受到結點計算能力、內存容量和存儲容量的限制,文件數量少。元數據操作較少成為瓶頸。
并行文件系統與單機文件系統的性能特征不同。它一方面具備較高的并行I/O帶寬,另一方面有較高的元數據訪問延遲。此外,并行應用的計算規模可以比串行應用高出4個以上量級,其中采樣點數量也遠遠超出串行程序,與之對應的采樣點文件數量也會增長。較多的文件數量增加了并行文件系統元數據訪問延遲[9]。
領域專家對元數據訪問性能與文件數量的關系已經有一定認識。在pF3D程序采樣數據的并行I/O過程中,Langer等人通過多級目錄存儲采樣文件等方法減少同一層次的文件數量,提高文件系統元數據的訪問效率。測試表明,該方法可以有效縮短元數據訪問延遲,從而提高并行I/O效率。雖然該方法有一定效果,但是使用多級目錄后采樣數據管理的難度增加,而且I/O調用數量與每次讀寫的數據大小沒有變化,有進一步優化的空間。
MPI(Message Passing Interface)的集合并行I/O優化方法可以提高小塊數據的并行I/O效率[10]。常用的集合并行I/O加速方法包括兩階段I/O[11]和Data Sieving[12]等,它們可以重組大量小塊數據I/O成為少量大塊數據I/O。
兩階段I/O首先從參與并行計算的進程中選擇若干進程存取數據。輸出時,被選中的進程按一定規則接收其余進程的數據,合并原本小而非連續的數據塊成為大而連續的數據塊,再輸出到磁盤中達到加速目的。數據輸入的過程與輸出過程相反,被選中進程從文件系統獲得數據,然后將數據分配給參與計算的進程。雖然有多種并行I/O性能讀寫優化方法,但是這些優化方法往往局限在進程間的數據合并與拼接方面,不適用于迭代生成、逐漸累積的采樣數據。
科學計算程序在一個迭代步可以從一個采樣點獲得幾個到幾百個字節的數據,一般并行輸出方法在采樣點與文件之間建立映射,然后按迭代步向文件中增加數據,形成按文件存儲的采樣數據集合。這種I/O方法不僅產生較多文件和小數據I/O,降低并行I/O效率,還難以處理動態負載平衡與并行應用重啟動等較復雜的并行程序運行態[13]。
動態負載平衡與重啟動是并行程序,尤其是大規模并行程序特有的運行狀態,它們影響采樣數據存儲的一致性。在并行程序的動態負載平衡過程中,采樣點所在進程編號隨負載的調整而變化,它們改變了進程與文件的對應關系,增加了數據失效的風險。在并行程序重啟動運行過程中,部分進程的時序發生變化,一些計算過程被重復執行,如果其中包含采樣輸出,將導致采樣數據的不一致。
針對上述現狀,我們設計了采樣點數據并行聚集I/O方法,它的主要特點在于:(1)使用共享文件(Shared-one-file)并行I/O模式存儲采樣數據,降低文件數量;(2)在客戶端內存中設置采樣數據緩存,臨時存儲數據,降低小塊數據的I/O次數;(3)使用HDF5(Hierarchical Data Format release 5)數據格式庫[14],提供高效率、增量式的I/O支持。
在并行應用中,根據進程與文件關系,并行I/O主要分為共享文件與進程-文件對應(File-per-process)兩種模式。如果參與并行計算的進程同時向一個文件輸出數據,那么這種并行I/O模式是共享文件I/O模式;如果參與并行計算的進程同時向多個文件輸出數據,那么這種并行I/O模式是進程-文件對應并行I/O模式。
對比兩種并行I/O模式,共享文件并行I/O模式輸出的文件少,可以減少文件系統元數據操作時間,但是它存在文件描述符等共享資源,在一定程度上影響數據傳輸效率。進程-文件對應模式的進程間沒有共享的資源,但是它創建較多文件,元數據開銷高,對并行可擴展性有一定影響。
采樣數據一般具有存儲量較少、數據來源較多等特點,元數據操作延遲是主要的開銷來源。本文在兩種并行I/O模式中選擇共享文件并行I/O模式,減少文件數量,降低文件系統元數據開銷。
共享文件并行I/O模式在采樣點與文件之間建立多對一的映射關系。使用這種并行I/O模式,我們實現了采樣數據的聚集I/O方法。該方法中,不同的采樣點存儲于不同的數據集,多數據集存儲到一個文件。為了提高并行I/O效率,并行聚集I/O方法將采樣數據I/O分解為數據采集與數據輸出兩個過程,兩者以聚集緩存耦合在一起。數據采集過程中,采樣數據按遍歷序排列;在多個時間步之間,數據按時間步采樣順序緩存。輸出時,各進程首先轉置采樣點數據緩存,將數據排列順序調整為按時間步存儲,然后輸出數據到文件,如圖1所示。

Figure 1 Aggregation and transposition I/O of sampled data圖1 采樣數據的轉置與聚集I/O
圖1中,每個方框代表了一個采樣點數據。假設0進程是輸出進程,部署聚集緩存。0號進程有2個采樣數據,1號進程有3個采樣數據,n號進程有1個采樣數據。聚集輸出過程中,采樣數據按行序從應用中讀出,然后以列序緩存在各個進程。輸出前,各進程將緩存數據聚集到0進程,輸出到HDF5。
采樣點數據緩存在應用層,它合并采樣數據,減少I/O次數。使用采樣緩存過程中,需要保障采樣點數據存儲的一致性。用戶可以根據內存容量與采樣點數量等參數設定刷新步間隔,提高采樣點數據的存儲效率。
根據設置,系統使用生產者-消費者模型管理采樣數據緩存,當緩存未滿時,它可以不斷地接受數據;當緩沖區滿時,系統輸出采樣數據并清空緩存,然后才能暫存數據。與一般的生產者、消費者控制流程不同,采樣點數據的生產者-消費者模型有多源控制的特征。這里的多源控制是指:消費者不僅考慮緩存使用情況,還需要考慮動態負載平衡、重啟動等因素的影響。
負載平衡過程中,采樣點的處理器編號有可能變化,因此需要刷新緩存,重新計算采樣點在進程間的分布情況。在重啟動運行過程中,一些進程需要重演重啟動步與失效步之間的計算,在此過程中,數據已經采樣并存儲,需要跳躍部分時間步,以保障存儲的一致性。我們使用圖2的自動狀態機控制采樣點緩存。

Figure 2 FSM of aggregated buffer圖2 緩存的自動狀態機
運行過程中,并行程序不斷地生成采樣數據,這些數據被增加(Append)到緩存中,直到緩存滿,數據被刷新(Flush)到文件。如果是重啟動運行(Restart Recover),那么需要首先判斷采樣點數據文件狀態,獲取已經輸出采樣數據的名稱、狀態和位置;然后根據狀態拷貝(Copy)數據到緩存中,保證采樣數據一致性。如果發生負載平衡,那么采樣點數據也要被刷新到文件中,同時清空緩存。
采樣數據一般根據來源按列存儲成數據集合,集合大小隨著迭代步的增加逐漸增長。一般的I/O庫遞增數據集合需要讀出原始數據,添加數據后再輸出,覆蓋或刪除原始數據集。上述過程不僅操作步驟較多,效率也受到一定影響,為此,我們使用HDF5的Chunk I/O功能實現數據集的遞增式輸出[15,16]。HDF5有數據塊的空間管理功能,它可以將分散的數據塊虛擬成邏輯上連續的數據塊。使用Chunk I/O后,向數據集合增添數據只需要分配新的數據塊,不需要回讀數據,因此效率較高。
跨平臺、跨應用的數據存儲是使用HDF5數據格式的另一個優點。使用HDF5存儲的浮點數據,可以在不同平臺、不同應用間共享,提高了采樣數據的應用范圍。
通過共享文件并行I/O模式、用戶層的采樣數據緩存和HDF5的Chunk I/O方法,我們不僅擴展了采樣數據的應用范圍,還可以在保持采樣數據存儲一致性的同時減少采樣文件數量和I/O次數,優化I/O流程。上述方法可以提高采樣數據的并行I/O效率。
我們在北京應用物理與計算數學研究所研制的JASMIN并行編程框架中集成采樣數據并行I/O庫[17]。JASMIN框架有比較完善的軟件體系結構,其中的狀態變量可以反映程序的運行狀態。例如,本次迭代之前是否發生過負載的動態調整,或者是否是從重啟動運行等,這些狀態可以輔助調整采樣數據的I/O策略。
對于一般的并行程序,JASMIN框架預定義了hierarchy-level-patch三層數據組織結構。Patch內部包含數據片(Patch Data),數據片與變量對應。變量和數據片等定義提高了領域編程的代碼重用率。我們集成采樣數據并行I/O庫如圖3所示,其中VizCurveWriter是JASMIN框架與并行I/O庫的耦合模塊,中間SamplingVariable定義采樣點數據類型,SamplingData是采樣點數據來源。

Figure 3 Class diagram of writing sampled data圖3 采樣數據輸出模塊類圖
JASMIN框架中,PatchData是數據容器。采樣點數據由變量類SamplingVariable、數據片工廠類JSamplingDataFactory和數據片類SamplingData定義,它們分別派生自框架的Variable、PatchDataFactory和PatchData基類[18]。
采樣點變量(SamplingVariable)是為采樣點數據設置的變量,它說明從一個采樣點可獲得的數據類型、數量等信息。采樣點數據片(SamplingData)為采樣數據分配空間,每一個迭代步,用戶程序向采樣點數據片賦值。VizCurveWriter基于HDF5數據格式庫研制,它以行序緩存采樣迭代步的數據。輸出前,輸出轉置成列序,然后調用HDF5接口輸出數據。
使用JEMS-TD并行科學計算應用,在工作站和高性能計算機中比較采樣數據的聚合輸出與直接輸出性能。JEMS-TD是基于時域有限差分方法求解Maxwell方程組的全矢量三維電磁模擬仿真軟件。通過精確建模及全波電磁模擬獲得時域電磁近場和遠場信息,可實現天線分析、飛機、艦船等大型復雜裝備的電磁耦合及散射特性。在計算實際問題時,用戶通常希望獲得某些關鍵點的電磁場時域波形,這需要在每個迭代步輸出采樣數據。
我們使用的工作站包含1個Intel i7-3770四核處理器、8 GB內存和1個500 GB SATA3硬盤,其上安裝Fedora18 Linux操作系統,內核版本號為3.6.10-4,編譯器版本為gcc-4.7.2。設定JEMS-TD程序的數據場規模為60×60×60,采樣點在三維數據場中均勻分布。其中,x方向和y方向最少部署1個,最多部署8個,z方向最少部署1個,最多部署16個。采樣點數量從1擴展到1 024。使用4進程并行執行350個迭代步,每次迭代過程中,每個采樣點輸出32 B數據,總采樣數據量從11.2 KB擴展到11.2 MB。聚集與非聚集輸出帶寬比較如圖4所示。

Figure 4 Bandwidth comparison of the sampled data for JEMS-TD program圖4 JEMS-TD程序采樣數據輸出帶寬比較
圖4中,buffer代表并行聚集輸出,direct代表傳統輸出方法。在采樣點數量逐漸增加過程中,并行聚集輸出帶寬比直接輸出帶寬平均高49倍。聚集緩存不僅減少了I/O次數,也增加每次I/O數據量,這是并行聚集輸出方法提高性能的主要原因。
我們使用的高性能計算機包含128個計算結點,每個計算結點包含雙路12核Xeon 2680處理器和64 GB內存。總計包含3 072處理器核,峰值計算性能約120 TFlops。網絡系統由Intel OMNI網絡組成,理論帶寬100 GB/s。并行文件系統包含6組I/O服務器,總存儲容量590 TB,峰值I/O帶寬可達8.3 GB/s。
設定并行進程數量從24到1 536,采樣點數量從128個增加到8 192個。程序運行350步,每步采樣,每個采樣點輸出4個雙精度浮點數,總計輸出1.4 MB~175 MB采樣數據。傳統的非聚集I/O方法將產生128~8 192個采樣文件,每個文件只有11.2 KB。聚集I/O方法設定每100步刷新采樣緩存,如果不發生負載平衡與重啟動運行,通信聚集數據后,16次HDF5調用存儲所有的采樣數據到一個文件中。通過弱可擴展性對比采樣點數據的并行聚集I/O與直接輸出性能,如圖5所示。

Figure 5 Bandwidth comparison of parallel writing sampled data圖5 并行輸出采樣數據帶寬比較
圖5表明,24~1 536進程的并行聚集輸出方法平均提高7.5倍I/O帶寬,最高可達15.3倍。機群系統網絡測試中發現384進程通信存在性能奇點。由于網絡性能影響,對應的并行聚集I/O方法加速效果受到限制。如果排除網絡通信的性能奇點,那么并行聚集I/O方法的平均加速效果可以進一步提高。
通常,一次I/O操作的時間可分為元數據操作時間和數據操作時間兩部分。前者與文件數量相關,文件數量越多,元數據操作需要的時間越長;后者與傳輸的數據規模成正比,在采樣數據I/O過程中,雖然每次讀寫數據量較小,但是由于采樣點文件的數量較多,每次I/O的元數據開銷較高,造成每次I/O過程中時間開銷較高。在應用程序的執行過程中,采樣數據的讀寫通常比較頻繁。上述因素是采樣數據I/O時間較長的主要原因。
串行測試中,雖然采樣點文件數量少,但是較多的I/O調用、較小的數據塊導致非聚集輸出性能較低。使用緩存后,原始的小塊數據被合并,大量較小的I/O調用轉化為少量的大塊I/O調用,這是提高性能的主要原因。
并行測試中,聚集緩存一方面減少采樣點文件數量,另一方面將大量較小的I/O調用轉化為少量的大塊I/O調用。對于每一個較小的采樣數據,使用并行聚集I/O方法時首先被緩存,然后通信,聚集到輸出進程,寫入到文件。這雖然增加了操作步驟,但是聚集緩存輸出不僅提高數據傳輸和數據I/O的粒度,還減少文件數量,降低文件系統元數據操作開銷。對于采樣數據這種對大量文件中的小塊數據頻繁I/O的場景,能夠提高性能。
大規模并行計算應用的進程數量可以達到數萬以上,全應用采樣數據的并行聚集時間開銷高,可以采用分組并行I/O的形式提高并行聚集I/O的擴展性。在分組并行I/O中,數百至數千進程分為一組,組內聚集輸出,組間無共享信息,不需要同步,進一步提高大規模并行應用的采樣數據輸出效率。
與科學計算可視化數據和檢查點數據相比,采樣數據具有不同特征,它們的數據來源分散,每次采樣產生的數據量往往較小。一般的采樣數據讀寫方法不僅產生較多文件,還以小塊數據頻繁增量I/O模式為主。這些I/O特征不能在高性能計算機中發揮文件系統的性能。本文設計了采樣點數據的聚合并行I/O方法,并在JASMIN框架中實現。該方法首先使用采樣緩存合并采樣數據,將小塊數據I/O改變為較大塊數據I/O;然后聚集輸出到文件,減少文件數量。在I/O過程中,我們控制緩存狀態,以保障并行I/O過程中采樣數據的一致性。實際應用表明,該方法可以高效率地支持科學計算應用并行輸出數百上千采樣點數據。在串行平臺測試中,對于不同的采樣點數量,該方法平均提高I/O帶寬49倍;在并行平臺的測試表明,對于不同的進程數量,該方法平均提高并行I/O帶寬7.5倍。