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

Posted

技术标签:

【中文标题】将由所有进程传播的数组的不同部分放入单个最终数组中的更好方法,在 C 中使用 MPI【英文标题】:Better way to put different parts of an array spread by all processes into a single final array with MPI in C 【发布时间】:2021-08-01 03:04:21 【问题描述】:

我把这段代码仅仅作为一个例子,这样你就可以理解我在寻找什么:

  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 尝试过,但没有得到正确的结果。

【问题讨论】:

【参考方案1】:

但我想知道是否有更好或更直接的方法 达到同样的效果以提高效率。

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

但请记住,MPI_Allreduce:

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

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

将所有进程的值减少为单个值

【讨论】:

以上是关于将由所有进程传播的数组的不同部分放入单个最终数组中的更好方法,在 C 中使用 MPI的主要内容,如果未能解决你的问题,请参考以下文章

简单地从firebase数据库中提取所有用户并将它们放入一个有效的数组中吗?

如何在 Phaser 3 中启用单击数组中的单个项目并将每个项目显示在屏幕的不同部分?

与不同大小数据类型的 MPI 通信

在具有不同对象的单个数组中获取 API 响应

归并排序思想

iPhone UITableView 从平面数组填充可变行部分