2017-05-16 120 views
0

我有一個生成系統矩陣的Python腳本。這是在一個處理器上連續發生的,在一個進程中,沒有任何並行處理。我也有解算器代碼。代碼使用MPI在許多處理器上運行。Python和MPI進程之間的內存共享策略

目前,Python腳本創建矩陣,將其寫入文件,通過subprocess.call(["mpirun ....."])調用解算器,解算器從文件中讀取矩陣,解析並寫回文件,最後Python腳本將結果讀迴文件。

現在我正在尋找更有效率的東西,避免文件讀/寫。一個想法是啓動MPI進程並在後臺運行,然後通過Python和求解器之間的某種進程間通信傳輸數據和命令。

如何在Python中進行進程間通信?還是有更好的選擇?

我想避免的是在MPI(MPI4Py)中使用Python腳本,這是因爲可調試性以及並行化沒有意義。

+1

您確定文件I/O是限速步驟嗎? –

+0

'mpiexec'通常將其標準輸入重定向到等級0的標準輸入,而對於所有等級的標準輸出則相反。只需打開一個管道到'mpiexec'命令,發送矩陣,然後讀取結果。只要確保除標準輸出外沒有其他等級的輸出。或者使用'os.mkfifo()'創建一個單獨的FIFO。 –

回答

1

最簡單的方法是使用/dev/shm或其他一些RAM支持的臨時文件系統。鑑於你在Python中工作,這可能會給出非常合理的性能。只有在測量結果明確表明這是一個瓶頸並且有改進性能的潛力時,我纔會訴諸於更復雜的方法。

現在當然假設至少有一些MPI等級在運行Python腳本的同一個節點上運行。如果不是所有的隊列都在同一個節點上運行,則可能需要在MPI求解器中廣播/分散數據。

現在您可以使用MPI的功能來動態建立通信(MPI_Comm_connect等)。或者你甚至可以使用動態過程管理,例如使用MPI_Comm_spawn而不是來自Python的mpirun。我認爲這會帶來更多的複雜性,並且與RAM支持的文件相比,可能不會帶來顯着的性能提升。它在HPC系統上可能也得不到很好的支持。

相關問題