MPI_Send
は、ブロックされていてもブロックされていなくてもよい。送信者が送信者バッファを再利用できるようになるまでブロックされます。一部の実装では、バッファが下位の通信レイヤに送信されたときに呼び出し元に戻ります。相手に一致するMPI_Recv()
がある場合、他の人は発信者に戻ります。したがって、このプログラムがデッドロックするかどうかは、MPIの実装に依存します。 、
MPI_Comm_rank (comm, &my_rank);
if (my_rank == 0) {
MPI_Send (sendbuf, count, MPI_INT, 1, tag, comm);
MPI_Recv (recvbuf, count, MPI_INT, 1, tag, comm, &status);
} else if (my_rank == 1) {
MPI_Recv (recvbuf, count, MPI_INT, 0, tag, comm, &status);
MPI_Send (sendbuf, count, MPI_INT, 0, tag, comm);
}
常に
すべてのMPI_Send()
のためのペアリングMPI_Recv()
がなければならないことに注意してください。このため、プログラムの
は、デッドロックの可能性がありませんので、あなたがそれをrewritting検討することができる、異なるMPI実装間で異なる動作をします両方とも時間的に「平行」である。たとえば、これはデッドロックで終了することがあります。これは、ペアリングsend/recv呼び出しが時間内に整列しないためです。彼らは互いに交差:
RANK 0 RANK 1
---------- -------
MPI_Send() --- ---- MPI_Send() |
--- --- |
------ |
-- | TIME
------ |
--- --- |
MPI_Recv() <-- ---> MPI_Recv() v
これらのプロセスを、他の方法で、ランク0と1を持つ2つのプロセスが同じコミュニケードメイン内に実際に存在していることを、当然の提供、デッドロックに終了しません。コミュニケーcom
の大きさは、ランク1(0のみ)を許可しない場合
RANK 0 RANK 1
---------- -------
MPI_Send() ------------------> MPI_Recv() |
| TIME
|
MPI_Recv() <------------------ MPI_Send() v
上記固定されたプログラムが失敗することがあります。こうすれば、if-else
はelse
ルートを取らないため、MPI_Send()
をリッスンするプロセスはなく、ランク0はデッドロックになります。
現在の通信レイアウトを使用する必要がある場合は、非ブロック送信の代わりにMPI_Isend()
またはMPI_Issend()
を使用し、デッドロックを回避することをお勧めします。