【问题标题】:MPI_Bcast, broadcasting array buffer to specific locations in the receive bufferMPI_Bcast,将数组缓冲区广播到接收缓冲区中的特定位置
【发布时间】:2018-05-25 11:08:53
【问题描述】:

使用 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_Alltoall 使用单独的发送和接收缓冲区,但这并不能确保数据在接收缓冲区中的位置..

标签: c++ mpi


【解决方案1】:

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

【讨论】:

  • myvalue from task i 始终存储在 buffer[i] 中。如果这不是您所期望的,请上传验证预期结果的Minimal, Complete, and Verifiable example。我必须承认我很难理解你的期望。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-05
  • 2011-06-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多