我的unix/windows C++應用程序已經使用MPI進行了並行化:作業被拆分爲N cpus,並且每個塊都並行執行,相當高效,非常好的速度調整,作業完成正確。共享內存,MPI和排隊系統
但是有些數據在每個過程中都會重複出現,而且由於技術原因,這些數據不能通過MPI(...)輕鬆拆分。 例如:
- 5靜態數據,每個進程加載
- 4 GB的數據,可以在MPI分佈完全相同的東西的GB,所述多個CPU被使用,更小的這個每個CPU RAM是。
對於一個4 CPU的工作,這意味着至少20Gb的RAM負載,大部分內存'浪費',這是可怕的。
我在考慮使用共享內存來減少整體負載,每個計算機只能加載一次「靜態」塊。
所以,主要的問題是:
有什麼標準MPI方式在一個節點上共享內存?某種現成的+免費圖書館?
- 如果不是,我會使用
boost.interprocess
並使用MPI調用來分配本地共享內存標識符。 - 共享內存將由每個節點上的「本地主機」讀取,並且共享只讀。不需要任何形式的信號/同步,因爲它不會改變。
- 如果不是,我會使用
是否有任何性能問題或需要特別注意的問題?
- (有不會是任何「串」或過於怪異的數據結構,什麼都可以降至陣列和結構指針)
該作業將在PBS中執行(或SGE )排隊系統,在進程不乾淨的情況下退出,我想知道這些是否會清理節點特定的共享內存。
答案到目前爲止,測試和進一步的讀數,內存映射文件可能是最簡單的選擇: - 只有主MPI進程需要「準備」內存文件,這將被所有進程映射。 - 由於該文件將是隻讀的,因此不需要擔心內容的一致性。 - 沒有關於性能的想法壽命...也許只有實驗才能說明。 – Blklight 2009-12-27 15:50:24
性能完全取決於您的平臺。你的細節很稀疏,但是考慮到你可用的CPU和RAM,你不應該有一個大問題。如果您需要更改共享內存(您的分佈式數據),則不需要共享內存的內容是持久性的,只需要共享內存即可。在這種情況下,您的系統將浪費大量時間將所有內存更改寫入磁盤。 – 2010-01-10 05:38:35
已經離開,不能選擇最後的答案,最多的一個得到它:) 但無論如何,很多好的答案四周,但沒有什麼回答我正在尋找的東西,所以我想沒有廣泛的標準的方式來做到這一點! – Blklight 2010-01-11 19:40:28