首页 > 解决方案 > 通过 MPI 进程同步数组:不正确地使用 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”。我试图按照这个例子和文档来实现它。所以,在 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' 不会以这种方式输入,但我也没有找到任何其他有用的示例。看起来第一个参数必须是要发送的数组的内存地址,但这似乎与我上面提供的示例不一致。

PS:每个等级的num都是一样的。

这个问题对我来说没有帮助,因为我想使用 MPI_Allgather(也在 C++ 中,而不是 Fortran)。这我来说也没有帮助,因为我想避免使用 MPI_Barrier。

标签: c++mpithread-synchronization

解决方案


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

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

推荐阅读