2

MPI でノンブロッキング通信を使用して、プロセス間でさまざまなメッセージを送信しています。ただし、デッドロックが発生しているようです。PADB (こちらを参照) を使用してメッセージ キューを調べたところ、次の出力が得られました。

1:msg12: Operation 1 (pending_receive) status 0 (pending)
1:msg12: Rank local 4 global 4
1:msg12: Size desired 4
1:msg12: tag_wild 0
1:msg12: Tag desired 16
1:msg12: system_buffer 0
1:msg12: Buffer 0xcaad32c
1:msg12: 'Receive: 0xcac3c80'
1:msg12: 'Data: 4 * MPI_FLOAT'
--
1:msg32: Operation 0 (pending_send) status 2 (complete)
1:msg32: Rank local 4 global 4
1:msg32: Actual local 4 global 4
1:msg32: Size desired 4 actual 4
1:msg32: tag_wild 0
1:msg32: Tag desired 16 actual 16
1:msg32: system_buffer 0
1:msg32: Buffer 0xcaad32c
1:msg32: 'Send: 0xcab7c00'
1:msg32: 'Data transfer completed'
--
2:msg5: Operation 1 (pending_receive) status 0 (pending)
2:msg5: Rank local 1 global 1
2:msg5: Size desired 4
2:msg5: tag_wild 0
2:msg5: Tag desired 16
2:msg5: system_buffer 0
2:msg5: Buffer 0xabbc348
2:msg5: 'Receive: 0xabd1780'
2:msg5: 'Data: 4 * MPI_FLOAT'
--
2:msg25: Operation 0 (pending_send) status 2 (complete)
2:msg25: Rank local 1 global 1
2:msg25: Actual local 1 global 1
2:msg25: Size desired 4 actual 4
2:msg25: tag_wild 0
2:msg25: Tag desired 16 actual 16
2:msg25: system_buffer 0
2:msg25: Buffer 0xabbc348
2:msg25: 'Send: 0xabc5700'
2:msg25: 'Data transfer completed'

これは、送信が完了したことを示しているようですが、すべての受信が保留中です (上記はタグ値 16 のログのほんの一部です)。しかし、これはどのように起こりますか?MPI ではすべての送信と受信が一致する必要があるため、関連する受信が完了しないと送信を完了できません。少なくとも私はそう思っていました…

誰でも洞察を提供できますか?

これを行うために使用しているコードを提供できますが、MPI_Waitall が最後に呼び出されると仮定すると、Isend と Irecv はすべての呼び出し順序に関係なく機能するはずです。

更新:コードはこの要点で入手できます

更新:コードにさまざまな変更を加えましたが、まだ正しく動作していません。新しいコードは同じ要点にあり、取得している出力はこの要点にあります。このコードにはいくつかの質問/問題があります:

  1. 出力前にすべての作業が完了していることを確認するために MPI_Barrier() がある場合、最終ループ (すべての配列の出力) からの出力が残りの出力に散在するのはなぜですか?

  2. ランク 0 からランク 0 に送信することは可能/合理的です - それはうまくいきますか? (もちろん、正しい一致する受信が投稿されたと仮定します)。

  3. 出力に非常に奇妙な長い数値がたくさん表示されます。これは、ある種のメモリ上書きの問題、または変数のサイズの問題であると思います。興味深いことに、これは MPI 通信の結果であるに違いありません。なぜなら、new_array を 9999.99 の値に初期化すると、通信によって明らかにこれらの奇妙な値に変更されるからです。理由はありますか?

全体的に、転置の一部が発生しているように見えます (マトリックスのビットが転置されているようです...) が、すべてではありません - 私が最も心配しているのは、これらの奇妙な数値です!

4

1 に答える 1

4

を使用する場合、リクエストが完了するのを待つ前にバッファを変更しないようにする必要があります。これに違反していることは間違いありませんMPI_IsendMPI_Irecvすべての受信を所定の場所で行うのではなく、2番目のマトリックスに入れるとどうなりますか?

また、global_x2 * global_y2あなたのタグですが、送信と受信のペアごとに一意になるかどうかはわかりません。これにより、混乱が生じる可能性があります。(global_y2 * global_columns) + global_x2タグの送信と受信に切り替えるとどうなりますか(global_x2 * global_columns) + global_y2

編集:出力に関する質問については、すべてのプロセスを同じマシンで実行し、標準の出力を確認することでこれをテストしていると想定しています。このようにすると、printfコードがすべてバリアの前で実行されたとしても、出力は端末によって奇妙にバッファリングされます。これを回避する方法は2つあります。プロセスごとに個別のファイルに印刷するか、出力をメッセージとしてプロセス0に送信し、実際のすべての印刷を彼に行わせることができます。

于 2011-04-08T19:09:42.560 に答える