1

私は次のようなものを持っています:

if (rank == winner) {
    ballPos[0] = rand() % 128;
    ballPos[1] = rand() % 64;
    cout << "new ball pos: " << ballPos[0] << " " << ballPos[1] << endl;
    MPI_Send(&ballPos, 2, MPI_INT, FIELD, NEW_BALL_POS_TAG, MPI_COMM_WORLD);
} else if (rank == FIELD) {
    MPI_Recv(&ballPos, 2, MPI_INT, winner, NEW_BALL_POS_TAG, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
    cout << "2 new ball pos: " << ballPos[0] << " " << ballPos[1] << endl;
}

しかし、私はコンソールで見ます:

new ball pos: 28 59
2 new ball pos: 28 59

cout送信前の受信前に受信後の印刷が行われるのはなぜですか?

4

1 に答える 1

2

これらは、同時に出力を行う 2 つの異なるプロセスです。MPI 実装は通常、すべてのプロセスに対して標準の出力リダイレクトを実行しますが、パフォーマンスを向上させ、ネットワークの使用を最小限に抑えるために、通常はバッファリングされます。次に、すべてのプロセスからの出力が にmpiexec(または にmpirun、または MPI ジョブを起動するために使用されるその他のコマンドに) 送信され、標準出力に結合されます。さまざまなプロセスからのさまざまなチャンク/行が最終的に出力される順序はほとんどランダムであるため、何らかのプロセス同期が採用されていない限り、特定のランクからのメッセージが最初に表示されるとは思わないでください。

また、MPI 標準は、すべてのランクが標準出力に書き込めることを保証していないことに注意してください。標準は、標準出力の実行が許可されているプロセスのランクを取得するためにMPI_IO照会できる定義済みの属性キーを提供します。MPI_COMM_WORLD最近のほとんどの MPI 実装は、MPI ジョブのすべてのプロセスで出力リダイレクトを実行するMPI_ANY_SOURCEため、そのような属性クエリに戻りますが、常にそうであるとは限りません。

于 2012-11-09T11:48:27.257 に答える