2017-06-02 29 views
0

在我的C++應用程序中,我應該每次都在進程間共享信息。使用MPI_Send和MPI_Recv可以很好地工作,但在我的工作中,發送/接收消息時不需要由進程形成的「同步障礙」。即使使用MPI_Isend類型等,程序中也會出現「同步障礙」。有沒有辦法在使用MPI的並行過程中共享內存?

找到的解決方案是將信息放在文件上(無需消息共享數據),以便進程可以在不等待另一個人到達特定的代碼點的情況下獲取/放置數據。它也可以工作,但它會使程序失去時間表現,這個想法恰恰相反。

因此,有一個內存空間(或方式),可以工作類似於上面描述的文件應用程序?不需要通過消息使流程進行通信,並且確保安全?

PS:「同步屏障」我的意思是一個進程必須等待另一個發送/ recv信息的時間。

+0

如果所有進程都在一臺計算機上,則可以使用POSIX共享內存。 –

+0

@MarkSetchell如果OP限於一臺機器,並且不想使用顯式消息,那麼他不應該首先使用MPI。 – Zulan

+0

@贊蘭我同意這一點,所以我沒有把它作爲答案。但是,如果他已經使用MPI編寫了他的應用程序,並且想通過分享一些內存來加速其中的一部分,我的建議可能會有所幫助。 –

回答

1

是的,可以在沒有與MPI同步的情況下訪問存儲器。這稱爲單向通信或RMA(遠程內存訪問)。稱爲窗口的存儲區域必須明確可用於此,例如,使用MPI_Win_create。內存訪問是使用像MPI_PutMPI_Get這樣的函數明確指定的。請注意,它們中的每一個都是非阻塞的,並且數據移動必須顯式同步。總體而言,存在相當多的樣板和陷阱,因此請仔細閱讀材料。

這裏是更多detailed introduction

+0

謝謝你的回答。您的建議似乎是一個很好的選擇,而不是使用文件。我會嘗試研究和評估它是否適合我的應用。 – GLMF

+0

我認爲這對我有好處,我正在學習。我意識到,對於我的應用程序來說,使用鎖定/解鎖獲勝的被動目標會很有趣,但我不知道什麼意思是像「原子操作」這樣的術語,並且我不太確定會發生什麼,例如,當我需要編寫一些本地信息,並同時具有讀取或寫入過程。你有另外一種材料可以更好地解釋嗎? – GLMF

相關問題