我正在编写MPI C代码,但发现MPI_Bcast存在问题,特别是我试图从size所表示的过程中以位置元素的大小发送数组size元素。
我写了这段代码,但是没有用。
#include<mpi.h>
#include<vector>
#include<iostream>
int main (int argc,char* argv[]) {
MPI_Init(&argc,&argv);
int rank,size,dimensions;
MPI_Comm_rank(MPI_COMM_WORLD,&rank);
MPI_Comm_size(MPI_COMM_WORLD,&size);
if (rank == 0 ){
int value;
std::vector<int> v;
std::cout<<"Dimension" <<std::endl;
std::cin>>dimensions;
std::cout<<"Values"<<std::endl;
for (int i=0;i<dimensions;++i){
std::cin>>value;
v.push_back(value);
}
}
int sizes[size]={0};
MPI_Bcast (&dimensions,1,MPI_INT, 0, MPI_COMM_WORLD);
int n_short = dimensions/size;
int n_long = n_short+1;
sizes[rank] = (rank<dimensions%size)?n_long:n_short;
MPI_Bcast (sizes+rank,1,MPI_INT,rank,MPI_COMM_WORLD);
MPI_Finalize();
return 0;
}
我无法解释为什么
MPI_Bcast (sizes+rank,1,MPI_INT,rank,MPI_COMM_WORLD);
不会改变任何东西,并且所有过程中的值都保持不变。
最佳答案
当您使用MPI_Bcast
参数等于root
调用rank
时,会将数据发送到该进程的所有其他进程。其他进程应将MPI_Bcast
与root
参数的值设置为相同,以接收它(例如在您的第一个MPI_Bcast
调用中)。您的代码中没有这样的调用,这就是为什么您什么都没收到的原因。
我猜您想在这里使用 MPI_Allgather
函数,该函数会将sizes
的所有元素收集到所有进程中:
int dimensions = 20;
std::vector<int> sizes(size);
const int n_short = dimensions / size;
const int n_long = n_short + 1;
const int this_size = (rank < dimensions % size) ? n_long : n_short;
MPI_Allgather(&this_size, 1, MPI_INT, sizes.data(), 1, MPI_INT, MPI_COMM_WORLD);
if (rank == 0)
for (auto s : sizes)
std::cout << s << ' ';
// Output for 3 processes: 7 7 6
或使用MPI_IN_PLACE
:int dimensions = 20;
std::vector<int> sizes(size);
const int n_short = dimensions / size;
const int n_long = n_short + 1;
sizes[rank] = (rank < dimensions % size) ? n_long : n_short;
MPI_Allgather(MPI_IN_PLACE, 0, MPI_DATATYPE_NULL, sizes.data(), 1, MPI_INT, MPI_COMM_WORLD);
还要注意,可变长度数组是not standard C++。首选std::vector
。
(Picture source)
关于c++ - MPI_Bcast与数组:每个进程发送一个元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59471653/