2011-05-19 6 views
1

MPIを使用して合計4つのメッセージを8つのノードに渡しました。私は配列が意味のある結果をもたらさない2つのメッセージがあることに気づいた。私は以下のコードの抜粋をコピーしましたか?以下のコード/結果に基づいて、私が持っていた関連するいくつかの質問です:MPI_Isend/Recv-デッドロックはありますか?

  1. MPI_Isendにも待機が必要ですか?デッドロックがあるかどうかはわかりません。私はまた、これらの2つの変数を1つのノードから別のノードに渡すだけで、配列の値はまだ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、ROWとは何ですか?どのような変数はここで賢明な値を持っていないのですか?配列の値がNULLであることはどういう意味ですか?問題を示す完全なコードセグメントが最適です。あなたの他の質問については、はい、IsendとIrecvの両方が待機しているか類似している必要があります。この場合、sendrecvは指定されたパターンと一致しません(上記のケースでは、 )。 –

+0

ありがとうジョナサン。私はバグを修正することができました。それは、私がSend/recvよりも印刷していた方法と関係しています。コマンド。ご協力いただきありがとうございます。 – Ashmohan

答えて

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

+2

遅い応答のために空白。非ブロッキング呼び出しは、関数ASAPを返すことのみを保証します。データが実際に送受信されたことを保証するものではありません。それは重要な違いです。コールが返された直後であり、返されても保証されないため、バッファを再利用することはできません。それを考えると、関数はバックグラウンドスレッドを開始し、返されました。スレッドはsend/recvの作業をしています。作業が完了したことを保証するために、MPI_Waitを呼び出す必要があります。関数が実際に作業を完了して完了するまでブロックされます。 – powerrox

+0

ありがとう!私はブロッキングsend/recvを使用して終了しました。効率/タイミングの観点からは、send/recvをブロックするよりも非ブロッキングが優れていますか? – Ashmohan

関連する問題