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;
}
使用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;
}