MPI_ERR_TRUNCATE:在广播(MPI_ERR_TRUNCATE: On Broadcas

2019-07-03 16:32发布

我有一个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

当我coutwinner ,应该是-1

Answer 1:

有一个在你的代码早期的错误:

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 (但只能由root),因此下一个广播操作,即循环中的一个干扰。 第二广播操作实际上接收由第一个(2种发送的消息int元素)到缓冲区只是一个int ,因此截断错误消息。 在打开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);


文章来源: MPI_ERR_TRUNCATE: On Broadcast
标签: c++ mpi openmpi