3

私はMPIを使用しています(Fortranを使用していますが、質問は特定の言語よりもMPI標準に固有です)。具体的には、バッファーされた送信/受信関数isendおよびirecvを使用しています。ここで、次のシナリオを想像すると、次のようになります。

プロセス0:

isend(stuff1, ...)
isend(stuff2, ...)

プロセス1:

wait 10 seconds
irecv(in1, ...)
irecv(in2, ...)

メッセージは送信された順序でプロセス1に配信されますか?つまり、使用されるタグがすべての場合で同じである場合、 in1==stuff1とin2==stuff2を確認できますか?

4

2 に答える 2

7

はい、メッセージは送信順に受信されます。これは、非追い越しメッセージとして標準で説明されています。詳細については、このMPI 標準セクション を参照してください。抜粋は次のとおりです。

順序メッセージは追い越しを行いません: 送信者が 2 つのメッセージを同じ宛先に連続して送信し、両方が同じ受信に一致する場合、最初のメッセージがまだ保留中の場合、この操作では 2 番目のメッセージを受信できません。受信者が 2 つの受信を連続して送信し、両方が同じメッセージに一致する場合、最初の受信操作がまだ保留中の場合、このメッセージによって 2 番目の受信操作を満たすことはできません。この要件により、送信と受信の一致が容易になります。プロセスがシングルスレッドで、ワイルドカード MPI_ANY_SOURCE が受信で使用されていない場合、メッセージ パッシング コードが決定論的であることを保証します。(後で説明する MPI_CANCEL や MPI_WAITANY などの呼び出しの一部は、非決定性の追加のソースです。)

于 2010-01-08T09:06:44.793 に答える
1

はいといいえ。

使用するタグがすべての場合で同じである場合、in1==stuff1とin2==stuff2であることを確認できますか?

はい。sendとrecvの間には決定論的な1:1の相関関係があり、正しい入力を正しいrecvバッファーに取得します。この動作は標準によって保証されており、すべてのMPI実装によって強制されます。

いいえ。内部メッセージの進行の正確な順序と、受信側のバッファーが入力される正確な順序は、ブラックボックスのようなものです。特に、複数の処理中のバッファーを使用したRDMAスタイルのメッセージ転送が使用されている場合(InfiniBandなど)。 )。

コードが複数のスレッドを使用していて、MPI_TestまたはMPI_Waitを使用するのではなく、完全性を判断するためにバッファーを検査している場合(たとえば、ビットが切り替わるのを待っている場合)、メッセージが順不同で到着する可能性があります(ただし、正しいバッファーにある) )。

コードがin1=stuff1が入力される前に入力されることに依存している場合、in2 = stuff2が受信側に入力され、両方のメッセージに単一の送信ランクがある場合、MPI_Issend(非ブロッキング、同期送信)を使用すると、メッセージが順番に受信しました。複数の送信ランクからの複数のrecvのバッファポピュレーションの順序を保証する必要がある場合は、各revcの間に何らかのブロッキング呼び出しが必要です(MPI_Recv、MPI_Barrier、MPI_Waitなど)。

于 2010-02-22T16:41:18.503 に答える