2011-05-19 42 views
1

我一共8個消息的使用MPI 4個節點被傳遞。我注意到有兩個消息的數組沒有提供有意義的結果。我已經複製了以下代碼的摘錄?這些是我根據以下代碼/結果得到的一些相關問題:MPI_Isend/Recv-是否存在死鎖?

  1. MPI_Isend是否也需要等待?我不確定是否存在僵局。我也試過把這兩個變量從一個節點傳遞給另一個節點,並且數組值仍然是NULL。
  2. 威爾MPI_SendRecv提高代碼的效率,這裏Non Blocking communication in MPI and MPI Wait Issue. Not all information is passed correctly建議?如果是這樣,那麼/爲什麼?也將欣賞一些關於設置的指針。

謝謝!

Source Code: 

if ((my_rank) == 0) 
{ 
MPI_Irecv(A, Rows, MPI_DOUBLE, my_rank+1, MPI_ANY_TAG, MPI_COMM_WORLD, &request[6]); 
MPI_Wait(&request[6], &status[6]); 
} 


if ((my_rank) == 1) 
{ 
MPI_Isend(AA, Rows, MPI_DOUBLE, my_rank-1, 0, MPI_COMM_WORLD, &request[6]); 
} 


if ((my_rank) == 2) 
{ 
MPI_Isend(B, Rows, MPI_DOUBLE, my_rank+1, 0, MPI_COMM_WORLD, &request[7]); 
} 

if ((my_rank) == 3) 
{ 
MPI_Irecv(BB, Rows, MPI_DOUBLE, my_rank-1, MPI_ANY_TAG, MPI_COMM_WORLD, &request[7]); 
MPI_Wait(&request[7], &status[7]); 
} 
+2

有遠遠不夠的情況下在這裏要弄清楚到底是怎麼回事。什麼是B,BB,A,AA,行?哪些變量在這裏沒有明智的價值?你是什​​麼意思數組值是NULL?顯示問題的完整代碼段是最好的。至於你的其他問題,是的,這兩個Isend和Irecv的應匹配等待或相似,並且沒有,在這個特殊的情況下,SENDRECV不匹配給定的模式(在上述情況下,沒有一個任務是發送和接收)。 – 2011-05-20 03:50:53

+0

謝謝喬納森。我能夠修復這個錯誤。它與Send/recv的打印方式有關。命令。謝謝你的幫助。 – Ashmohan 2011-05-24 23:01:50

回答

1

是的,所有非阻塞調用(MPI_Isend,MPI_Irecv等)都需要匹配的MPI_Wait。調用不保證完成,直到調用MPI_Wait。在MPI_Wait返回之前,您不應該更改緩衝區的內容。

https://computing.llnl.gov/tutorials/mpi/

要使用SENDRECV,相同的任務必須發送消息並等待接收消息。該模式不適用於您的代碼。

+0

能否請您闡述一下「緩衝區的內容不能改變,直到MPI_WAIT返回後?」。由於MPI_Isend/recv是非阻塞命令,這意味着,計算在通信過程中同時發生,所以這並不意味着緩衝區正在進行更新?我對此不太清楚。如果你確實澄清,將不勝感激。謝謝! – Ashmohan 2011-06-02 22:23:46

+2

適合遲到的迴應。非阻塞調用只保證它將返回ASAP函數。它不保證數據實際發送/接收。這是重要的區別。由於調用剛剛返回,並且不能保證在返回時完成,所以我們不能重用緩衝區。把它看作..該函數剛剛開始後臺線程並返回。該線程正在執行send/recv的工作。爲保證工作完成,您應該致電MPI_Wait。它會阻止直到該功能實際完成工作並完成。 – powerrox 2011-07-08 19:50:19

+0

謝謝!我結束了使用阻塞發送/ recv。在效率/時間方面,阻塞優於阻塞send/recv? – Ashmohan 2011-07-09 04:14:38