-1

MPI (MPMD 通信) を使用して 2 つの異なるプロセスを通信しようとしています。そのうちの 1 つは GLUT を使用して、他のプロセスから送信されたデータに基づいて生成されたデータをレンダリングします。

私の問題は、初期化フェーズ中に「コンシューマー」(GLUT を使用するもの) が特定の構成データを「プロデューサー」に送信することですが、MPI_Send 呼び出しがブロックされていないようです。たとえば、コンシューマーからプロデューサーに 4 つの異なるメッセージを送信し、それぞれに異なるタグを付けます。それはうまくいくようです。次に、他のプロセスのコードを変更せずに、最初の MPI_Send にコメントを付けます (つまり、最初の MPI_Send と MPI_Recv を超えて処理を進める必要はありません)。問題は、送信者が 3 つのメッセージすべてを送信することです。各 MPI_Send の後に行うテストでは、正しい進化に対応するメッセージが出力されるため、各 MPI_Send が MPI_SUCCESS を返すようです。その間、レシーバーは進行しません。

GLUT を使用せずに、より単純なアプリケーションでこの動作を再現しようとしましたが、うまくいきました。しかし同時に、GLUT がこの問題を引き起こす理由もわかりません。何か提案はありますか?

前もって感謝します。

4

2 に答える 2

1

ブロッキング MPI 送信モードのセマンティクスを誤解しています。ここでのブロックとは、メッセージ データとそのエンベロープが安全に格納され、データ バッファーが自由に変更できるようになるまで操作をブロックすることを意味します。対照的に、ノンブロッキング操作 ( MPI_I...) はすぐに制御を返しますが、操作がまだ進行中の間はデータ バッファーを変更しないようにする必要があります。

MPI_Send標準のブロッキング送信操作です。これは、受信操作が開始されるまで戻らない同期ブロッキング送信 ( )として実装することも、メッセージ データを小さな内部バッファーにコピーして制御を戻す内部バッファーブロッキング送信 ( と同様) として実装することもできます。標準送信がどのように正確に実装されるかは、標準では定義されていません。ほとんどの実装では、いくつかの短いメッセージをバッファリングします。MPI_SsendMPI_Bsend

于 2012-07-04T15:22:09.243 に答える
1

1で述べたように、MPI_Send はブロッキングを保証しないことがわかったので、目的の動作を得るには、代わりに MPI_Ssend を使用する必要があります。

于 2012-07-04T13:25:29.840 に答える