gpt4 book ai didi

c - 使用 MPI_Bcast 进行 MPI 通信

转载 作者:太空狗 更新时间:2023-10-29 16:16:16 25 4
gpt4 key购买 nike

我正在尝试使用 MPI_Bcast 从根节点向所有其他节点广播一条消息。但是,每当我运行这个程序时,它总是卡在开头。有人知道它有什么问题吗?

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

int main(int argc, char** argv) {
int rank;
int buf;
MPI_Status status;
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);

if(rank == 0) {
buf = 777;
MPI_Bcast(&buf, 1, MPI_INT, 0, MPI_COMM_WORLD);
}
else {
MPI_Recv(&buf, 1, MPI_INT, 0, 0, MPI_COMM_WORLD, &status);
printf("rank %d receiving received %d\n", rank, buf);
}

MPI_Finalize();
return 0;
}

最佳答案

对于刚接触 MPI 的人来说,这是一个常见的混淆来源。你不使用 MPI_Recv()接收广播发送的数据;你用MPI_Bcast() .

例如,你想要的是这样的:

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

int main(int argc, char** argv) {
int rank;
int buf;
const int root=0;

MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);

if(rank == root) {
buf = 777;
}

printf("[%d]: Before Bcast, buf is %d\n", rank, buf);

/* everyone calls bcast, data is taken from root and ends up in everyone's buf */
MPI_Bcast(&buf, 1, MPI_INT, root, MPI_COMM_WORLD);

printf("[%d]: After Bcast, buf is %d\n", rank, buf);

MPI_Finalize();
return 0;
}

对于 MPI 集体通信,每个人都必须参与;每个人都必须调用 Bcast 或 Allreduce,或者你有什么。 (这就是为什么 Bcast 例程有一个参数指定“root”,或者谁在发送;如果只有发送者调用 bcast,你就不需要这个。)每个人都调用广播,包括接收者;接收者不只是发布接收信息。

这样做的原因是集体操作可以让每个人都参与到沟通中,这样你就可以声明你想要发生什么(每个人都得到一个进程的数据)而不是如何发生(例如,根处理器循环遍历所有其他级别并发送),因此有优化通信模式的空间(例如,采用 log(P) 步骤而不是 的基于树的分层通信code>P 个步骤用于 P 个进程)。

关于c - 使用 MPI_Bcast 进行 MPI 通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7864075/

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