首页 > 解决方案 > 将由所有进程传播的数组的不同部分放入单个最终数组中的更好方法,在 C 中使用 MPI

问题描述

我将此代码仅作为示例,以便您了解我在寻找什么:

  double *f = malloc(sizeof(double) * nx * ny);
  double *f2 = malloc(sizeof(double) * nx * ny);
  for ( i = process * (nx/totalProcesses); i < (process + 1) * (nx/totalProcesses); i++ )
  {
    for ( j = 0; j < ny; j++ )
    {
          f2[i*ny + j] = j*i;
    }
  }
  MPI_Allreduce( f2, f, nx*ny, MPI_DOUBLE, MPI_SUM, MPI_COMM);

是的,它有效,最后我在“f”中得到了正确的结果,这就是我想要的,但我想知道是否有更好或更直接的方法来实现同样的效果以提高效率。我用 allgather 进行了尝试,但无法获得正确的结果。

标签: arrayscparallel-processingmpiopenmpi

解决方案


但我想知道是否有更好或更直接的方法来实现相同的目的以提高效率。

不,在给定的上下文中,使用MPI 集体例程(理论上)总是比替代发送/接收更有效。尽管 MPI 标准没有强加它的良好实现,但是,它实现了 MPI 集体例程,如MPI_Allreduce步骤log(p)(具有p进程数)。

但是请记住,MPI_Allreduce

合并来自所有进程的值并将结果分发回所有进程。

因此,如果您确实需要所有流程中的结果,您可以使用MPI_Reduce

将所有流程的值减少到单个值


推荐阅读