我有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
答案 0 :(得分:9)
您的代码早期出现错误:
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
中的所有进程都不会调用此广播(但仅由根进行调用),因此会干扰下一个广播操作,即循环内的广播操作。第二个广播操作实际上将第一个(两个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);