【问题标题】:Synchronize array over MPI processes: incorrect use of MPI_Allgather?通过 MPI 进程同步数组:不正确使用 MPI_Allgather?
【发布时间】:2020-06-25 16:14:17
【问题描述】:

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

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 示例和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.:每个等级的 num 都是一样的。

This 问题对我的情况没有帮助,因为我想使用 MPI_Allgather(也在 C++ 中,而不是 Fortran)。 this 对我的情况也没有帮助,因为我想避免使用 MPI_Barrier。

【问题讨论】:

  • 每个等级的“num”是否相同? “rbuf”是一个整数数组,但您使用 MPI_DOUBLE 类型进行通信。您可能需要使用 allreduce 函数为“rbuf”分配“num”的全局总和。
  • 是的,num 是一样的。我已经相应地更新了帖子。您能否提供一个代码示例来说明您的意思? Wrt rbuf,那是一个错误的类型,它是一个双精度的,也是固定的。
  • 我在你的原始代码中遗漏了一些东西,你不需要调用 Allreduce。要遵循的代码。
  • 同步数组是什么意思?如果您希望将ROOT_RANK 的副本分发给所有其他队伍,那么只需使用MPI_Bcast。使用MPI_Allgather,您正在收集choumbie 的本地副本并将它们连接到rbuf 中的一个大数组中。还是choumbie 是块分布式的?
  • 我想收集所有级别的信息到choumbie。因此,无论进程以何种方式修改(或未)修改数组,我都希望最终的choumbie 能够通过它可能从所有级别进行的任何修改进行更新。但是,对于您提出的任何建议,您能否提供代码示例,因为问题是我首先不了解上下文中的语法。

标签: c++ mpi thread-synchronization


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2023-03-20
    • 2011-11-03
    • 2012-06-20
    • 2014-03-03
    • 2021-07-03
    • 1970-01-01
    • 1970-01-01
    • 2011-04-17
    • 2017-08-13
    相关资源
    最近更新 更多