2017-05-26 9 views
0

バッファ超え:P1にメッセージAを送信するMPIは、私は2つのプロセッサがあると

最初のP0

  • コールMPI_Send関数を。
  • p1からBを受信するようにMPI_Recvを呼び出します。

第1 P1

  • コールMPI_Send関数P0にメッセージBを送信します。
  • p0からAを受け取るようにMPI_Recvを呼び出します。

メッセージ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という2つの送受信受信コールを提供します。前者は、重複してはならない送信バッファと受信バッファを別々に使用し、後者は単一のバッファを使用します。両方とも、送受信部が対応する受信/送信動作と一致する場合、デッドロックが発生しないことを保証する。

関連する問題