2010-06-13 73 views
1

我的MPI應用程序有一些過程可以產生一些大的數據。假設我們有N + 1個進程(一個用於主控,另一個用於工作),每個工作進程都會生成大量數據,現在只需寫入普通文件file1,file2,...,fileN。每個文件的大小可能會大不相同。現在我需要發送所有的fileM來排序M進程來完成下一個任務,所以就像所有的數據傳輸一樣。MPI大數據全部傳輸

我的問題是我應該如何使用MPI API有效地發送這些文件?我以前使用Windows共享文件夾來傳輸這些文件,但我認爲這不是一個好主意。

我想到MPI_file和MPI_All_to_all,但這些函數似乎不適合我的情況。簡單的MPI_Send和MPI_Recv似乎很難使用,因爲每個進程都需要傳輸大量數據,而現在我不想使用分佈式文件系統。

+0

您目前正在將N個文件寫入每個進程本地的磁盤,還是他們都住在同一個地方?我認爲你將數據寫入磁盤,因爲它不適合內存? – 2010-06-13 09:01:29

+0

我想在集羣上運行這個應用程序,所以我需要在不同的機器上傳輸這些數據,並且數據大小可能不適合內存。 – csslayer 2010-06-13 09:37:31

+2

什麼構成「大量」數據? MPI_Send/Recv由MPI_Count參數限制消息大小,該參數是一個32位值。 「大量」數據中有多少32位(4GB)塊? 每個等級有多少內存可供使用?這些數據在計算過程中是否存儲在內存中? 節點之間的互連是什麼?什麼是文件系統的互連?很可能,互連結構將比文件系統更快。 – 2010-06-14 13:36:41

回答

3

如果沒有更多的數據,只有您現在擁有的數據,無法準確回答您的問題。所以這裏有一些通用性,你必須考慮它們,看看是否以及如何在你的情況下應用它們。

  • 如果您的進程正在生成大型數據集,則他們不太可能立即執行此操作。與創建整個數據集之前等待等待,您可能想考慮按塊傳輸塊。
  • 我不認爲MPI_Send和_Recv(或它們的變體)很難用於大量數據。但是您需要考慮在流程之間的每次交流中找到適當的轉移金額。使用MPI,並不是一個簡單的情況,即消息啓動時間加上適用於所有發送消息的消息傳輸速率。例如,某些IBM實施的硬件在其一些硬件上具有不同的延遲和帶寬以用於小型和大型消息。但是,您必須自己弄清楚您的平臺帶寬和延遲之間的折衷關係。我在這裏給出的唯一一般建議是參數化消息大小和實驗,直到最大化計算與通信的比率。
  • 另一方面,您應該已經完成​​的測試之一是測量您平臺上各種尺寸和通信模式的消息傳輸速率。當你開始一個新系統的工作時,這是一種基本的減少測試。如果你沒有更適合的東西,STREAMS benchmark將幫助你開始。
  • 我認爲大量數據的全部傳輸是MPI通常使用的各種程序中的一種不常見的情況。您可能想要認真考慮重新設計您的應用程序以避免此類傳輸。當然,只有你知道這是否可行或有價值。從你提供的很少的信息看來,你似乎可能正在實施某種管道;在這種情況下,通常的通信模式是從進程0到進程1,進程1到進程2,進程2到3等。
  • 最後,如果您碰巧正在使用共享內存的計算機(如多核PC),您可能會考慮使用共享內存方法(如OpenMP)來避免傳輸大量數據。