2010-05-26 44 views

回答

2

我找到你的MPI程序的觀念中,所有的過程是獨立的很奇怪。我認爲,按照定義,MPI程序中的所有進程都不是獨立的,例如,在調用MPI_INIT之後,它們都在同一個通信器中,以便他們都「知道」彼此的存在。你可能已經編寫了你的​​代碼,以便過程在那之後不同步,但是過程之間仍然存在相互通信的手段。

研究一個機制(需要同步)是MPI_BCAST(廣播)。另一種方法是使用MPI_ISEND,這是非阻塞式發送操作,但遲早,一個進程或另一個進程必須接收,並且您的發送進程應該測試發送是否成功。

+0

那麼,他們越獨立,越是通過減少溝通和等待時間來接近完美的並列化 – Debugger 2010-05-26 19:12:15

0

MPI標準中沒有任何內容允許將「中斷」從一個等級發送到另一個等級(或等級)。一般而言,進展需要用戶代碼不時進入MPI庫。缺乏進展,行列之間沒有標準的溝通方式。

同步要求不時有一些條目進入MPI庫。 MPI_Barrier是同步的「大錘」方法。結合MPI_Reduce_Scatter,可以知道至少有一個排名存在錯誤。

1

由於non-blocking communication,處理MPI時,兩個完全不同的情況是獨立的,沒有同步。

在我看來,你想要的東西可以用這種方式實現:當發生錯誤時,一個進程廣播帶有指定「錯誤」標籤的消息,並且每個進程週期性地發佈非阻塞接收消息標籤。如果他們收到這樣的消息,這意味着最近發生了錯誤,他們可以做出相應的反應,否則他們會繼續正常執行。 (請注意,在這種情況下,「廣播」並不是指MPI_Bcast,因爲這是一個集體通信操作,因此它會阻止它,而只是將相同的消息發送給所有可能涉及的人。要保持進程之間沒有同步,那麼這個發送也必須是非阻塞的。)

+0

良好的通話,編輯的答案澄清。 – suszterpatt 2010-05-27 09:53:23

2

你指出的不一致使我想知道:你爲什麼使用MPI?它似乎不適合你的問題,並且沒有太多比試圖將一個方形栓塞入MPI的圓孔更糟。 「MPI進程之間沒有同步」使得它聽起來像你已經承擔了固有的串行農業工作量,並且正試圖將其轉化爲MPI。

說,你可以簡單地通過輪詢MPI_Irecv和MPI_Test來做你想做的事情。

相關問題