5

intルート ( ) からブロードキャストする予定がありrank==(FIELD=0)ます。

int winner

if (rank == FIELD) {
    winner = something;
}

MPI_Barrier(MPI_COMM_WORLD);
MPI_Bcast(&winner, 1, MPI_INT, FIELD, MPI_COMM_WORLD);
MPI_Barrier(MPI_COMM_WORLD);
if (rank != FIELD) {
    cout << rank << " informed that winner is " << winner << endl;
}

しかし、私は得るようです

[JM:6892] *** An error occurred in MPI_Bcast
[JM:6892] *** on communicator MPI_COMM_WORLD
[JM:6892] *** MPI_ERR_TRUNCATE: message truncated
[JM:6892] *** MPI_ERRORS_ARE_FATAL: your MPI job will now abort

バッファサイズを増やすことができることがわかりましたBcast

MPI_Bcast(&winner, NUMPROCS, MPI_INT, FIELD, MPI_COMM_WORLD);

NUMPROCS実行中のプロセスの数はどこにありますか。(実際には、2にする必要があるようです)。その後、実行されますが、予期しない出力が得られます...

1 informed that winner is 103
2 informed that winner is 103
3 informed that winner is 103
5 informed that winner is 103
4 informed that winner is 103

coutがのときwinner、それはあるべきです-1

4

1 に答える 1

10

コードの早い段階でエラーがあります:

if (rank == FIELD) {
   // randomly place ball, then broadcast to players
   ballPos[0] = rand() % 128;
   ballPos[1] = rand() % 64;
   MPI_Bcast(ballPos, 2, MPI_INT, FIELD, MPI_COMM_WORLD);
}

これは非常によくある間違いです。MPI_Bcastは集合操作であり、完了するにはすべてのプロセスから呼び出される必要があります。あなたの場合、このブロードキャストはすべてのプロセスによって呼び出されるわけではなくMPI_COMM_WORLD(ルートによってのみ)呼び出されるため、次のブロードキャスト操作、つまりループ内の操作に干渉します。2 番目のブロードキャスト操作は、実際には、最初のブロードキャスト操作 (2 つの要素) によって送信されたメッセージを 1 つintだけのバッファーに受信します。intしたがって、切り捨てエラーメッセージが表示されます。Open MPI では、各ブロードキャストが内部的に同じメッセージ タグ値を使用するため、異なるブロードキャストが順番に発行されずに互いに干渉する可能性があります。これは、(古い) MPI 標準に準拠しています。MPI-2.2 では、複数の未処理の集合操作を持つことはできません (MPI-3.0 では、複数の未処理の非ブロック集合操作を持つことができます)。コードを次のように書き直す必要があります。

if (rank == FIELD) {
   // randomly place ball, then broadcast to players
   ballPos[0] = rand() % 128;
   ballPos[1] = rand() % 64;
}
MPI_Bcast(ballPos, 2, MPI_INT, FIELD, MPI_COMM_WORLD);
于 2012-11-08T16:02:04.810 に答える