23

MPI_Send()再利用のためにアプリケーションバッファを安全に変更できるようになるまで待機するブロッキングコールであることはわかっています。送信呼び出しを同期させるには (受信者とのハンドシェイクが必要です)、 を使用する必要がありますMPI_Ssend()。両者の違いを知りたいです。プロセス間で一定量のバイトを送信する必要があるとします。どちらのプロセスに時間がかかると思われますか?
私の場合、コードは MPI_Send() 呼び出しでうまく機能しますが、MPI_Ssend() を無期限に待機します。考えられる理由は何ですか?

そして、最も重要なことは、 を使用するときにデータが受信プロセスで受信されていることを確信しているMPI_Send()ため、この推論は、 を使用するときにハンドシェイクを待つことに有利にはなりませんMPI_Ssend()

または、結論を下すことMPI_Send()ができます。セルフプロセスにデータを送信できますが、使用できませんMPI_Ssend()か?

4

1 に答える 1

44

この 2 つには小さいながらも重要な違いがあります (セクション 3.4のMPI 3.0 標準ドキュメントで確認できます)。通常MPI_SENDの では、バッファが再利用できるようになると、実装がアプリケーションに戻ります。これは、受信プロセスが実際に受信を通知する前である可能性があります。たとえば、小さなメッセージが内部バッファーにコピーされ、アプリケーション バッファーが不要になった場合などです。ただし、内部的にバッファリングできない大きなメッセージの場合、リモート プロセスに十分な量のメッセージが送信されてバッファが不要になるまで、呼び出しが返されない場合があります。

これと の違いMPI_SSENDは、後者は受信側で受信が通知されるまで常に待機することです。メッセージが小さく、内部でバッファリングできる場合でも、相手側でメッセージの受信が開始されるまで待機します。

MPI_SSENDは、MPI_BARRIERたとえば、. アプリケーションが同じランクとの間で送受信を行っている場合、どちらか一方が無期限にブロックされる可能性がMPI_SENDあるため、どちらかORを実行するのは安全ではありません。代わりに、 と を使用して、呼び出しがすぐに戻り、実際の送受信を同時に ( への呼び出しで) 実行できるようにする必要があります。MPI_SSENDMPI_ISENDMPI_IRECVMPI_WAITALL

于 2013-07-11T12:41:10.547 に答える