我有一個可在多個計算節點上運行的大規模代碼,可運行在許多CPU內核上。代碼使用C++並與OpenMPI並行。用於複雜對象的MPI共享內存
我的代碼有一個非常大的對象(〜10GB內存使用量),它是由每個MPI進程讀取的。該對象偶爾會更新(可以通過單個進程完成,只需讀取數據文件即可)。
我到目前爲止一直在做的是給每個MPI過程一個這個對象的副本;但這意味着我受到嚴格的RAM限制,無法使用節點的全部CPU功能。所以,我一直在閱讀有關MPI 3規範中的共享內存。
我的問題是:跨MPI流程共享複雜對象的最佳方式是什麼?在我發現的所有例子中,創建了MPI共享內存窗口並用於交換簡單的數據結構(浮點數,整數數組等等)。我的全局對象是一個自定義類類型,它包含許多成員變量,其中一些是指針,其中許多是其他複雜的類類型。因此,我覺得我不能只調用MPI_Win_allocate_shared
並傳遞我複雜對象的地址,特別是因爲我想分享有關成員變量的所有信息(特別是,我想分享基礎值指針類型成員變量 - 即在MPI進程之間共享「深度拷貝」,每個進程中所有虛擬內存地址都是正確的)。
是否有可能通過MPI共享內存實現這種「深度共享」,如果有,是否有這樣做的「最佳實踐」?或者,另一個庫(例如boost進程)是否使這對我更加可行/直接?
P.S.如果我找不到一個好的解決方案,我會採用混合MPI + pthreads方法,我知道我可以在每個節點上用pthreads輕鬆地創建這個全局對象。但我真的希望找到一個優雅的MPI專用解決方案。
指向一個進程的虛擬地址空間的指針在其他進程中沒有意義,除非共享內存映射到完全相同的基址。你想要的並不是不可能實現的:它可以歸結爲在所有進程的所有內存空間中找到一個足夠大的空洞,並且使用首選地址調用mmap(),但既不可移植也不保證每個每次。正確的解決方案是使用相對指針並在取消引用前將基地址添加到每個指針的值。 –
請注意,當底層通信器的進程組跨越多個共享內存節點時,無法使用'MPI_Win_allocate_shared'。在這種情況下,應該使用通常的MPI RMA。 –
我的計劃是像你說的那樣使用RMA爲每個節點獲取一個對象的副本,然後在每個節點上使用共享內存,因此每個節點只有一個對象的副本(這足以保留我的內存使用量最小 - 只需要避免在1個節點上有n個副本。)另外,我正在尋找一個有保證的可移植解決方案(該代碼需要可靠工作,並且理想情況下也應該在Linux和Windows上運行)。當你說「正確的解決方案是...」時,你能否更詳細地解釋這種技術如何解決我的問題?任何僞/示例代碼也會有所幫助。謝謝! – davewy