gpt4 book ai didi

c++ - MPI_ERR_TRUNCATE : On Broadcast

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:20:02 25 4
gpt4 key购买 nike

我有一个 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 获胜者时,它应该是-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);

关于c++ - MPI_ERR_TRUNCATE : On Broadcast,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13290608/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com