c++ - MPI_Bcast与数组:每个进程发送一个元素

标签 c++ arrays mpi

我正在编写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_Bcastroot参数的值设置为相同,以接收它(例如在您的第一个MPI_Bcast调用中)。您的代码中没有这样的调用,这就是为什么您什么都没收到的原因。

我猜您想在这里使用 MPI_Allgather 函数,该函数会将sizes的所有元素收集到所有进程中:

MPI_Allgather

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/

相关文章:

C - MPI 子进程接收到不正确的字符串

c - MPI 反向探针

具有成员变量 vector <another class> 的 C++ 类

c++ - 如何使用 SDL2 Texture 作为更新 Canvas ?

c++ - 奇怪的赋值——匿名函数调用?

c++ - 删除完整链表时的段错误

javascript - 根据数值数组的第一个值和最后一个值对数值数组进行排序

javascript - 合并具有相似键的数组中的对象

c - 我想知道我在 C 中如何错误地读取(或写入)数组中的元素?

mpi - 运行混合 MPI 的最佳方式 - OpenMP 作业