gpt4 book ai didi

c - 当 MPI_Bcast 中的 root 是随机的时会发生什么

转载 作者:太空宇宙 更新时间:2023-11-04 06:38:50 24 4
gpt4 key购买 nike

通常我们调用MPI_Bcast时,必须确定根。但现在我有一个不关心谁将广播消息的应用程序。这意味着将广播消息的节点是随机的,但是一旦消息被广播,全局变量必须是一致的。我的理解是,由于MPI_Bcast是一个集体函数,所有节点都需要调用它,但顺序可能不同。那么谁先到达 MPI_Bcast,谁就将消息广播给其他人。我用 3 个节点运行了以下代码,我认为如果节点 1(rank==1)首先到达 MPI_Bcast,它会将 local_count 值(1)发送到其他节点,然后所有节点使用相同的 local_count 更新 global_count,所以我的预期结果之一是(输出顺序无关紧要)
节点0,全局计数为1
节点1,全局计数为1
节点2,全局计数为1

但实际结果总是(输出顺序无关紧要):
节点1,全局计数为1
节点0,全局计数为0
节点2,全局计数为2

这个结果和没有 MPI_Bcast 的代码完全一样。那么我对 MPI_Bcast 或我的代码的理解有什么问题吗?谢谢。

#include <mpi.h>
#include <stdio.h>

int main(int argc, char *argv[])
{

int rank, size;
int local_count, global_count;
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Comm_size(MPI_COMM_WORLD, &size);

global_count = 0;
local_count = rank;

MPI_Bcast(&local_count, 1, MPI_INT, rank, MPI_COMM_WORLD);
global_count += local_count;

printf("node %d, global count is: %d\n", rank, global_count);
MPI_Finalize();
}

代码是一个简化的案例。在我的应用程序中,在 MPI_Bcast 之前有一些计算,我不知道谁先完成计算。每当一个节点来到 MPI_Bcast 点,它需要广播自己的计算结果局部变量,所有节点更新全局变量。所以所有节点都需要广播一条消息,但我们不知道顺序。如何实现这个想法?

最佳答案

通常你写的东西会导致死锁。在典型的 MPI_Bcast 情况下,等级为 root 的进程将其数据发送到通信器中的所有其他进程。您需要在这些接收进程中指定相同的 root 等级,以便他们知道“听”谁。这是一个过于简化的描述,因为通常使用分层广播来减少总操作时间,但是对于三个进程,这种分层实现减少到非常简单的线性实现。在您的案例中,等级为 0 的进程将尝试向进程 12 发送相同的消息。同时,进程 1 不会收到该消息,而是会尝试将其发送给进程 02。进程 2 也将尝试发送到 01。最后,每个进程都会发送其他进程不愿接收的消息。这几乎肯定会招致灾难。

为什么你的程序没有挂起?因为发送的消息非常小,只有一个 MPI_INT 元素,而且进程的数量也很少,因此这些发送都在每个进程中由 MPI 库在内部缓冲——它们永远不会到达目的地,但尽管如此,MPI_Bcast 内部进行的调用不会阻塞,并且您的代码会取回执行控制权,尽管操作仍在进行中。这是未定义的行为,因为标准不需要 MPI 库缓冲任何内容 - 一些实现可能会缓冲,而另一些则可能不会。

如果您尝试计算所有进程中所有 local_count 变量的总和,则只需使用 MPI_Allreduce。替换为:

global_count = 0;
local_count = rank;

MPI_Bcast(&local_count, 1, MPI_INT, rank, MPI_COMM_WORLD);
global_count += local_count;

用这个:

local_count = rank;
MPI_Allreduce(&local_count, &global_count, 1, MPI_INT, MPI_SUM, MPI_COMM_WORLD);

关于c - 当 MPI_Bcast 中的 root 是随机的时会发生什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11355809/

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