使用MPI,我希望通过通信组中的所有进程进行广播操作,这样在所有进程的boradcast结束时,所有进程中的缓冲区都具有相同的数据。
以下是一段代码,描述了我想要做的事情:
//assume there are 10 processes
MPI_Init(&argc, &argv);
MPI_Comm_size(MPI_COMM_WORLD, &size);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
double globalArray[100];
for(int i=0; i<100; ++i) {
A[i] = (double)i + 1.0;
}
double buffer[10]; //assume all entries in buffer is zero
//only one array location in each rank is initialized and rest remain zero
buffer[rank] = globalArray[(rank + 1)*10]
MPI_Bcast(&buffer, 1, MPI_DOUBLE, rank, MPI_COMM_WORLD);
MPI_Barrier(MPI_COMM_WORLD);
for(int i=0; i<10; ++i) {
std::cout << buffer[i] << "\t";
}
//expect to get [10 20 ... 100] in all the processes
MPI_Finalize();
我知道MPI_Scatterv在调用每个处理器时可以完成工作,但这意味着我必须创建两个额外的数组,一个用于send_counts和displacements,对于每个scatterv操作,它总是相同的。
有更简单的方法吗?
答案 0 :(得分:0)
如果我理解你的问题,你真正需要的是MPI_Allgather()
double myvalue = (rank + 1) * 10;
MPI_Allgather(&myvalue, 1, MPI_DOUBLE, buffer, 1, MPI_DOUBLE, MPI_COMM_WORLD);
MWE:
#include <mpi.h>
#include <iostream>
int main(int argc, char* argv[])
{
int size, rank;
MPI_Init(&argc, &argv);
MPI_Comm_size(MPI_COMM_WORLD, &size);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
double buffer[10];
double myvalue = (rank + 1) * 10;
MPI_Allgather(&myvalue, 1, MPI_DOUBLE, buffer, 1, MPI_DOUBLE, MPI_COMM_WORLD);
if (rank == 0) {
for(int i=0; i<10; ++i) {
std::cout << buffer[i] << "\t";
}
}
// answer for all processes: 10 20 ... 100
MPI_Finalize();
return 0;
}