首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MPI_ERR_TRUNCATE:打开广播

MPI_ERR_TRUNCATE:打开广播
EN

Stack Overflow用户
提问于 2012-11-08 22:08:56
回答 1查看 11.8K关注 0票数 5

我有一个打算从根目录(rank==(FIELD=0))广播的int

代码语言:javascript
复制
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;
}

但看起来我得到了

代码语言:javascript
复制
[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中的缓冲区大小

代码语言:javascript
复制
MPI_Bcast(&winner, NUMPROCS, MPI_INT, FIELD, MPI_COMM_WORLD);

其中NUMPROCS是正在运行的进程数。(实际上看起来我只需要它是2)。然后它会运行,但会产生意想不到的输出...

代码语言:javascript
复制
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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-11-09 00:02:05

在您的代码前面有一个错误:

代码语言:javascript
复制
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中,可以有多个未完成的非阻塞集合操作)。您应该将代码重写为:

代码语言:javascript
复制
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);
票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13290608

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档