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