2

終了したプロセスに MPI_Send するとどうなりますか?

私は MPI を学んでおり、C で小さな砂糖の分布シミュレーションを書いています。工場が生産を停止すると、それらのプロセスは終了します。倉庫が空になると、倉庫は終了します。MPI_Send の戻り値を見て、店の倉庫への注文が (倉庫プロセスが終了したために) 成功しなかったかどうかをどうにかして知ることはできますか? ドキュメントには、この状況の具体的なエラー コードは記載されていませんが、成功してもエラーは返されません。

僕にできる:

if (MPI_Send(...)) {
    ...
    /* destination has ended */
    ...
}

エラーコードを無視しますか?

ありがとう

4

2 に答える 2

1

標準では、一致しない MPI_Send 呼び出しを使用してコードを記述することは許可されていません。とりわけ、これは、結果として生じる動作が実装に依存することを意味します。可能な動作の範囲には、いくつかの「明白な」オプションが含まれます: 終了、ハング/デッドロック、メモリ破損など。

ほとんどの実装には、この種の論理プログラミング エラーを追跡するのに役立つ、ある程度のデバッグ出力があります。MPI_Wait* を使用して、すべての MPI_Send/MPI_Recv ペアの完了をバリアすることができます。一般に、受信ノードが MPI_Finalize に入るまで、MPI_Send が一致しないことを知ることはできません。別の言い方をすると、この状態でバリアを使用すると、プログラムがハングアップします。

いずれにせよ、これは MPI_Finalize のエラー状態になります。MPI_Send のターゲット ランクは、終了したものとして検出される必要があります...そのため、MPI_Send が一致することはありません。ただし、この種のエラー状態が原因で、MPI ジョブがすべてのランク プロセスのクリーンアップに失敗する場合があります。

于 2010-04-22T17:51:42.623 に答える
0

私の知る限り、MPI 標準では MPI_Send() の戻り値も出力パラメータも定義されていません。メッセージ送信イベントに関する情報は提供されません。おそらく、メッセージのバッファリングによって情報が利用できないためです呼び出しが返されたときの結果。

あるプロセスが別のプロセスの終了を確認したい場合は、指定されたタグを使用して終了プロセスからメッセージを送信し、他のプロセスでノンブロッキング受信を定期的に投稿して、終了通知が送信されたかどうかを確認する必要があります。

または、1 つのプロセスが停止したときにプログラム全体を中止したい場合、最も簡単な方法は、終了プロセスで MPI_COMM_WORLD をコミュニケーターとして MPI_Abort() を呼び出すことです。これにより、すべてのプロセスが確実にシャットダウンされます。

編集:タイトルの質問に実際に答えるには、「終了したプロセスにMPI_Sendするとどうなりますか?」:私が理解しているように、それはバッファリングが使用されているかどうかによって異なります。バッファリングが使用されていない場合、プログラムはハングします。バッファリングが使用されている場合、MPI_Send() はメッセージをバッファリングし、プロセスは引き続き実行されますが、一致する受信がポストされないため、メッセージがバッファから離れることはありません。これを何度も行うと、最終的にプログラムがメモリ不足になります。

于 2010-04-20T20:25:51.643 に答える