2012-02-23 6 views
4

私はMPI送受信操作に関する質問があります。MPI質問を送受信します。

メッセージを互いに送信しようとする2つのMPIスレッドがあるとします。

まず( '送信' と '受信' ブロック):それをやって3つのコードスニペットは次のとおり

... 
int data = ...; 
... 
MPI_Send(&data, sizeof(int), MPI_INT, 
     (my_id == 0)?1:0, 0, MPI_COMM_WORLD); 

MPI_Status status; 
MPI_Recv(&data, sizeof(int), MPI_INT, 
     (my_id == 0)?1:0, 0, MPI_COMM_WORLD, &status); 
... 

は、第二( '送信' ノンブロッキングが、 '受信' ブロック):

... 
int data = ...; 
... 
MPI_Request request; 
MPI_Isend(&data, sizeof(int), MPI_INT, 
     (my_id == 0)?1:0, 0, MPI_COMM_WORLD, &request); 

MPI_Status status; 
MPI_Recv(&data, sizeof(int), MPI_INT, 
     (my_id == 0)?1:0, 0, MPI_COMM_WORLD, &status); 
// Synchronize sender & receiver 
MPI_Wait(&request, &status); 
... 

サード(ノンブロッキング「送信」ブロックと「受信」):

... 
int data = ...; 
... 
MPI_Request request; 
MPI_Irecv(&data, sizeof(int), MPI_INT, 
     (my_id == 0)?1:0, 0, MPI_COMM_WORLD, &request); 

MPI_Send(&data, sizeof(int), MPI_INT, 
     (my_id == 0)?1:0, 0, MPI_COMM_WORLD); 

MPI_Status status; 

// Synchronize sender & receiver 
MPI_Wait(&request, &status); 
... 

私が持つ潜在的な問題があると思います私はあなたの意見を欲しいです。だから、私は次の質問を持っています:

  1. 上記の3つのコードの(潜在的な)問題(もしあれば)は何ですか?

  2. すべてのMPI実装で動作するように、上記3つのコードのどれが有効/正当なMPI規格を考慮していますか?

  3. これを行うには最良の方法はありますか?

  4. 3番目のコードでは、MPI_Irecv呼び出しとMPI_Send呼び出しの順序を変更するとどうなりますか?

PS:ところで、私はScali MPIを使用してそれらを実行しようとしました、そして、それらのすべてが機能しました!

答えて

4

最初の実装では、特に通信がバッファされているため、大量のデータの場合にはそうではないため、テストが同期モードで行われていると、デッドロックが発生する可能性があります。

他の2つの実装はデッドロックなしで動作するはずです。センドの前に受信操作を開始する方が良い方法だと思うので、私は第3の実装を個人的に好むでしょう。 MPI standard, section 3.7から:ユーザー

[...]

アドバイスは、メッセージパッシングモデルでは、通信は、送信者によって開始されることを意味します。送信者が通信を開始したときに受信が既にポストされている場合(データは受信バッファに直接移動でき、保留中の送信要求をキューに入れる必要はありません)、通信は一般にオーバーヘッドが低くなります。ただし、受信操作は、一致する送信が発生した後にのみ完了できます。ノンブロッキング受信を使用すると、送信待ちの間に受信者をブロックせずに通信オーバーヘッドを低くすることができます。

ためMPI_Send/MPI_Irecv有する第三の実装では、最初の実装と同じ理由でMPI_Sendコールにデッドロックすることができます。

+0

また、データが受信されるまでブロックする必要があるブロッキング受信があるため、2番目の実装についても懐疑的です。だから、その場合MPI_Wait()は必要ありませんか? – usman

+0

@ user600029この場合、デッドロックの危険性はありません。どちらのプロセスも受信時にブロックする前に送信操作を既に開始しているためです。 – Francesco

+1

@ user600029しかし、すべての実装で、アドレスが送信操作と受信操作の両方に与えられている1つのデータしか割り当てられていないことに気付きました。この結果は、第2および第3の実装では予測できません。両方のプロセスで 'data'の値を本当に交換したいのであれば、少なくとも1つのストレージに複製を作成する必要があります(ただし、非同期通信方式を採用すると – Francesco

関連する問題