2017-09-12 65 views
1

我有一個Python應用程序,需要加載相同的大 陣列(〜4 GB),並做一個完美的並行功能 該陣列的塊。該陣列開始保存到磁盤。Python混合多處理/在同一節點共享內存的MPI

我通常與 類似,比方說,10個節點,每個節點都具有8個 計算核心和大約32GB總RAM運行集羣計算機上此應用程序。

最簡單的方法(不起作用)是做 n = 80 mpi4py。它不起作用的原因是每個MPI內核都會加載4GB的地圖,這將耗盡 的32GB內存,導致MemoryError

另一種是rank=0是裝入 4GB的陣中唯一的過程,它農場出數組的塊到MPI核其餘 - 但這種方法是因爲網絡 帶寬問題慢。

最好的辦法是,如果僅1芯在每個節點負載 4GB的陣列和該陣列由可作爲共享存儲器 (通過multiprocessing?)對於每個 節點上剩餘的7根芯。

我該如何做到這一點?我如何讓MPI瞭解節點 並使其與multiprocessing協調?

回答

1

multiprocessing模塊沒有共享內存。

你可以看看joblib的方式來使用內存視圖來分享大的numpy數組。您可以使用manual memory mapping來避免重複數據。

要找到一種方法,只通過一次的每個節點上的數據,我會去發動每個節點一個MPI程序,然後使用joblib對剩餘的計算,因爲它會自動使用memmaping大型numpy的數組輸入。

+0

雖然我還沒有嘗試過,這已經指着我說: https://docs.python.org/2/library/multiprocessing.html#multiprocessing.Array ,以此來與'多共享內存' – dbrane

+0

這有效地模擬了共享內存,但是它比內存映射慢,因爲它依賴於具有代理功能的同步過程來讀取並從其正確讀取(這不是通信高效的)。另外,如果你需要線性代數,你將無法使用高效的numpy計算。 –