通常当我们调用 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 点时,它需要广播自己的计算结果局部变量,所有节点都更新全局变量。所以所有节点都需要广播一条消息,但我们不知道顺序。如何实现这个想法?