2017-05-26 39 views
0

假設我有兩個處理器:MPI超過緩衝

第一個P0

  • 呼叫MPI_SEND到消息A發送到P1;
  • 調用MPI_Recv從p1接收B;

第二個P1

  • 呼叫MPI_SEND到消息B發送到P0;
  • 調用MPI_Recv從p0接收A;

如果消息A和B的大小超過系統緩衝區會發生什麼?

+0

它會死鎖。使用'MPI_Sendrecv'來保持便攜。 –

+0

無論緩衝區大小如何,此代碼都會死鎖。使用非阻塞調用('MPI_Isend','MPI_Irecv')或更改它們的順序,即'P1:Send()Recv()'和'P2:Recv(); Send()'。或者你可以使用前面評論中提到的MPI_Sendrecv。 – Arash

+0

你是否假設它是同步模式?這樣會出現死鎖? –

回答

1

代碼在任何情況下都是錯誤的。

它可能通過MPI實現/配置/狀態的擺佈工作。但總的來說,這是一個僵局。您不應該考慮標準阻塞發送呼叫的緩衝是否正確。由於性能原因,它們被允許緩衝,這對於初學者來說可能是令人驚訝的。似乎適用於小消息大小的代碼突然對更大的消息大小產生了死鎖,但實際上代碼一直是錯誤的,它只是不顯示。

2

我們永遠不應該假設存在標準發送緩衝這樣的事情。 MPI標準明確警告反對在分割點,點對點通訊 3.5語義:如果是必需的程序來完成任何消息緩衝

的程序是「安全的」。可以用同步發送代替這樣的程序中的所有發送,並且程序仍將正確運行。這種保守的編程風格提供了最佳的可移植性,因爲程序完成並不取決於可用的緩衝區空間量或使用的通信協議。

MPI專門針對你的問題用例,並提供了兩個發送,接收呼叫MPI_SendrecvMPI_Sendrecv_replace。前者使用獨立的發送和接收緩衝區,但不能重疊,而後者使用單個緩衝區。兩者都保證如果發送和接收部分與相應的接收/發送操作相匹配,則不會發生死鎖。