13

MPI 通信方法の 1 つを使用して、ランクがそれ自体と通信するとどうなりますか? 明確に定義された動作 (たとえば、成功または失敗が保証されている) はありますか? または、プログラムが実行し続けるかどうかは、偶然またはその他の制御不能な影響に依存していますか?

例として、計算ステンシルに必要なハローを作成するために隣接するランクに送信する必要があるグリッド セルを各ランクが決定する流体力学コードがあります。シミュレーションが 1 つのランクだけで開始された場合、ランク 0 自体とのノンブロッキング送受信 (長さ 0 前後の情報を送信) が行われます。

4

2 に答える 2

14

suzterpatt の回答に従ってセルフメッセージを回避できますが、セルフメッセージは機能し、MPI 標準の一部です。あらかじめ定義された便利なコミュニケーターもありMPI_COMM_SELFます。send/receive 呼び出しがデッドロックを引き起こさない限り (たとえば、非ブロッキング呼び出しが使用されている場合)、自分自身への送信は問題ありません。もちろん、送信バッファと受信バッファがオーバーラップしてはなりません。

OpenMPIではBTLを有効にするself必要があることに注意してください。


出典: MPI 1.1 セクション 3.2.4

ソース = 宛先が許可されます。つまり、プロセスはそれ自体にメッセージを送信できます。(ただし、デッドロックにつながる可能性があるため、上記のブロッキング送信および受信操作でこれを行うのは安全ではありません。セクション 3.5. ポイントツーポイント通信のセマンティクスを参照してください。)

于 2012-07-08T18:56:06.553 に答える
1

標準モードの送信 (つまりMPI_Send()) では、メッセージをバッファリングするかどうかを決定するのは MPI 実装次第です。任意の実装、または少なくとも一般的な実装は、自分自身への送信を認識し、メッセージをバッファリングすることを決定すると想定するのが合理的です。その後、実行が続行され、一致する receive 呼び出しが行われると、メッセージがバッファーから読み取られます。絶対に確実にしたい場合は、 を使用できますMPI_Bsend()が、 と を介してバッファを管理するのはあなたの責任かもしれませMPI_Buffer_attach()MPI_Buffer_detach()

ただし、特定の問題に対する理想的な解決策MPI_PROC_NULLは、send/receive 呼び出しの source/destination 引数で使用することです。これにより、Send と Recv は通信を中止し、できるだけ早く返されます。

于 2012-07-08T18:47:46.050 に答える