3

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

4

1 回答 1

5

子数组可让您描述更大的多维数组的单个块/片。如果每个 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 文件视图,以块循环方式分布数据,这样就可以读入文件,然后使用scalapack对分布式矩阵进行并行线性代数运算。

于 2012-03-30T19:46:27.333 回答