專利名稱:一種mpi并行數(shù)據(jù)存儲優(yōu)化方法
技術(shù)領(lǐng)域:
本發(fā)明涉及一種存儲優(yōu)化方法,具體涉及一種MPI并行數(shù)據(jù)存儲優(yōu)化方法,屬于 計算機并行處理領(lǐng)域。
背景技術(shù):
計算機的并行處理能力,在某些領(lǐng)域中具有重要的應(yīng)用價值;MPI (Message Passing Interface,消息傳遞接口)為編程人員提供了目前國際上最流行的并行編程環(huán) 境,對分布式存儲的可縮放并行計算機、工作站網(wǎng)絡(luò),以及集群系統(tǒng)都有良好的支持。然而, 在實際應(yīng)用中發(fā)現(xiàn),某些并行文件系統(tǒng)在執(zhí)行MPI_File_Write_at調(diào)用,對同一目標文件 進行多節(jié)點間多進程并行寫操作時,由于某些進程操作數(shù)據(jù)的首尾偏移量不在文件系統(tǒng)數(shù) 據(jù)塊大小的整數(shù)倍位置上,會導(dǎo)致最終寫結(jié)果的不一致。從并行文件系統(tǒng)本身解決這一問題,需要從文件系統(tǒng)的整體架構(gòu)著手,投入大量 的人力和物力,耗費成本較高;在應(yīng)用層每次寫操作前,預(yù)先保證所寫數(shù)據(jù)的首尾偏移量都 在文件系統(tǒng)數(shù)據(jù)塊大小的整數(shù)倍位置上,可以較為高效的完成并行寫操作,但需要編程人 員在工作中時刻注意這一問題,無形中增加了編程的任務(wù)量、削弱了程序的靈活性。
發(fā)明內(nèi)容
本發(fā)明的目的在于針對現(xiàn)有技術(shù)存在的問題,從應(yīng)用層提供一種優(yōu)化方法,保證 某些并行文件系統(tǒng)在執(zhí)行MPI調(diào)用,對同一目標文件進行多節(jié)點間多進程并行寫操作時, 最終寫結(jié)果的一致性。在某些并行文件系統(tǒng)中,當多個并行進程對同一目標文件進行寫操作時,就其中 某個進程而言,如附圖1所示,存在兩個主要的參數(shù)信息數(shù)據(jù)的偏移量(offset)和要寫的 字節(jié)數(shù)(count)。假設(shè)當前文件系統(tǒng)數(shù)據(jù)塊的大小是fsBlkSize (byte),對于進程A而言,其 要進行寫操作的數(shù)據(jù)首尾偏移量位置分布如圖1所示,其中,offset到下一個fsBlkSize整 數(shù)倍偏移量的距離是X (byte),而(offset+count)形成的末尾偏移量到上一個fsBlkSize 整數(shù)倍偏移量的距離是Y (byte),這樣,中間剩余數(shù)據(jù)段的長度就應(yīng)該是fsBlkSize的非負 整數(shù)倍。推而廣之,并行進程中每個進程的實際情況都可以用A進程來表示,只不過它們各 自的X、Y值不同,只要保證X、Y的取值、以及(X+Y)的和,介于0到fsBlkSize之間即可。 鑒于上述分析,本發(fā)明所采用的解決方案是,對要進行寫操作的目標文件涉及的MPI函數(shù) (MPI_File_open、MPI_File_write_at 和 MPI_File_close),進行同參異名式封裝,并在應(yīng) 用程序中將涉及目標文件的MPI操作(文件打開、寫文件和文件關(guān)閉),都采用封裝后的函 數(shù)(比如,分別對應(yīng)為 MPI_File_open_Ex、MPI_File_write_at_Ex 和 MPI_File_close_Ex) 進行替換。封裝后的函數(shù)在進行并行寫操作時,可以依據(jù)由首尾偏移量位置決定的X、Y的 不同取值,分別采用不同的處理方式。本發(fā)明提供了一種MPI并行數(shù)據(jù)存儲優(yōu)化方法,包括以下步驟步驟一對欲進行寫操作的目標文件涉及的MPI函數(shù)調(diào)用,即文件打開MPI_File_open、寫文件MPI_File_write_at和文件關(guān)閉MPI_File_close,進行同參異名式封裝;步驟二在步驟一封裝的寫文件函數(shù)中,假設(shè)讀取到的當前文件系統(tǒng)數(shù)據(jù)塊大 小是fsBlkSize,根據(jù)當前操作數(shù)據(jù)的偏移量offset和要寫的字節(jié)數(shù)count,由offset 與fsBlkSize的數(shù)量關(guān)系,得到offset到下一個fsBlkSize整數(shù)倍偏移量的距離X,由 offset+count與fsBlkSize的數(shù)量關(guān)系,得到offset+count形成的末尾偏移量到上一個 fsBlkSize整數(shù)倍偏移量的距離Y ;其中fsBlkSize、X、Y的單位均為byte ;封裝的寫文件函 數(shù)根據(jù)所得到的X、Y值,采用不同的處理方式(1)如果當前進程操作數(shù)據(jù)的首尾偏移量都在文件系統(tǒng)數(shù)據(jù)塊大小的整數(shù)倍位置 上,即X、Y都為零,仍調(diào)用原MPI_File_Write_at函數(shù)進行并行寫操作;(2)如果當前進程的offset值不在文件系統(tǒng)數(shù)據(jù)塊大小的整數(shù)倍位置上,即X值 不為零,需要將此處長度為X的數(shù)據(jù)信息,暫時拷貝到一段區(qū)域中暫存,待該進程對目標 文件執(zhí)行關(guān)閉操作前,再將這部分暫存的內(nèi)容利用文件鎖機制,串行寫入到文件的實際位 置;(3)如果當前進程的offset+count值不在文件系統(tǒng)數(shù)據(jù)塊大小的整數(shù)倍位置上, 即Y值不為零,需要將此處長度為Y的數(shù)據(jù)信息,暫時拷貝到一段區(qū)域中暫存,待該進程對 目標文件執(zhí)行關(guān)閉操作前,再將這部分暫存的內(nèi)容利用文件鎖機制,串行寫入到文件的實 際位置;(4)無論X、Y取值為何種情況,只要中間剩余的長度為fsBlkSize整數(shù)倍的數(shù)據(jù) 段的長度不為零,即至少是fsBlkSize,都需要對其進行處理,處理方式是仍調(diào)用原MPI_ File_write_at函數(shù)進行并行寫操作;步驟三在應(yīng)用程序中,將所有欲進行寫操作的目標文件涉及的MPI函數(shù)調(diào)用,即 MPI_File_open、MPI_File_write_at 和 MPI_File_close,都采用步驟一中封裝后的函數(shù)進 行替換;替換后,對要進行寫操作的目標文件,均調(diào)用封裝后的函數(shù)進行操作。有益效果本發(fā)明的有益效果是(1)修改簡單。無需對某些并行文件系統(tǒng)做任何修改,僅通過在應(yīng)用層的少許修 改,就能以可以接受的效率,保證寫操作結(jié)果的正確性。(2)應(yīng)用簡便。所提供的解決方案便于實現(xiàn),也容易封裝成不同風(fēng)格的庫函數(shù),便 于滿足不同用戶的編程需要。(3)兼容性好。該方案涉及的參數(shù),均源于MPI原有函數(shù),故而封裝出來的庫函數(shù), 可以與MPI原有函數(shù)較好兼容,方便替換。
圖1——進程寫操作數(shù)據(jù)分布示意圖。圖2——封裝后MPI_File_open_Ex函數(shù)處理流程圖。圖3——封裝后MPI_File_write_at_Ex函數(shù)處理流程圖。圖4——封裝后MPI_File_close_Ex函數(shù)處理流程圖。
具體實施例方式下面結(jié)合附圖和具體實施方式
,對本發(fā)明做進一步的詳細描述。在內(nèi)存中開辟一段區(qū)域,用來對首尾偏移量中至少有一個不在文件系統(tǒng)數(shù)據(jù)塊大 小整數(shù)倍位置上的小塊數(shù)據(jù)(即X和Y的部分)進行暫存。此處定義了兩個結(jié)構(gòu)體rest_ data_t和reSt_data_gr0up_t。其中,reSt_data_t用來保存未對齊數(shù)據(jù)的暫存位置指針, 以及其在目標文件中的偏移量和長度;rest_data_gr0up_t在reSt_data_t結(jié)構(gòu)的基礎(chǔ)上, 封裝了 cntUockHandle和reSt_data_t,前兩者分別表示當前進程需要進行加鎖處理的有 效reSt_data_t數(shù)量和用于加鎖的文件句柄,而reSt_data_t可以定義成數(shù)組形式,其中的 元素用來記錄需要暫存的頭和尾的必要信息。在此基礎(chǔ)上,定義一個rest_data_gr0up_t 結(jié)構(gòu)體的全局變量gRestData,這是當前進程實際暫存數(shù)據(jù)時需要用到的重要變量。對目標文件寫操作涉及的三個MPI函數(shù)“MPI_File_open”、“MPI_File_write_ at”和“MPI_File_cl0Se”,進行同參異名式封裝,即函數(shù)的參數(shù)不變,而只是將函數(shù)名稱進 行簡單修改,比如,與前述部分相似,此處將上述三個函數(shù)依次封裝成MPI_File_0pen_EX、 MPI_File_write_at_Ex和MPI_File_close_Ex。經(jīng)過封裝后,在實際的應(yīng)用程序中,將涉及 目標文件的 MPI 函數(shù)調(diào)用,即 MPI_File_open、MPI_File_write_at 和 MPI_File_close (依 次對應(yīng)文件打開、寫文件和文件關(guān)閉),都采用封裝后的函數(shù),即MPI_File_0pen_Ex、MPI_ File_write_at_Ex和MPI_File_cl0Se_EX,分別進行簡單替換,采用封裝后的函數(shù)進行多 節(jié)點間多進程并行寫操作,可以正常實現(xiàn)并行寫功能。封裝的三個函數(shù)簡單介紹如下(1)對MPI_File_open函數(shù)進行封裝,如圖2所示,主要目的是在該函數(shù)原有功能 的基礎(chǔ)上,對每個欲進行寫操作的目標文件,創(chuàng)建一個鎖文件,封裝后的函數(shù)原型如下int MPI_File_open_Ex (MPI_Comm comm, char^filename, int amode, MPI_Info info, MPI_File*fh);函數(shù)說明該函數(shù)完成對欲進行寫操作的目標文件的打開操作,函數(shù)體中,依據(jù)目 標文件的目錄和名稱,在目標文件所在目錄下,生成了一個同名但多出一個“.lock”作為 后綴的臨時文件,作為鎖文件,并對gRestData進行初始化,其余操作完全調(diào)用MPI原有的 MPI_File_open 函數(shù)實現(xiàn)。(2)對MPI_File_Write_at函數(shù)進行封裝,如圖3所示,主要是依據(jù)當前進程操作 數(shù)據(jù)的首尾偏移量,對要寫的內(nèi)容進行區(qū)分處理,封裝后的函數(shù)原型如下int MPI_File_write_at_Ex (MPI_File_fh, MPI_0ffset offset, void*buf, int count, MPI_Datatype datatype, MPI_Status氺status);函數(shù)說明寫操作處理函數(shù),主要是依據(jù)要處理數(shù)據(jù)的偏移量offset和數(shù)量 count (以byte為單位),計算出當前要寫入數(shù)據(jù)的首尾偏移量,然后按照前述方案分別處 理——如果操作數(shù)據(jù)的首尾偏移量都是文件系統(tǒng)數(shù)據(jù)塊大小的整數(shù)倍,則仍然調(diào)用原始的 MPI_File_Write_at函數(shù)進行并行寫操作,從而實現(xiàn)了進程間的并行寫,這在一定程度上, 達到了大部分數(shù)據(jù)并行處理的效果;如果所操作數(shù)據(jù)的首尾偏移不在文件系統(tǒng)數(shù)據(jù)塊大小 的整數(shù)倍位置,則在當前進程操作數(shù)據(jù)的始末偏移量范圍內(nèi),將首尾偏移量調(diào)整到文件系 統(tǒng)數(shù)據(jù)塊大小的最近整數(shù)倍位置,對這部分內(nèi)容仍然按整數(shù)倍情況處理,剩下的頭和尾兩 塊數(shù)據(jù)自然比文件系統(tǒng)數(shù)據(jù)塊小,將頭和尾的內(nèi)容拷貝到一段區(qū)域中暫存,并將暫存位置、 偏移量和數(shù)量等信息,記錄在gRestData中備用。
(3)對MPI_File_cl0Se函數(shù)進行封裝,如圖4所示,主要功能是處理寫操作中可能 暫存起來的數(shù)據(jù),封裝后的函數(shù)原型如下int MPI_File_close_Ex(MPI_File*fh);函數(shù)說明該函數(shù)完成對目標文件的關(guān)閉操作,函數(shù)體中,在對完成寫操作的目標 文件進行關(guān)閉操作前,在文件鎖機制保證下,判斷該進程有沒有需要處理的暫存信息,如果 有,則將暫存的內(nèi)容寫入到文件的實際位置,然后解除文件鎖,并調(diào)用MPI_File_cl0Se函 數(shù),將文件關(guān)閉??傊瑢υ蠱PI函數(shù)進行封裝后,在用戶空間應(yīng)用程序中,將欲進行寫操作 的目標文件涉及的 MPI 函數(shù)調(diào)用,即 MPI_File_open、MPI_File_write_at 和 MPI_File_ close (依次對應(yīng)文件打開、寫文件和文件關(guān)閉),都要用封裝后的函數(shù),即MPI_File_open_ Ex、MPI_File_write_at_Ex和MPI_File_close_Ex,分別進行替換,用封裝后的函數(shù)實現(xiàn)某 些并行文件系統(tǒng)中,多節(jié)點間多進程對同一目標文件的并行寫操作在文件被打開的同時, 生成鎖文件;寫操作按照前述原理由封裝后的函數(shù)自動執(zhí)行;在文件關(guān)閉時,利用文件鎖 機制,處理寫操作中被暫存起來的數(shù)據(jù)。這些操作均由封裝后的函數(shù)實現(xiàn),用戶無需關(guān)注具 體的實現(xiàn)細節(jié),即可保證最終寫結(jié)果的正確性和一致性;封裝所需參數(shù)與原MPI的庫函數(shù) 完全一致,方便那些習(xí)慣MPI原有函數(shù)的用戶進行替換操作。本發(fā)明不僅限于以上實施例,凡是利用本發(fā)明的設(shè)計思路,做一些簡單變化的設(shè) 計,都應(yīng)計入本發(fā)明的保護范圍之內(nèi)。
權(quán)利要求
一種MPI并行數(shù)據(jù)存儲優(yōu)化方法,包括以下步驟步驟一 對欲進行寫操作的目標文件涉及的MPI函數(shù)調(diào)用,即文件打開MPI_File_open、寫文件MPI_File_write_at和文件關(guān)閉MPI_File_close,進行同參異名式封裝;步驟二 在步驟一封裝的寫文件函數(shù)中,假設(shè)讀取到的當前文件系統(tǒng)數(shù)據(jù)塊大小是fsBlkSize,根據(jù)當前操作數(shù)據(jù)的偏移量offset和要寫的字節(jié)數(shù)count,由offset與fsBlkSize的數(shù)量關(guān)系,得到offset到下一個fsBlkSize整數(shù)倍偏移量的距離X,由offset+count與fsBlkSize的數(shù)量關(guān)系,得到offset+count形成的末尾偏移量到上一個fsBlkSize整數(shù)倍偏移量的距離Y;其中fsBlkSize、X、Y的單位均為byte;封裝的寫文件函數(shù)根據(jù)所得到的X、Y值,采用不同的處理方式(1)如果當前進程操作數(shù)據(jù)的首尾偏移量都在文件系統(tǒng)數(shù)據(jù)塊大小的整數(shù)倍位置上,即X、Y都為零,仍調(diào)用原MPI_File_write_at函數(shù)進行并行寫操作;(2)如果當前進程的offset值不在文件系統(tǒng)數(shù)據(jù)塊大小的整數(shù)倍位置上,即X值不為零,需要將此處長度為X的數(shù)據(jù)信息,暫時拷貝到一段區(qū)域中暫存,待該進程對目標文件執(zhí)行關(guān)閉操作前,再將這部分暫存的內(nèi)容利用文件鎖機制,串行寫入到文件的實際位置;(3)如果當前進程的offset+count值不在文件系統(tǒng)數(shù)據(jù)塊大小的整數(shù)倍位置上,即Y值不為零,需要將此處長度為Y的數(shù)據(jù)信息,暫時拷貝到一段區(qū)域中暫存,待該進程對目標文件執(zhí)行關(guān)閉操作前,再將這部分暫存的內(nèi)容利用文件鎖機制,串行寫入到文件的實際位置;(4)無論X、Y取值為何種情況,只要中間剩余的長度為fsBlkSize整數(shù)倍的數(shù)據(jù)段的長度不為零,即至少是fsBlkSize,都需要對其進行處理,處理方式是仍調(diào)用原MPI_File_write_at函數(shù)進行并行寫操作;步驟三 在應(yīng)用程序中,將所有欲進行寫操作的目標文件涉及的MPI函數(shù)調(diào)用,即MPI_File_open、MPI_File_write_at和MPI_File_close,都采用步驟一中封裝后的函數(shù)進行替換;替換后,對要進行寫操作的目標文件,均調(diào)用封裝后的函數(shù)進行操作。
全文摘要
本發(fā)明涉及一種MPI并行數(shù)據(jù)存儲優(yōu)化方法,包括以下步驟1、對欲進行寫操作的目標文件涉及的MPI函數(shù)調(diào)用,即文件打開、寫文件和文件關(guān)閉,進行同參異名式封裝;2、在步驟一封裝的寫文件函數(shù)中,根據(jù)當前文件系統(tǒng)數(shù)據(jù)塊fsBlkSize,當前操作數(shù)據(jù)的偏移量offset和要寫的字節(jié)數(shù)count,得到offset到下一個fsBlkSize整數(shù)倍偏移量的距離X,以及offset+count形成的末尾偏移量到上一個fsBlkSize整數(shù)倍偏移量的距離Y;封裝的寫文件函數(shù)根據(jù)所得到的X、Y值,采用不同的處理方式;3、在應(yīng)用程序中,將所有欲進行寫操作的目標文件涉及的MPI函數(shù)調(diào)用都采用步驟一中封裝后的函數(shù)進行替換。本發(fā)明無需對文件系統(tǒng)做任何修改,僅通過在應(yīng)用層的少許修改,就能以可以接受的效率保證寫操作結(jié)果的正確性。
文檔編號G06F17/30GK101957840SQ201010281839
公開日2011年1月26日 申請日期2010年9月14日 優(yōu)先權(quán)日2010年9月14日
發(fā)明者周澤湘, 張偉濤, 方侖, 李焰, 王道邦, 肖建國, 譚毓安, 韓雙牛 申請人:北京同有飛驥科技有限公司