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

MPI_Bcast, broadcasting array buffer to specific locations in the receive buffer

使用MPI,我想通过通信组中的所有进程进行广播操作,以便在所有进程广播结束时,所有进程中的缓冲区都有相同的数据。

这是描述我想要做的事情的代码片段:

//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 和位移,这将始终是每个 scatterv 操作都相同。

有更简单的方法吗?

如果我理解正确你的问题,你真正需要的是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;
}