MPI_Bcast,将数组缓冲区广播到接收缓冲区中的特定位置

时间:2017-12-11 20:50:56

标签: c++ mpi

使用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操作,它总是相同的。

有更简单的方法吗?

1 个答案:

答案 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;
}