MPI_ERR_TRUNCATE:广播

Posted

技术标签:

【中文标题】MPI_ERR_TRUNCATE:广播【英文标题】:MPI_ERR_TRUNCATE: On Broadcast 【发布时间】:2012-10-28 17:48:29 【问题描述】:

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

【问题讨论】:

我写的代码没有任何问题;你如何定义FIELD?你能发布更多代码吗?你确定是这个广播导致了问题吗? @JonathanDursi,这里是 gist.github.com/4039617 我希望在对我的答案进行三遍编辑之后,您的问题的根本原因现在是可读和可以理解的 :) 【参考方案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 中的所有进程都不会调用此广播(但仅由根),因此会干扰下一个广播操作,即循环内的广播操作。第二个广播操作实际上将第一个(两个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);

【讨论】:

以上是关于MPI_ERR_TRUNCATE:广播的主要内容,如果未能解决你的问题,请参考以下文章

通过 MPI [MPI4py] 发送复数时的 MPI_ERR_TRUNCATE

zabbix-历史数据清理sql

Mysql基本命令一

关于MySQL的CRUD操作

mysql的基本操作,如删,修改表

App Engine:如何“重置”数据存储区?