MPI_Send()
はブロッキング呼び出しであり、アプリケーションバッファを安全に変更して再利用できるようになるまで待機します。送信呼び出しを同期させるには(受信者とのハンドシェイクが必要です)、MPI_Ssend()
を使用する必要があります。両者の違いを知りたい。プロセス間で固定量のバイトを送信する必要があると仮定します。どちらがより長い時間がかかると思われますか?
私にとって、コードはMPI_Send()呼び出しでうまく機能しますが、MPI_Ssend()を無期限に待機します。考えられる理由は何ですか?
そして最も重要なことは、MPI_Send()
を使用すると、受信プロセスでデータが受信されると確信しているため、MPI_Ssend()
を使用すると、この推論はハンドシェイクを待つことに何のメリットもありません。
または、結論を出すことができます。MPI_Send()
を使用すると、データをセルフプロセスに送信できますが、MPI_Ssend()
を使用することはできませんか?
2つの間には小さいが重要な違いがあります(セクション3.4の MPI標準 ドキュメントにあります)。通常のMPI_SEND
を使用すると、バッファが再利用可能になると、実装はアプリケーションに戻ります。これは、受信プロセスが実際に受信を投稿する前である可能性があります。たとえば、小さなメッセージが内部バッファにコピーされ、アプリケーションバッファが不要になった場合などです。ただし、内部でバッファリングされない可能性のある大きなメッセージの場合、バッファが不要になるほど十分なメッセージがリモートプロセスに送信されるまで、呼び出しが返されない場合があります。
これとMPI_SSEND
の違いは、後者は常に受信側に受信が投稿されるまで待機することです。メッセージが小さく、内部でバッファリングできる場合でも、メッセージが反対側で受信され始めるまで待機します。
MPI_SSEND
は、たとえばMPI_BARRIER
を実行しなくても、両方のプロセスが実行の特定のポイントに到達したことを確認する方法です。アプリケーションが同じランクとの間で送受信している場合、どちらか一方としてMPI_SEND
OR MPI_SSEND
)を実行するのは安全ではありませんcouldは無期限にブロックされます。代わりに、MPI_ISEND
とMPI_IRECV
を使用して、呼び出しがすぐに返され、実際の送受信が同時に(MPI_WAITALL
の呼び出しで)。