2010-04-20 75 views
2

當我將MPI_Send發送到已完成的進程時會發生什麼?當我將MPI_Send發送到已完成的進程時會發生什麼?

我正在學習MPI,並用C寫了一個小型糖分佈模擬。當工廠停止生產時,這些過程結束。倉庫空倉時,它們結束。我可以通過查看MPI_Send的返回值來以某種方式告訴商店的倉庫訂單是否成功(因爲倉庫流程已經結束)?文檔沒有提到這種情況下的特定錯誤代碼,但沒有錯誤返回成功。

我可以這樣做:

if (MPI_Send(...)) { 
    ... 
    /* destination has ended */ 
    ... 
} 

和無視錯誤代碼?

感謝

+1

正如答案中所指出的那樣,行爲不是你可以依賴的。你所描述的並不完全符合如何使用MPI。相反,「倉庫」流程應該保持活躍狀態​​,明確回答無法填充的請求,並指出倉庫爲空。 – Novelocrat 2010-04-20 20:39:51

+0

Novelcrat:您應該將其作爲答案發布。 – caf 2010-04-20 22:07:19

回答

0

據我所知,在MPI標準定義沒有返回值和MPI_SEND()無輸出參數:它不提供發送事件的消息的任何信息,可能是因爲消息緩衝可以使得呼叫返回時結果中沒有可用的信息。

如果您希望一個進程看到另一個進程何時結束,您應該使用指定的標記發送帶結束進程的消息,並在另一個進程中發送nonblocking receives以查看是否發送了退出通知。

或者,如果您希望整個程序在一個進程停止時中止,那麼最簡單的方法就是在MPI_COMM_WORLD作爲通信器的調用過程中簡單調用MPI_Abort(),這將保證關閉所有進程。

編輯:要真正回答標題中的問題,「當MPI_發送到已完成的進程時會發生什麼?」:據我瞭解,這取決於是否使用緩衝。如果不使用緩衝,程序將掛起。如果使用緩衝,則MPI_Send()將緩衝消息並且該過程將繼續運行,但由於不會發布任何匹配的接收,所以該消息永遠不會離開緩衝區。這麼做會最終導致程序內存不足。

+1

謝謝,我仍然會試試這個。除此之外,我認爲MPI_Send不會返回任何您指的是C++版本。根據http://www.mcs.anl.gov/research/projects/mpi/www/www3/MPI_Send.html上的文檔,「所有MPI例程(MPI_Wtime和MPI_Wtick除外)都返回一個錯誤值; C例程作爲值的功能「。 – 2010-04-21 06:41:43

+0

在那些可能的返回值中,MPI_ERR_TAG是我可以想象在這裏唯一有用的唯一一個,但僅當MPI_Send()遇到檢查提供的標記在提供的通信器中的進程是否實際正在運行的麻煩時。我的猜測是,它不會這樣做,只有當提供的標籤超出有效標籤值範圍時纔會返回MPI_ERR_TAG,但您可以使用簡單的測試程序輕鬆進行驗證。 – suszterpatt 2010-04-21 10:58:18

1

標準不允許使用不匹配的MPI_Send調用編寫代碼。除此之外,這意味着結果行爲將取決於實現。可能的行爲範圍包括幾個「明顯的」選項:退出,掛起/死鎖,內存損壞等。

大多數實現都具有某種級別的調試輸出,可能有助於追蹤這種邏輯編程錯誤。可以在完成所有MPI_Send/MPI_Recv對時使用MPI_Wait *來屏蔽。在一般情況下,在recv'ing節點進入MPI_Finalize之前,不可能知道MPI_Send不匹配。換言之,在這種情況下使用屏障會導致程序掛起。

無論如何,這將是MPI_Finalize的錯誤條件。 MPI_Send的目標等級應該被檢測爲已經退出......這樣MPI_Send永遠不會匹配。但是,這種錯誤情況可能導致MPI作業無法清除所有排序進程。

相關問題