通过 MPI 进程同步数组:MPI_Allgather 的使用不正确?

Synchronize array over MPI processes: incorrect use of MPI_Allgather?

我知道之前已经解决了类似的问题,请参阅下文为什么它们不适用于我的情况。我有一段代码如下所示:

int current_rank;
MPI_Comm_rank(MPI_COMM_WORLD, &current_rank);

if (current_rank==ROOT_RANK){
   ...
  #pragma omp for
  for (long i = 0; i < num; i++) {
      auto &choumbie = catalogue->get()[i];
      /* array choumbie is modified */}
   ...}

然后我想在所有进程上同步数组 'choumbie'。我尝试在 this example and the documentation 之后实现它。所以,在 if (current_rank==ROOT_RANK) 之后,我做了:

  int gsize;
  int *rbuf; // address of receive buffer
  auto &choumbie = catalogue->get();

  MPI_Comm_size(comm, &gsize);
  int send_count=num;
  rbuf = (int*)malloc(gsize*send_count*sizeof(double));
  MPI_Allgather(choumbie,send_count, MPI_DOUBLE, rbuf, send_count, MPI_DOUBLE, comm);

我想我要同步的数组'choumbie'不是这样输入的,而且我也没有找到任何其他有用的例子。看起来第一个参数必须是要发送的数组的内存地址,但这似乎与我提供的示例不一致 above.

P.S.: 每个rank的num相同

This question was not helpful in my case, because I would like to use MPI_Allgather (also in C++, not Fortran). Also this 对我没有帮助,因为我想避免使用 MPI_Barrier.

只要num在每个等级上都相同,就很接近了。这取决于 catalogue->get(); 给你的是什么。我将假设它是一个整数数组。你应该只需要:

MPI_Allgather(choumbie,send_count, MPI_INT, rbuf, send_count, MPI_INT, comm);