0

MPI_Recv がタグが一致しないメッセージを受信する可能性はありますか?

私のロジック: MPI_Isend / MPI_Recv 通信。

ノード 1 はタグ 0 のメッセージを送信し、次にタグ 1 の別のメッセージを送信します。ノード 1 には 2 つのスレッドがあり、Isend アクションが同時に発生する可能性があるためです。
ノード 2 は、ノード 1 からのメッセージがあるかどうかを調べます。ある場合は、メッセージを受信します。

私の設計では、ノード 2 がタグ 0、次にタグ 1 のメッセージを受信するようにします。しかし、メッセージがノード 1 から送信されているというシグナルをノード 2 がプローブすると、タグ 1 メッセージと同じ長さのメッセージを受信しました。 . その後、ノード 1 からのメッセージはなくなりました。タグ 0 のメッセージが失われたようです。

私はとても混乱しています。答えを楽しみにしてください。

4

2 に答える 2

2

MPI は、メッセージが「準備完了」モードで送信された場合 (つまり、受信者の準備ができていないときにMPI_Rsendorを使用した場合) を除き、メッセージを失うことMPI_Irsendはありません。これは明らかにあなたの場合ではありません。MPI_Isendは送信操作を開始しますが、完了まで進行しない限り完了することは保証されません。多くの MPI 呼び出しは非ブロッキング操作の進行につながりますが、最も明示的なものはMPI_Waitとそのバリアントです。バックグラウンドで非ブロッキング操作を進行させる特別な進行スレッドを持つ MPI 実装もあります (たとえば、Open MPI はこの方法でコンパイルできます)。

2 番目のメッセージが非常に小さく、別の送信モードが使用されている場合 (たとえば、熱心な送信プロトコル)、2 番目のメッセージが最初のメッセージの前に到着する可能性があります。MPI は、同じエンベロープを持つメッセージが順番に保持されることのみを保証します。メッセージ エンベロープは、タプル (送信者、受信者、タグ、コミュニケーター) です。

また、異なるスレッドからメッセージを送信することについても話します。MPI ライブラリがスレッド セーフでありMPI_THREAD_MULTIPLE、スレッド サポートのレベルで初期化されていることを確認していますか?たとえば、次のようになります。

int provided;

MPI_Init_thread(&argc, &argv, MPI_THREAD_MULTIPLE, &provided);
if (provided != MPI_THREAD_MULTIPLE)
{
   printf("Sorry, your MPI library does not provide MPI_THREAD_MULTIPLE\n");
   MPI_Abort(MPI_COMM_WORLD, 0);
}
于 2012-11-08T14:40:37.570 に答える
0

あなたの最善の策は、受信者にMPI_IRecvfor タグ 0 を投稿させてから、 for タグ 1 を投稿させることです。次に、MPI_IRecvメッセージが来るまで待機します。MPI_Wait*MPI_WaitAllMPI_WaitAnyMPI_Wait

このようにして、メッセージを待っている 2 つの受信呼び出しがあり、タグ付けされたメッセージは本来の場所に送信されます。

于 2012-11-08T14:23:26.353 に答える