用 MPI_Bcast 实现 MPI 通信

我尝试使用 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;
}
82365 次浏览

对于新接触 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)步而不是采用 P 进程的 P步的基于树的分层通信)。

MPI_Bcast是一个集体操作,它必须由所有进程调用才能完成。

使用 MPI_Bcast时不需要调用 MPI_Recv。有一个帖子可能对你有帮助,点击这里