mpi中的darray和子数组有啥区别?

Posted

技术标签:

【中文标题】mpi中的darray和子数组有啥区别?【英文标题】:What is the difference between darray and subarray in mpi?mpi中的darray和子数组有什么区别? 【发布时间】:2011-08-08 16:04:21 【问题描述】:

我有一个用于并行编程类的并行 I/O 项目,我必须实现派生数据类型。我没有清楚地理解 darray 和 subarray 之间的区别。 darray 是否可以从动态分配的数组派生?主要区别是什么?

【问题讨论】:

【参考方案1】:

子数组可让您描述更大的多维数组的单个块/片。如果每个 MPI 任务都有一个大型全局数组的切片/块,(或者如果您在任务之间通信本地数组的块),那么 MPI_Type_create_subarray 就是要走的路;语法非常简单。对于解决诸如常规网格上的偏微分方程之类的问题,这种分布非常常见——每个处理器都有自己的全局网格块,尽可能多的网格单元是本地的。在 MPI-IO 的情况下,每个 MPI 任务将创建一个与其对应的全局数组的子数组,并使用它作为视图来读入/写出它的域部分到包含所有数据的文件。

MPI_Type_create_darray 允许比单块每个更复杂的分布式数组模式。对于分布式线性代数计算,逐行分配一些矩阵可能是有意义的——比如,如果有 5 个 mpi 任务,任务 0 得到第 0、5、10 行……而任务 1 得到第 1、6 行, 11,以此类推。其他矩阵可能按列分布;或者您可以将它们分布在行、列或两者中。这些数据分布与命运多舛的HPF 中的数据分布相同,它允许您以这种方式逐个数组地定义数组的数据并行布局。

我自己使用过 MPI_Type_create_darray 的唯一方法,实际上也是我见过它使用的唯一方法,就是创建一个大型矩阵的 MPI 文件视图,以block-cyclic 的方式分发数据,所以可以读取文件,然后使用scalapack 对分布式矩阵进行并行线性代数运算。

【讨论】:

以上是关于mpi中的darray和子数组有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

MPI_Allgather 与 2D 数组

多进程和子进程有啥区别?

MPI_Bcast 动态二维数组

java中,父路径和子路径是啥?有啥区别?

如何通过 Boost.MPI 发送 2d Boost.MultiArray 的子数组?

最大和子数组 - 返回子数组和总和 - 分而治之