文章時間:2021年6月前
會議/期刊:TPDS 2022
作者背景: Oak Ringe
筆記時間:2022年01月13日周四
論文地址:https://ieeexplore.ieee.org/abstract/document/9501495
Abstract
美國百億億計算機(jī)項(xiàng)目(ECP)正在開發(fā)的應(yīng)用程序?qū)⒃诩磳⒌絹淼陌賰|億計算機(jī)上運(yùn)行,將產(chǎn)生前所未有的保真度和創(chuàng)紀(jì)錄的周期時間的科學(xué)結(jié)果。其中許多代碼基于粒子網(wǎng)格方法,并使用先進(jìn)的算法,特別是動態(tài)負(fù)載平衡和網(wǎng)格細(xì)化,以在Exascale機(jī)器上實(shí)現(xiàn)高性能。然而,這些算法在提高并行應(yīng)用效率的同時,由于其數(shù)據(jù)分布的不規(guī)則性和動態(tài)性,給I/O邏輯提出了新的挑戰(zhàn)。因此,雖然Exascale模擬的巨大數(shù)據(jù)速率已經(jīng)對現(xiàn)有的文件系統(tǒng)寫策略提出了挑戰(zhàn),但對生成數(shù)據(jù)的高效讀取和處理的需求,對數(shù)據(jù)布局策略引入了額外的限制,這些策略可以在將數(shù)據(jù)寫入二級存儲時使用。我們回顧了這些I/O挑戰(zhàn),并介紹了兩種在線數(shù)據(jù)布局重組方法,以實(shí)現(xiàn)讀寫性能之間的良好權(quán)衡。我們演示了使用這兩種方法對ECP細(xì)胞內(nèi)粒子模擬WarpX的好處,WarpX可以作為大量重要的Exascale應(yīng)用程序的母題。我們展示了通過理解應(yīng)用程序I/O模式和仔細(xì)設(shè)計數(shù)據(jù)布局,我們可以將讀取性能提高80%以上。
第一章 Intro
百億億次計算面臨許多挑戰(zhàn)。其中最引人注目的是存儲數(shù)據(jù)足夠快。由于存儲設(shè)備越來越大,但速度沒有快很多[1],相對于千兆級計算機(jī),與I/O帶寬[2]相比,百億億級系統(tǒng)在計算速度方面提供了更大的提高。實(shí)際上,峰值I/O帶寬與峰值計算速度(以每百萬浮點(diǎn)運(yùn)算的字節(jié)數(shù)為單位)的比率,對于當(dāng)前和預(yù)計的系統(tǒng)[3],[4]來說,正在急劇惡化。這種不斷增長的差異對應(yīng)用程序有著深遠(yuǎn)的影響,并推動它們走向非常高效的I/O。此外,許多exascale應(yīng)用程序正在使用高級計算技術(shù),如動態(tài)負(fù)載平衡和自適應(yīng)網(wǎng)格細(xì)化(AMR),由于內(nèi)存中數(shù)據(jù)的不規(guī)則布局,這些技術(shù)帶來了新的I/O挑戰(zhàn)。
雖然應(yīng)用程序正在轉(zhuǎn)向更多的在線分析和減少[3],但它們?nèi)匀簧纱罅康臄?shù)據(jù)供自己和其他團(tuán)隊(duì)進(jìn)行后期處理。因此,科學(xué)計算中的一個關(guān)鍵挑戰(zhàn)是獲得接近最佳的寫性能,從而使仿真花費(fèi)最少的時間執(zhí)行I/O。Exascale計算項(xiàng)目(ECP)中的幾個項(xiàng)目專注于優(yōu)化寫性能的方法。為了提高效率,這些方法通常以與內(nèi)存中使用的格式和布局相同的方式將數(shù)據(jù)寫入磁盤。但是,由于這些數(shù)據(jù)隨后必須被讀取以進(jìn)行后期處理和分析,因此理想情況下,數(shù)據(jù)應(yīng)該以一種既能提高模擬的立即寫入性能,又能提高后續(xù)分析的讀取性能的格式和布局寫入磁盤。然而,對訪問模式[5]、[6]的研究一般只考慮通過簡單的內(nèi)存數(shù)據(jù)安排生成的數(shù)據(jù);他們還沒有研究更復(fù)雜的內(nèi)存布局對讀取性能的影響。每個進(jìn)程包含多個數(shù)據(jù)塊的代碼允許使用各種I/O策略,以犧牲寫性能來提高讀性能。由于讀取可以在一個到數(shù)千個節(jié)點(diǎn)上執(zhí)行,而在每個節(jié)點(diǎn)上,我們可以從不同數(shù)量的進(jìn)程和線程中讀取數(shù)據(jù),因此這些權(quán)衡很復(fù)雜。每個選擇都能激發(fā)新的設(shè)計。
在本文中,我們在WarpX[7]上下文中研究了這些權(quán)衡。WarpX[7]是一個基于amr的細(xì)胞粒子(PIC)加速器物理建模代碼,使用了AMReX[8]框架。我們對常見的數(shù)據(jù)布局策略進(jìn)行了全面的研究,特別關(guān)注WarpX使用自適應(yīng)網(wǎng)格的挑戰(zhàn),以及每個進(jìn)程數(shù)十個塊對讀取性能的影響。我們的結(jié)果揭示了科學(xué)家應(yīng)該在什么時候考慮將寫優(yōu)化的格式轉(zhuǎn)換為讀優(yōu)化的格式;例如,是否對寫入數(shù)據(jù)的節(jié)點(diǎn)數(shù)進(jìn)行讀取優(yōu)化,以及是否在寫入數(shù)據(jù)后但在讀取數(shù)據(jù)之前進(jìn)行數(shù)據(jù)轉(zhuǎn)換。WarpX使用了重要的計算模型(AMR,動態(tài)負(fù)載平衡),這使得從這項(xiàng)研究中獲得的經(jīng)驗(yàn)教訓(xùn)與更大的顆粒網(wǎng)格和AMR社區(qū)相關(guān)。
雖然我們希望提供包含所有可能的閱讀模式的通用方法,但我們意識到不可能對所有的模式進(jìn)行優(yōu)化。事實(shí)上,即使對于本文中討論的一些較簡單的讀取模式,數(shù)據(jù)布局優(yōu)化問題也是一個挑戰(zhàn)。因此,我們沒有解決查詢優(yōu)化的額外復(fù)雜性,如[9]中所研究的那樣。我們也不研究在并行文件系統(tǒng)(如工作負(fù)載感知的條帶化[6]、[10]、[11])上獲得良好的I/O性能通常需要的其他優(yōu)化,因?yàn)镾ummit超級計算機(jī)上的GPFS文件系統(tǒng)在內(nèi)部處理?xiàng)l帶化,它不允許應(yīng)用程序修改條帶化策略。這些研究超出了本文的研究范圍。
我們的貢獻(xiàn)如下。1)評估WarpX的I/O性能,量化不同數(shù)據(jù)布局策略下的性能差異。2)沒有一種標(biāo)準(zhǔn)的數(shù)據(jù)布局策略能夠同時實(shí)現(xiàn)良好的讀寫性能。3)我們提出并實(shí)現(xiàn)了一種利用空間特征實(shí)時減少WarpX數(shù)據(jù)塊數(shù)量的方法,這大大提高了大多數(shù)常見讀模式的讀性能。4)基于Summit超級計算機(jī)采集的性能數(shù)據(jù)建立模型,研究了使用分段技術(shù)將數(shù)據(jù)異步移動到少量額外分段節(jié)點(diǎn)的可行性,同時修改數(shù)據(jù)布局以優(yōu)化讀性能。我們的研究表明,與原始數(shù)據(jù)布局相比,這種方法不僅提高了高達(dá)85%的讀性能,而且與事后數(shù)據(jù)布局重組相比,它在資源利用方面更高效。
第二章 常見的數(shù)據(jù)放置策略
2.1 邏輯上連續(xù)的布局
在第一種策略中,數(shù)據(jù)被線性化,然后作為邏輯上連續(xù)的塊完整地存儲在文件系統(tǒng)上。(我們之所以說邏輯上連續(xù),是因?yàn)樵谝粋€并行文件系統(tǒng)上,數(shù)據(jù)可能被自動劃分為“條帶”,并分布在不同的存儲服務(wù)器上)。
由于消息傳遞接口(Message Passing Interface, MPI)中的并行跨步I/O操作的支持,這種直觀的數(shù)據(jù)布局策略通常在I/O庫中默認(rèn)使用。但是,對于大型的基于MPI的并行應(yīng)用程序,它通常產(chǎn)生次優(yōu)的寫性能,因?yàn)殡m然駐留在每個MPI進(jìn)程中的分區(qū)數(shù)據(jù)可能是本地連續(xù)的,但生成全局連續(xù)的數(shù)據(jù)布局可能需要大量的進(jìn)程間通信。例如,圖1顯示了一個有四個過程的MPI程序,其中每個過程持有的數(shù)據(jù)按照一定的順序線性化(例如,行主)。為了將全局2D陣列線性化以生成邏輯連續(xù)的布局,需要對每個進(jìn)程的數(shù)據(jù)進(jìn)行重新排列。這種重新安排通常通過調(diào)用MPI- io函數(shù)來實(shí)現(xiàn),這通常會觸發(fā)一些MPI集體操作,以協(xié)調(diào)進(jìn)程之間的數(shù)據(jù)移動。對于高維數(shù)據(jù),這些重新安排的代價可能特別高,特別是當(dāng)許多流程參與或需要移動的數(shù)據(jù)量很大時。
2.2 組塊
由于生成邏輯連續(xù)的數(shù)據(jù)布局會產(chǎn)生過多的開銷,I/O庫通常采用一種稱為分塊的數(shù)據(jù)平放策略,因?yàn)樗鼉A向于以更有效的方式組織大規(guī)模并行程序運(yùn)行產(chǎn)生的數(shù)據(jù)。其基本思想很簡單:原始數(shù)據(jù)不是序列化為一個單獨(dú)的連續(xù)塊,而是被分割成多個塊,分別存儲在文件中,每個塊都是邏輯上連續(xù)的序列。例如,如圖2所示,每個進(jìn)程仍然在全局?jǐn)?shù)組的2×2塊上運(yùn)行。如果我們將每個進(jìn)程擁有的塊設(shè)置為一個塊,每個進(jìn)程就會在文件中分配一個獨(dú)占空間來存儲它自己的數(shù)據(jù)。這樣,在進(jìn)程之間重新安排數(shù)據(jù)所造成的開銷就大大減少了。此外,由于每個塊都可以單獨(dú)訪問,對數(shù)據(jù)子集進(jìn)行操作的性能也得到了改善。
并行HDF5為用戶提供了設(shè)置不同大小的塊的靈活性,只要塊是規(guī)則形狀。但是,如果塊大小太大或每個塊的形狀沒有被仔細(xì)選擇,仍然會觸發(fā)重排。例如,在圖2中,如果全局?jǐn)?shù)組的每一列都被設(shè)置為一個chunk,那么來自兩個不同進(jìn)程的數(shù)據(jù)被包含在一個chunk中。在這種情況下,重新安排導(dǎo)致進(jìn)程間通信的增加。此外,在一般情況下,各個進(jìn)程提供的數(shù)據(jù)可能不會形成一個常規(guī)的、可行的大塊。為了防止重新排列減慢應(yīng)用程序的執(zhí)行,通常采用兩階段I/O技術(shù)[12],[13]。通常,這種技術(shù)需要額外的計算節(jié)點(diǎn)/核,專門用于數(shù)據(jù)重新排列。ADIOS2[14]不允許用戶基于全局空間的邏輯視圖設(shè)置塊大小。相反,它將每個進(jìn)程本地的、連續(xù)的數(shù)據(jù)塊視為一個單獨(dú)的塊。此外,為了避免數(shù)據(jù)布局的進(jìn)程間協(xié)調(diào),ADIOS2采用了日志結(jié)構(gòu)的文件格式,因此這些chunk在全局?jǐn)?shù)組中的位置并沒有反映在實(shí)際的數(shù)據(jù)布局中。因此,ADIOS2需要額外的元數(shù)據(jù),不僅要跟蹤實(shí)際文件中的所有chunk,還要記錄chunk在全局?jǐn)?shù)組中的位置。
2.3 Sub-Filing
雖然分塊可以減少數(shù)據(jù)重排的開銷,但由于文件鎖定爭用,大規(guī)模并行寫操作的性能有時會大大降低。例如,我們在圖3a中顯示了一個512×512 2D陣列分布在四個MPI進(jìn)程上的配置。每個進(jìn)程上的四個128×128塊在全局空間中并不總是相鄰的。這種類型的數(shù)據(jù)分布模式經(jīng)常出現(xiàn)在支持動態(tài)負(fù)載平衡和/或自適應(yīng)網(wǎng)格細(xì)化(AMR)的科學(xué)代碼中。在圖2中,每個進(jìn)程只向文件中寫入一個連續(xù)的數(shù)據(jù)塊,相比之下,現(xiàn)在每個進(jìn)程需要發(fā)出四個單獨(dú)的寫操作,針對共享文件中的不同偏移量。因此,會發(fā)生文件鎖定爭用。
為了解決這個問題,一種叫做子文件歸檔的策略已經(jīng)被開發(fā)出來了。如圖3b所示,每個進(jìn)程創(chuàng)建一個單獨(dú)的文件來存儲它的數(shù)據(jù),而不是將所有的數(shù)據(jù)塊寫入一個共享的文件,它獨(dú)立地將數(shù)據(jù)寫入該文件,以利用并行文件系統(tǒng)的高帶寬。這種策略面臨三個挑戰(zhàn):1)跟蹤存儲在每個子文件中的數(shù)據(jù)塊會增加總體I/O性能的額外開銷;2)并行程序多進(jìn)程啟動時,會產(chǎn)生過多的子文件,使并行文件系統(tǒng)的元數(shù)據(jù)服務(wù)不堪重負(fù),給后期數(shù)據(jù)管理帶來不便;3)處理子字段數(shù)據(jù)需要找到并打開所有對應(yīng)讀請求的子文件,這可能會導(dǎo)致較大的讀延遲。
由于這些問題,I/O庫并沒有廣泛使用子文件作為它們的主要布局策略。然而,作為自定義應(yīng)用程序I/O層中的簡單I/O實(shí)現(xiàn),它仍然很流行。ADIOS2默認(rèn)使用子文件;為了緩解子文件歸檔引起的問題,它提供了通過MPI通信在并行進(jìn)程子集上聚合數(shù)據(jù)的選項(xiàng),從而減少了子文件的總數(shù),這可以顯著提高性能[15]。這種方法允許ADIOS2在一定程度上降低寫性能,以換取較輕的文件系統(tǒng)元數(shù)據(jù)負(fù)載。PnetCDF支持子文件歸檔,但在默認(rèn)情況下禁用它。并行HDF5計劃在未來[16]支持子文件歸檔。
第三章 數(shù)據(jù)放置策略:一個案列研究
選擇正確的數(shù)據(jù)布局策略對于并行計算程序至關(guān)重要,因?yàn)樗鼘λ鼈兊腎/O性能有巨大的影響。這對于具有復(fù)雜負(fù)載平衡模式的科學(xué)代碼來說尤其具有挑戰(zhàn)性,這些模式通常與對AMR的支持相結(jié)合。我們以WarpX[7](基于amrex的[8]particle-in-cell (PIC)模擬)為例,研究了并行I/O常用數(shù)據(jù)布局策略的優(yōu)缺點(diǎn)。
3.1 Summit的GPFS文件系統(tǒng)和WarpX I/O模式
在這里,我們首先簡要概述Summit的GPFS文件系統(tǒng)(我們在其中執(zhí)行所有測試)和WarpX I/O模式。Summit安裝了一個基于posix的IBM Spectrum Scale并行文件系統(tǒng)(以前它被稱為GPFS,為了簡單起見,我們在本文中使用GPFS)。該文件系統(tǒng)的最大容量為250pb,在FPP模式下,順序I/O的最大性能約為2.5 TB/s,隨機(jī)I/O的最大性能約為2.2 TB/s,即每個進(jìn)程都寫入自己的文件[17]。與Lustre不同,GPFS不允許應(yīng)用程序設(shè)置條帶大小和條帶計數(shù)。數(shù)據(jù)分條在GPFS內(nèi)部處理,不向應(yīng)用程序公開。因此,在本研究中,我們只關(guān)注用戶空間中的數(shù)據(jù)布局策略。
WarpX使用空間域分解和動態(tài)負(fù)載平衡來將阻塞內(nèi)存結(jié)構(gòu)分布到MPI進(jìn)程和相關(guān)的加速設(shè)備上。物理模擬框中的域分解數(shù)據(jù)由網(wǎng)格(“單元”)和粒子組成,網(wǎng)格可以是嵌套的細(xì)化分辨率(MR)。在1到N個網(wǎng)格塊之間動態(tài)分配給一個設(shè)備,以用戶定義的塊大小的倍數(shù)分布。與每個網(wǎng)格塊相關(guān)聯(lián)的是粒子數(shù)據(jù),粒子數(shù)據(jù)的數(shù)量在每個網(wǎng)格塊的負(fù)載中可以任意變化。由于粒子在模擬中移動,對粒子的操作比網(wǎng)格操作更昂貴,WarpX/AMReX為用戶提供了多種動態(tài)負(fù)載平衡算法,以實(shí)現(xiàn)細(xì)粒度的、計算平衡的分解,這可能會導(dǎo)致極其復(fù)雜的并行I/O模式[18]。
3.2數(shù)據(jù)布局對寫性能的影響
為了研究不同的數(shù)據(jù)布局策略對基于amr的代碼寫性能的影響,我們在Summit上建立了弱伸縮測試。使用并行HDF5和ADIOS2輸出不同布局策略的WarpX仿真數(shù)據(jù)(并行HDF5用于邏輯上連續(xù)的和塊化的數(shù)據(jù)布局,而ADIOS2用于子文件策略),因?yàn)檫@兩個I/O庫已經(jīng)集成到openPMD-api[19]中,這是WarpX和其他Exascale PIC代碼使用的I/O框架。特別地,我們將Parallel HDF5配置為“獨(dú)立I/O”模式,因?yàn)橛捎谀承┫拗疲凹wI/O”模式不適用于使用負(fù)載平衡和/或網(wǎng)格細(xì)化的科學(xué)代碼。在每次運(yùn)行中,我們使用一定數(shù)量的計算節(jié)點(diǎn)(最多1024個)啟動WarpX模擬,每個節(jié)點(diǎn)有6個MPI級別。根據(jù)所選的I/O庫,使用不同的數(shù)據(jù)布局策略將模擬數(shù)據(jù)寫入GPFS文件系統(tǒng)。每個計算節(jié)點(diǎn)在每個輸出步驟中寫入64gb的數(shù)據(jù),我們測量所有節(jié)點(diǎn)的總體寫入吞吐量。GPFS內(nèi)部將大數(shù)據(jù)塊分割成16mb的塊,并將它們分布在所有IO服務(wù)器上。雖然塊的大小不能在用戶空間中更改,但我們確保在寫性能測試中,每個進(jìn)程寫入的最小數(shù)據(jù)塊為16MB,以充分利用GPFS在Summit上的現(xiàn)有設(shè)置。所有測量結(jié)果如圖4所示。
圖4顯示,將WarpX數(shù)據(jù)組織成邏輯上連續(xù)的布局會顯著降低寫性能。在模擬執(zhí)行期間,每個進(jìn)程為每個網(wǎng)格變量操作數(shù)十個數(shù)據(jù)塊(例如,在我們的測試中,每排10個塊)。雖然最初在全局?jǐn)?shù)組中相鄰,但隨著模擬的進(jìn)展,由于負(fù)載平衡操作,這些塊在進(jìn)程之間交換。因此,每個進(jìn)程最終都可能獲得全局?jǐn)?shù)組中任意位置的數(shù)據(jù)塊。將這些不相鄰的數(shù)據(jù)塊重新排列成邏輯上連續(xù)的布局可能會導(dǎo)致相當(dāng)大的開銷。
啟用分塊可以提高寫性能;進(jìn)一步顯著的收益也可以通過添加sub-filing策略。當(dāng)進(jìn)程數(shù)量增加時,這種情況尤其明顯。如2.3節(jié)所述,如果所有進(jìn)程并發(fā)地將所有數(shù)據(jù)塊寫入單個共享文件,則文件鎖定爭用成為瓶頸。例如,當(dāng)運(yùn)行一個包含1536個進(jìn)程的模擬時,只啟用分塊的總體寫吞吐量仍然比同時啟用分塊和子文件的寫吞吐量低一個數(shù)量級。
當(dāng)啟用子文件策略時,修改子文件數(shù)量也會影響寫性能。如圖4所示,當(dāng)使用少量進(jìn)程時,與每個計算節(jié)點(diǎn)創(chuàng)建一個子文件(“chunking+ sub-file - fpn”)相比,每個進(jìn)程創(chuàng)建一個子文件(“chunking+ sub-file - fpn”)總是能夠獲得更高的寫吞吐量。隨著進(jìn)程數(shù)的增加,每個計算節(jié)點(diǎn)采用一個子文件的寫性能逐漸提高。這是因?yàn)楫?dāng)同時創(chuàng)建過多的子文件時,并行文件系統(tǒng)需要完成大量的元數(shù)據(jù)操作,這會降低整體寫性能。
3.3數(shù)據(jù)布局對讀性能的影響
我們在Summit上使用2.7 TB的WarpX數(shù)據(jù)集測試讀取性能,其中每個3D網(wǎng)格變量為256gb。我們關(guān)注這些網(wǎng)格變量,因?yàn)樗鼈兪沁M(jìn)行這類模擬的科學(xué)家的主要關(guān)注點(diǎn)。因?yàn)樗?D網(wǎng)格變量都有相同的形狀和大小,所以我們只顯示一個變量“B”的讀取結(jié)果。
為了演示分解如何影響讀取性能,我們使用兩個Summit節(jié)點(diǎn)使用三種不同的域分解方案讀取所有“B”,結(jié)果如圖5所示。分解1×1×2意味著3D數(shù)組沿著z維分成兩半,這樣兩個進(jìn)程都讀取一半的數(shù)據(jù)。類似地,分解1×2×1和2×1×1分別沿著y和x維分割3D數(shù)組。從圖5可以看出,在相同的分解方案下,讀取不同布局策略產(chǎn)生的數(shù)據(jù)時,性能差異較大,而且對于某些數(shù)據(jù)布局策略的分解方案,讀取性能也比較敏感。當(dāng)我們從大量的進(jìn)程中讀取數(shù)據(jù)時,我們會發(fā)現(xiàn)這種差異會產(chǎn)生重大的后果。
最后,我們使用不同的進(jìn)程數(shù)和不同的分解方案進(jìn)行了綜合測試,以衡量常用布局策略在不同讀取模式下的讀取性能。圖6顯示了讀取WarpX數(shù)據(jù)中的3D mesh變量時常用的六種數(shù)據(jù)訪問模式。根據(jù)讀取器和分解方案的數(shù)量,每個讀取器只能并發(fā)地讀取所需數(shù)據(jù)的一部分。當(dāng)多個進(jìn)程允許多個可能的分解方案時,我們只顯示獲得最佳讀性能的分解結(jié)果。
如圖7所示的結(jié)果顯示,如果只使用幾個進(jìn)程(8個或更少)來讀取數(shù)據(jù),邏輯上連續(xù)的布局在大多數(shù)情況下提供更好的讀取性能。然而,當(dāng)讀取xy平面時,邏輯連續(xù)布局的這種優(yōu)勢消失了,因?yàn)閤y平面的數(shù)據(jù)元素分散在一個邏輯連續(xù)的3D數(shù)組布局中。當(dāng)進(jìn)程數(shù)量增加時,讀取邏輯連續(xù)布局的性能也會下降。這是因?yàn)楦嗟倪M(jìn)程意味著對邏輯連續(xù)布局中的不同區(qū)域有更多的并發(fā)讀請求,這增加了向底層存儲設(shè)備發(fā)出的隨機(jī)查找操作。
當(dāng)只啟用分塊策略生成數(shù)據(jù)時,讀性能不佳。這是因?yàn)槊總€進(jìn)程讀取的數(shù)據(jù)是由許多塊組成的;因此,每個進(jìn)程不僅必須在文件中找到所有需要的塊,還必須將這些塊線性化,以便在內(nèi)存中生成一個連續(xù)數(shù)組。一般來說,較大的塊大小有助于緩解這個問題,但它也會顯著降低寫性能,如第2.2節(jié)所示。
如果在生成數(shù)據(jù)時同時啟用分塊和子文件策略,則讀性能會隨著進(jìn)程的增加而顯著提高。與只使用塊的情況相比,我們看到了讀性能的提高。然而,使用較少的進(jìn)程讀取數(shù)據(jù)仍然很慢,因?yàn)槊總€進(jìn)程仍然需要合并許多塊。
第四章 數(shù)據(jù)塊的聚類和合并
從上一節(jié)的性能研究中,我們發(fā)現(xiàn)沒有一種常用的數(shù)據(jù)布局策略能夠同時實(shí)現(xiàn)令人滿意的寫和讀性能。在本節(jié)中,我們將研究如何利用WarpX模擬數(shù)據(jù)中的空間局地性來優(yōu)化現(xiàn)有的數(shù)據(jù)布局策略,從而在寫和讀性能之間找到一個很好的平衡點(diǎn)。
4.1空間位置
如3.1節(jié)所述,在執(zhí)行基于amr的科學(xué)代碼(如WarpX)時,通常會觸發(fā)負(fù)載平衡操作。一旦負(fù)載均衡操作啟動,數(shù)據(jù)塊就會在進(jìn)程之間交換。因此,隨著模擬的進(jìn)行,每個進(jìn)程操作的數(shù)據(jù)塊可能與最初分配的數(shù)據(jù)塊非常不同,并且可能無法合并在一起形成一個具有規(guī)則形狀(例如,長方體)的更大的塊。這就是為什么沒有一種常見的數(shù)據(jù)布局策略能夠很好地處理WarpX數(shù)據(jù)的根本原因。例如,如果使用邏輯上連續(xù)的布局,由于在所有進(jìn)程中分布了大量的塊,重新安排布局將導(dǎo)致大量的開銷。如果啟用了分塊和子文件策略,盡管寫性能得到了提高,但從少量進(jìn)程中讀取數(shù)據(jù)會變慢,因?yàn)槊總€讀取器都需要讀取和線性化許多小塊。并行HDF5允許用戶基于全局?jǐn)?shù)據(jù)空間的邏輯視圖設(shè)置更大的塊以減少小塊的數(shù)量,但在這種情況下,設(shè)置很難匹配數(shù)據(jù)塊在進(jìn)程之間的物理分布。根據(jù)用戶設(shè)置,來自不同進(jìn)程或節(jié)點(diǎn)的數(shù)據(jù)塊很可能屬于相同的塊,從而導(dǎo)致昂貴的布局重新排列。
我們解決這個問題的基本想法是利用WarpX數(shù)據(jù)的空間局域性來減少數(shù)據(jù)塊的數(shù)量。具體來說,我們不是從整個數(shù)據(jù)空間的邏輯視圖來設(shè)置更大的塊,而是關(guān)注數(shù)據(jù)塊實(shí)際上是如何分布的,以及在每個進(jìn)程或計算節(jié)點(diǎn)中合并數(shù)據(jù)塊的可能性。如果進(jìn)程內(nèi)或節(jié)點(diǎn)內(nèi)的塊合并是可能的,我們可以減少塊的數(shù)量而不會造成太多的開銷,因?yàn)檫M(jìn)程內(nèi)或節(jié)點(diǎn)內(nèi)的數(shù)據(jù)移動比節(jié)點(diǎn)間的數(shù)據(jù)移動要便宜。下面是一個簡單的例子來演示這個想法。如圖8所示,假設(shè)mesh變量為512×512×512數(shù)組,分解為64塊128×128×128。經(jīng)過幾輪負(fù)載均衡后,不同進(jìn)程擁有的數(shù)據(jù)塊會呈現(xiàn)出不同的顏色。我們看到,雖然不可能合并每個進(jìn)程擁有的所有數(shù)據(jù)塊,但可以將一些數(shù)據(jù)塊合并成更大的塊。例如,可以合并進(jìn)程0上的一些塊,這將進(jìn)程0上的塊數(shù)量從16減少到6。此外,如果進(jìn)程0和進(jìn)程1運(yùn)行在同一個計算節(jié)點(diǎn)上,并且它們擁有的數(shù)據(jù)塊可以聚合在一起,則塊的數(shù)量可能會進(jìn)一步減少。
4.2 數(shù)據(jù)塊的聚類和合并算法
我們將Berger和Rigoutsos[20]提出的算法擴(kuò)展到WarpX仿真輸出的數(shù)據(jù)塊的聚類和合并。利用原算法對網(wǎng)格點(diǎn)進(jìn)行聚類,其目標(biāo)是在二維空間中找到覆蓋所有網(wǎng)格點(diǎn)的最小矩形數(shù)。我們修改了原來的算法,使它可以處理3D數(shù)據(jù),2)直到找到填充了原始數(shù)據(jù)塊的長方體,它才會停止。(在原來的算法中,每個矩形內(nèi)允許有空格。)
該算法的輸入是一組WarpX數(shù)據(jù)塊,這些數(shù)據(jù)塊要么屬于同一進(jìn)程,要么來自運(yùn)行在同一計算節(jié)點(diǎn)上的進(jìn)程。為了表示的簡單,我們假設(shè)這些數(shù)據(jù)塊都有相同的形狀;在實(shí)踐中,這種假設(shè)可以在一定程度上放寬。如算法1所示,第一步是在全局三維空間中找到包含所有原始數(shù)據(jù)塊的最小長方體。例如,圖8中包含進(jìn)程0所有數(shù)據(jù)塊的最小長方體的形狀為512×512×512。然后這個長方體被添加到FIFO隊(duì)列中。如果這個隊(duì)列不是空的,則開始新的while循環(huán)迭代。在這個while循環(huán)的每次迭代中,首先從FIFO隊(duì)列中取出一個長方體,該隊(duì)列包含一定數(shù)量的原始數(shù)據(jù)塊。如果這個長方體的體積等于所有原始數(shù)據(jù)塊的總量,這意味著我們已經(jīng)找到了一個更大的塊,所有原來的塊這個長方體擁有可以合并成,然后添加這個長方體列表l。否則,還有在這個長方體空間,它需要被進(jìn)一步分成較小的長方體。
該算法的關(guān)鍵部分是找到分割長方體的最佳位置。例如,考慮圖9。為了找到分割長方體的位置,我們需要首先計算原始數(shù)據(jù)塊沿每個維度的分布。例如,沿著x維,長方體可以被分成四片塊。在每個片中,一些位置被原始數(shù)據(jù)塊占據(jù),而其他位置是空的。原始數(shù)據(jù)塊在每個切片中的百分比構(gòu)成向量Uyz=[116,516,716,316]。這個向量表示一個直方圖,可以看作是一個一維的二值圖像。在x維度上找到最好的分割位置與在這幅圖像中檢測邊緣類似。因此,我們可以將拉普拉斯邊緣檢測器等常見的邊緣檢測技術(shù)應(yīng)用到這個直方圖中。例如,Lyz=?2Uyz是拉普拉斯微分算子應(yīng)用于Uyz的結(jié)果。為了找到這個直方圖中邊緣的位置,我們需要在Lyz中找到一個過零點(diǎn);由于拉普拉斯算子是二階導(dǎo)數(shù),所以零交叉對應(yīng)于Uyz中的拐點(diǎn),這就是我們要尋找的邊緣位置。類似地,我們可以分別計算y維和z維的Lxz和Lxy,并找到它們的零交叉點(diǎn)。在所有這些零交叉中,我們選擇直方圖中斜率最大的那個作為分割整個長方體的位置。在這個例子中,這個位置在y維上。
將當(dāng)前長方體分成兩個子長方體后,檢查這兩個子長方體是否為空。如果它們?nèi)匀粨碛性紨?shù)據(jù)塊,我們將它們添加到FIFO隊(duì)列中進(jìn)行進(jìn)一步處理。一旦FIFO隊(duì)列變?yōu)榭眨瑆hile循環(huán)退出,所有填充了原始數(shù)據(jù)塊的長方體都在列表l中,這意味著數(shù)據(jù)塊的聚類結(jié)束。現(xiàn)在我們需要合并這些原始數(shù)據(jù)塊的實(shí)際數(shù)據(jù)。具體來說,對于列表l中的每個長方體,我們將其擁有的所有原始塊的數(shù)據(jù)合并并序列化到一個更大的內(nèi)存緩沖區(qū)中作為一個新的數(shù)據(jù)塊。然后,所有這些新數(shù)據(jù)塊將作為“塊”寫入并行文件系統(tǒng)。
4.3數(shù)據(jù)塊聚類與合并評價
我們從兩個方面來評估數(shù)據(jù)塊聚類和合并算法:1)它提供的讀性能改進(jìn),2)它引起的寫開銷。特別地,我們將該算法應(yīng)用到真實(shí)的WarpX仿真輸出中。對于使用256個計算節(jié)點(diǎn)和1536個進(jìn)程運(yùn)行的WarpX,每個進(jìn)程運(yùn)行在大約10個原始數(shù)據(jù)塊上,每個計算節(jié)點(diǎn)上大約有64個數(shù)據(jù)塊。如果啟用了進(jìn)程內(nèi)塊集群和合并,平均而言,每個進(jìn)程操作的數(shù)據(jù)塊數(shù)量將從10個減少到3個。啟用節(jié)點(diǎn)內(nèi)塊集群和合并功能后,每個計算節(jié)點(diǎn)上的數(shù)據(jù)塊數(shù)量平均由64塊減少到10塊。節(jié)點(diǎn)內(nèi)集群和合并需要將運(yùn)行在同一計算節(jié)點(diǎn)上的進(jìn)程擁有的數(shù)據(jù)塊聚集到一個進(jìn)程中,這會導(dǎo)致額外的數(shù)據(jù)移動開銷。
通過減少數(shù)據(jù)塊數(shù)量,可以提高讀性能。如圖10所示,我們分別測量了進(jìn)程內(nèi)分塊聚類和節(jié)點(diǎn)內(nèi)分塊合并后讀取WarpX數(shù)據(jù)的性能,并將其與常用數(shù)據(jù)布局策略的性能進(jìn)行比較。正如我們所看到的,在六種常見讀模式中的四種(讀取整個域、yz平面、子區(qū)域、xz平面)下,啟用數(shù)據(jù)塊集群和合并的讀性能明顯好于只啟用分塊和子文件。但是,由于合并后的數(shù)據(jù)塊的形狀和大小可能不同(如圖8所示),啟用塊合并并不能保證在每種讀模式下(如在讀取xz平面和xy平面時)都能提高讀性能。
我們還通過考慮性能改進(jìn)和開銷來評估啟用塊集群和合并的整體效益。當(dāng)采用進(jìn)程內(nèi)塊聚類和合并時,WarpX數(shù)據(jù)中一個3D mesh變量的聚類塊開銷小于0.001秒,而在內(nèi)存中合并這些數(shù)據(jù)塊大約需要0.19秒。如果我們啟用節(jié)點(diǎn)內(nèi)塊集群和合并,這兩個數(shù)字分別是0.0003和1.03秒,但是通過MPI集合操作在每個計算節(jié)點(diǎn)內(nèi)收集數(shù)據(jù)塊會有大約0.25秒的額外開銷。在讀取端,啟用塊合并所節(jié)省的秒數(shù)是通過計算不合并和合并時的讀取時間之差來獲得的。因此,使用塊合并所節(jié)省的總時間是這樣計算的:用寫端所節(jié)省的時間減去讀端所節(jié)省的時間。如圖11a和11b所示,對于大多數(shù)場景,啟用塊合并可以縮短應(yīng)用程序工作流的總時間。
我們還通過考慮性能改進(jìn)和開銷來評估啟用塊集群和合并的整體效益。當(dāng)采用進(jìn)程內(nèi)塊聚類和合并時,WarpX數(shù)據(jù)中一個3D mesh變量的聚類塊開銷小于0.001秒,而在內(nèi)存中合并這些數(shù)據(jù)塊大約需要0.19秒。如果我們啟用節(jié)點(diǎn)內(nèi)塊集群和合并,這兩個數(shù)字分別是0.0003和1.03秒,但是通過MPI集合操作在每個計算節(jié)點(diǎn)內(nèi)收集數(shù)據(jù)塊會有大約0.25秒的額外開銷。在讀取端,啟用塊合并所節(jié)省的秒數(shù)是通過計算不合并和合并時的讀取時間之差來獲得的。因此,使用塊合并所節(jié)省的總時間是這樣計算的:用寫端所節(jié)省的時間減去讀端所節(jié)省的時間。如圖11a和11b所示,對于大多數(shù)場景,啟用塊合并可以縮短應(yīng)用程序工作流的總時間。
如果科學(xué)家對運(yùn)行在超級計算機(jī)上的作業(yè)的成本更敏感(通常通過計算節(jié)點(diǎn)和作業(yè)占用的時間的乘積來衡量),那么在這里,我們還計算通過啟用數(shù)據(jù)塊集群和合并來評估其有用性的節(jié)點(diǎn)秒數(shù)。如圖12a所示,啟用進(jìn)程內(nèi)塊合并時,寫入端每個變量的節(jié)點(diǎn)秒損失總是256×(0.001+0.19)=48.9。節(jié)點(diǎn)秒數(shù)的增加是用于讀取的節(jié)點(diǎn)數(shù)乘以啟用塊合并所節(jié)省的秒數(shù)。從圖中我們可以看出,如果讀取器的數(shù)量小于4,那么讀取器的節(jié)點(diǎn)秒的增益總是大于寫入器的節(jié)點(diǎn)秒的損失,說明我們應(yīng)該啟用進(jìn)程內(nèi)的塊合并。通過啟用進(jìn)程內(nèi)塊合并,我們可以節(jié)省150秒的節(jié)點(diǎn)時間來讀寫每個3D網(wǎng)格變量。但是,隨著reader數(shù)量的增加,reader端節(jié)點(diǎn)秒的增益下降,使得進(jìn)程內(nèi)的塊合并效率降低。對于節(jié)點(diǎn)內(nèi)塊合并的情況,我們做了相同的計算。如圖12b所示,由于節(jié)點(diǎn)內(nèi)的塊合并開銷較大,寫入端通常使用較多的計算節(jié)點(diǎn),只有當(dāng)采用分解方案2×1×1進(jìn)行讀取時,節(jié)點(diǎn)秒的增益大于損失。我們必須指出的是,大規(guī)模長時間運(yùn)行的模擬作業(yè)的輸出在生成后通常會被領(lǐng)域科學(xué)家反復(fù)訪問。因此,即使塊集群和合并在生成數(shù)據(jù)時產(chǎn)生了一些開銷,在下游數(shù)據(jù)工作流中通常也會有長期的好處。
綜上所述,進(jìn)程內(nèi)塊合并和節(jié)點(diǎn)內(nèi)塊合并都可以提高讀性能,但在超級計算機(jī)上,通過動態(tài)負(fù)載均衡和/或AMR,進(jìn)程內(nèi)塊合并可以更好地利用科學(xué)代碼的資源。對于普通的科學(xué)活動,數(shù)據(jù)只被寫入一次,但被多次讀取,從長遠(yuǎn)來看,這些方法可以帶來顯著的好處。
第五章 重組數(shù)據(jù)布局
雖然第4節(jié)提出的數(shù)據(jù)塊集群和合并方法相比僅啟用chunk和sub file策略提高了讀性能,但合并后的數(shù)據(jù)塊大小和形狀的調(diào)整缺乏靈活性,不利于獲得更好的讀性能。在本節(jié)中,我們將研究動態(tài)重組數(shù)據(jù)布局以進(jìn)一步提高讀取性能(如果有額外的系統(tǒng)資源可用)的可行性。
5.1不同的數(shù)據(jù)布局重組方式
如圖13a所示,假設(shè)我們在Summit上運(yùn)行一個模擬,周期性地輸出數(shù)據(jù),并啟用分塊和子歸檔功能,以達(dá)到最佳的寫性能。重組數(shù)據(jù)布局最簡單的方法是在模擬結(jié)束后啟動具有一定數(shù)量進(jìn)程的作業(yè),該作業(yè)將讀取模擬生成的數(shù)據(jù),并將其再次寫入具有新布局的并行文件系統(tǒng)。這就是所謂的事后數(shù)據(jù)布局重組。這種方法的優(yōu)點(diǎn)是它不會降低模擬工作的速度。其缺點(diǎn)是,在模擬作業(yè)完成后,領(lǐng)域科學(xué)家無法立即訪問重組布局中的數(shù)據(jù),因?yàn)閿?shù)據(jù)的讀寫可能需要很長時間,特別是在模擬輸出較大的情況下。
另一種方法是動態(tài)地重新組織數(shù)據(jù)布局。具體來說,在模擬運(yùn)行時,而不是讓仿真輸出直接寫入并行文件系統(tǒng),我們把數(shù)據(jù)通過MPI某些流程或其他通信協(xié)議形成我們所需要的數(shù)據(jù)布局,然后讓這些過程將數(shù)據(jù)寫入文件系統(tǒng)。現(xiàn)有的研究建議基于不同的技術(shù)實(shí)現(xiàn)這一功能,包括兩階段I/O和分期。例如,Tessier et al.[12]開發(fā)了一種高效的拓?fù)涓兄膬呻A段I/O算法,在執(zhí)行讀寫之前聚合連續(xù)的數(shù)據(jù)塊。Kumar等人提出了一種兩階段的方法,利用基于mpi的數(shù)據(jù)聚合動態(tài)地重組粒子數(shù)據(jù)布局。[21],[22]中也提出了基于分段技術(shù)的解決方案。盡管這些方法對某些應(yīng)用用例顯示出了有希望的結(jié)果,我們?nèi)匀恍枰私猓瑢τ谑褂脛討B(tài)負(fù)載平衡和/或AMR的科學(xué)應(yīng)用程序來說,在運(yùn)行中重新組織復(fù)雜的數(shù)據(jù)布局是否可行或有效,因?yàn)樵谶M(jìn)程之間移動大量的數(shù)據(jù)塊會導(dǎo)致巨大的開銷。
5.2數(shù)據(jù)布局重組的效率
為了研究這個,這里我們利用非阻塞分段技術(shù)強(qiáng)大的分期耦合器[23]異步移動計算節(jié)點(diǎn)的數(shù)據(jù)塊的仿真運(yùn)行時,幾個分段節(jié)點(diǎn)的數(shù)據(jù)塊合并為一個連續(xù)的塊被寫入并行文件系統(tǒng)之前。我們之所以選擇這種技術(shù),是因?yàn)樗茿DIOS2庫的一部分,WarpX可以通過openPMD-api[19]調(diào)用ADIOS2庫。我們在Summit上運(yùn)行測試以收集性能數(shù)字,然后構(gòu)建基于這些性能數(shù)字量化的模型。我們在表1中列出了這個模型中使用的符號。
在所有這些符號中,tw()、tr()和ts()依賴于設(shè)置的規(guī)模和并行性,這意味著它們是計算節(jié)點(diǎn)數(shù)量、每個節(jié)點(diǎn)的進(jìn)程數(shù)量和數(shù)據(jù)大小的函數(shù)。因此,我們首先展示了一些弱伸縮性和強(qiáng)伸縮性測試的結(jié)果,這些測試是用于理解在采用不同的設(shè)置時ts() (tw()和tr()在前面的部分中已經(jīng)研究過)的變化。如圖14所示,在我們的弱伸縮測試中,我們固定每個寫入器節(jié)點(diǎn)的數(shù)據(jù)大小(1 GB或2 GB),并測量不同寫入器和讀取器數(shù)量時的數(shù)據(jù)暫存時間。在我們的強(qiáng)伸縮測試中,我們固定了數(shù)據(jù)的總大小(100或200 GB),并在使用不同數(shù)量的寫入器和讀取器時測量數(shù)據(jù)暫存時間。從結(jié)果中我們可以看到,數(shù)據(jù)暫態(tài)時間ts()不能用一個簡單的公式來描述,這給這個問題增加了額外的復(fù)雜性。
現(xiàn)在我們來介紹一下我們的模型。如圖13a所示,仿真總時間為N[tc+tw(N,p,S)],離線重組數(shù)據(jù)布局所需時間為tr(m,q,NS)+tw(m,q,NS)。因此,事后數(shù)據(jù)布局重組的資源利用率為U=nN(tc+tw(n,p,S))+m[tr(m,q,NS)+tw(m,q,NS)]。動態(tài)數(shù)據(jù)布局重組,可能有兩種情況:1)如果ts (n, p m q S) + tw (m q S)≤tc,那么整個工作流的執(zhí)行時間是Ntc + ts (n, p m q S) + tw (m q S),因此,資源利用率可以計算(n + m) [Ntc + ts (n, p m q S) + tw (m q S)]。2)如果ts(n,p,m,q,S)+tw(m,q,S)>tc,計算將被延遲,直到當(dāng)前的模擬輸出被寫入文件系統(tǒng)。此時整個工作流的執(zhí)行時間為tc+N[ts(N,p,m,q,S)+tw(m,q,S)],資源利用率為U=(N +m){tc+N[ts(N,p,m,q,S)+tw(m,q,S)]}。對于給定的模擬設(shè)置,這些公式中的一些變量是固定的,包括n,p,S。盡管我們可以使用更多的暫存節(jié)點(diǎn),但由于資源有限,這個數(shù)目通常是固定的(占作業(yè)所占用的計算節(jié)點(diǎn)總數(shù)的1%)。如果n,p,m,q,S是固定的,tw(),tr(),ts()也是不可變的,因?yàn)樗鼈兪且蕾囉谟布摹S脩粑ㄒ豢梢钥刂频淖兞渴莟c和N,其中tc決定了仿真數(shù)據(jù)輸出的頻率,N決定了仿真運(yùn)行的時間。因此,我們在Summit上測量給定模擬設(shè)置的性能,以量化所有不變變量,并演示如何選擇tc和N,以使動態(tài)數(shù)據(jù)布局重組在資源利用方面比事后方法更有效。
我們使用256個節(jié)點(diǎn),每個節(jié)點(diǎn)啟動6個進(jìn)程來運(yùn)行WarpX模擬。我們還使用兩個額外的節(jié)點(diǎn),并為每個節(jié)點(diǎn)啟動32個進(jìn)程進(jìn)行數(shù)據(jù)暫存。每個模擬輸出的大小為256gb,這是一個3D網(wǎng)格變量(我們可以通過staging重新組織所有變量的布局,但這里我們只輸出一個變量,以與前幾節(jié)中的讀取性能比較一致)。我們還使用256個節(jié)點(diǎn)(每個節(jié)點(diǎn)6個進(jìn)程)進(jìn)行模擬,使用2個節(jié)點(diǎn)(每個節(jié)點(diǎn)32個進(jìn)程)進(jìn)行事后運(yùn)行,測試事后數(shù)據(jù)布局重組。在重組后的布局中,將2048×4096×4096 mesh變量分解為64個塊,分解方案為4×4×4。我們的測量結(jié)果如表2所示,tr(2,32,256N)=tr(2,32,256)N=11.1N, tw(2,32,256N)=tw(2,32,256)N=13.6N。
設(shè)定tc=40秒(即模擬每400步輸出一次數(shù)據(jù),在此設(shè)置下,每次模擬輸出大約需要0.1秒),則ts(n=256,p=6,m=2,q=32,S=256)+tw(m=2,q=32,S=256)=19.4+13.6=33<tc。< span="">動態(tài)重組的資源利用率為Uo=(256+2)(40N+19.4+13.6)=258(40N+33)。事后重組的資源利用Up=256N(40+1.4)+2(11.1N+13.6N)=10647.8N。只有Uo<up,即258(40n+33)<10647.8n根n≥26(模擬至少需要輸出26次數(shù)據(jù)),動態(tài)重組的資源利用率才會小于事后重組。< span=""></up,即258(40n+33)<10647.8n根n≥26(模擬至少需要輸出26次數(shù)據(jù)),動態(tài)重組的資源利用率才會小于事后重組。<></tc。<>
如果我們固定tc=20秒(即模擬輸出數(shù)據(jù)每200步),則ts(n=256,p=6,m=2,q=32,S=256)+tw(m=2,q=32,S=256)=19.4+13.6=33>tc。動態(tài)重組的資源利用率為Uo=(256+2)[20+N(19.4+13.6)]=258(33N+20)。事后重組的資源利用為Up=256N(20+1.4)+2(11.1N+13.6N)=5527.8N。因?yàn)?58(33N+20)>5527.8N,我們總是有Uo>Up,這意味著當(dāng)tc=20時,動態(tài)重組的資源利用率總是大于事后重組。事實(shí)上,在這種情況下,要使Uo<up,我們需要tc>8106.2N256N?258>limN→∞8106.2N256N?258=31.66。</up,我們需要tc>因此,我們需要選擇31.66<tc<33的tc。< span=""></tc<33的tc。<>
如果用戶想要模擬輸出至少50輸出(N≥50)和動態(tài)仿真不減速的重組(tc > 33),需要:tc Uo <?258 (Ntc + 33) < 256 N (tc + 1.4) + 49.4 N?tc < 407.8 N?85142 N?tc < 150.26,使資源利用率的動態(tài)重組不到因果的方法。
最后,我們評估了數(shù)據(jù)布局重組后的讀性能,并將其與其他方法進(jìn)行了比較。如圖15所示,數(shù)據(jù)布局重組后,讀性能明顯提高,并發(fā)讀器數(shù)小于16。特別是,當(dāng)使用2×1×1分解進(jìn)行閱讀時,與其他方法相比,閱讀時間減少了85%。然而,隨著并發(fā)讀取器數(shù)量的增加,數(shù)據(jù)布局重組所帶來的性能提升降低;大于64時,數(shù)據(jù)布局重組后的讀性能較其他方法差。因?yàn)橹亟M后的數(shù)據(jù)有64個塊;當(dāng)并發(fā)讀器超過64個時,一個塊可能會被多個讀器訪問,從而導(dǎo)致爭用。
第六章 相關(guān)工作
數(shù)據(jù)布局是并行計算機(jī)上I/O訪問延遲和帶寬的關(guān)鍵決定因素。安排數(shù)據(jù)訪問以提高I/O系統(tǒng)性能,無論是針對特定情況還是作為一個總體目標(biāo),已經(jīng)研究了20多年[24],[25],[26]。歷史上,并行I/O中間件和文件系統(tǒng)是分開開發(fā)的,以簡化實(shí)現(xiàn)并增強(qiáng)并行I/O組件之間的透明性。然而,最近的研究研究了數(shù)據(jù)布局感知的優(yōu)化策略,這些策略促進(jìn)了并行I/O中間件和文件系統(tǒng)的更好集成,并取得了很有希望的結(jié)果[2010-27]。
隨著處理器和存儲設(shè)備之間的性能差距不斷擴(kuò)大,越來越多的研究關(guān)注于更好地理解應(yīng)用程序的I/O模式,以及以不同布局預(yù)先安排數(shù)據(jù)的潛在好處。Liu等人[28]研究了當(dāng)讀模式與數(shù)據(jù)的原始組織不一致時,對數(shù)據(jù)分析任務(wù)中讀性能的影響。基于這些發(fā)現(xiàn),作者提出了一種方法,自動重新組織以前寫的數(shù)據(jù),以符合已知的讀模式。Tang等[29]人通過向該方法添加一個動態(tài)組件來擴(kuò)展這項(xiàng)工作,使其能夠識別數(shù)據(jù)使用模式,并在多個重新組織的布局中復(fù)制感興趣的數(shù)據(jù),從而在運(yùn)行時受益于常見的讀取模式。
最近的工作重點(diǎn)是優(yōu)化大規(guī)模數(shù)據(jù)中心中當(dāng)前使用的I/O庫,以適應(yīng)HPC應(yīng)用程序中的頻繁模式。[30]等人關(guān)注MPI-IO,為基于hdd或ssd的服務(wù)器上的每種訪問模式創(chuàng)建了重新組織數(shù)據(jù)副本的方法,用于低或高I/O并發(fā)性應(yīng)用程序,這取決于它們的模式。類似地,Tsujita等人的[31]研究了通過MPI-IO層進(jìn)行集體通信的聚合方法的性能優(yōu)勢。
HDF5 I/O庫的性能已經(jīng)被廣泛研究,并提出了多種方法來優(yōu)化數(shù)據(jù)訪問。Ji等人提出了幾種策略來優(yōu)化HDF5 I/O操作,包括塊存儲、并行讀寫、按需轉(zhuǎn)儲和500米口徑球面射電望遠(yuǎn)鏡項(xiàng)目的流處理。Mehta et al.[33]開發(fā)了一個新的HDF5插件,以便使用并行文件系統(tǒng)將單文件布局轉(zhuǎn)換為一個數(shù)據(jù)布局,該數(shù)據(jù)布局經(jīng)過優(yōu)化,并以一種獨(dú)特的方式存儲數(shù)據(jù),能夠?qū)?shù)據(jù)進(jìn)行語義后處理。Mu等人,[34],設(shè)計基于數(shù)據(jù)容器的存儲接口,提供數(shù)據(jù)分塊,利用多層存儲。
ADIOS庫使用分塊進(jìn)行數(shù)據(jù)訪問,并且可以對科學(xué)數(shù)據(jù)集使用塊范圍索引技術(shù),該技術(shù)只記錄數(shù)據(jù)塊[35]中所有記錄的取值范圍。Lofstead等人將基于ADIOS日志的BP格式與邏輯連續(xù)的NetCDF或HDF5格式進(jìn)行比較,考慮到不同的模式、布局和數(shù)據(jù)大小。另一個類似的研究[36]側(cè)重于大規(guī)模陀螺動力學(xué)環(huán)面模擬。它引入了一種新方法,可以在啟用分塊和子文件布局策略時減少ADIOS中的元數(shù)據(jù)開銷。
除了I/O庫之外,對象存儲也吸引了HPC社區(qū)的大量關(guān)注。像Intel的DAOS[37]和Seagate的Cortex[38]這樣的對象存儲是百億億次應(yīng)用程序面臨的元數(shù)據(jù)挑戰(zhàn)的潛在解決方案。
第七章 結(jié)論
我們對并行I/O的常見數(shù)據(jù)布局策略進(jìn)行了全面的研究。我們表明,由于具有動態(tài)負(fù)載平衡和/或AMR的科學(xué)代碼的復(fù)雜I/O模式,現(xiàn)有I/O庫中使用的標(biāo)準(zhǔn)數(shù)據(jù)布局策略不能同時實(shí)現(xiàn)令人滿意的寫和讀性能。
了解了現(xiàn)有數(shù)據(jù)布局的局限性,我們提出了兩種在線數(shù)據(jù)布局重組方法,目的是在這些復(fù)雜的I/O模式的寫和讀性能之間實(shí)現(xiàn)良好的權(quán)衡。第一種方法利用數(shù)據(jù)的空間局部性,在每個進(jìn)程或計算節(jié)點(diǎn)內(nèi)聚集和合并數(shù)據(jù)塊;我們表明,對于大多數(shù)常見的讀模式,該策略可以顯著提高讀性能,同時只產(chǎn)生最小的寫開銷。這種方法的性能結(jié)果使用了實(shí)際的復(fù)雜應(yīng)用程序I/O模式,無需對應(yīng)用程序代碼進(jìn)行任何更改就可以很容易地應(yīng)用。
第二種方法是充分利用現(xiàn)有的分段技術(shù)來重新組織數(shù)據(jù)布局。由于在重組中有更高的自由度,這種方法帶來的讀性能的潛在收益甚至比第一種方法更大。因?yàn)樾枰苿哟罅康臄?shù)據(jù)塊在在線數(shù)據(jù)布局重組過程中可能會導(dǎo)致重大的開銷,我們建立一個模型來理解何時以及如何使用staging-based數(shù)據(jù)布局重組可以獲得更好的資源利用率相比因果的方法。