我int
打算从root(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;
}
Run Code Online (Sandbox Code Playgroud)
但似乎我得到了
[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
Run Code Online (Sandbox Code Playgroud)
发现我可以增加缓冲区大小 Bcast
MPI_Bcast(&winner, NUMPROCS, MPI_INT, FIELD, MPI_COMM_WORLD);
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
当我cout
的winner
,它应该是-1
Hri*_*iev 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);
}
Run Code Online (Sandbox Code Playgroud)
这是一个非常常见的错误.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);
Run Code Online (Sandbox Code Playgroud)