2011-04-19 15 views
3

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

回答

5

子数组允许您描述更大的多维数组的单个块/切片。如果每个MPI任务都有一个大型全局数组的单个片/块(或者如果您正在任务之间传递本地数组的块),那么MPI_Type_create_subarray是要走的路;语法非常简单。为了解决像常规网格上的PDE这样的事情,这种分布非常普遍 - 每个处理器都有自己的全局网格块,尽可能多的网格单元是本地的。在MPI-IO的情况下,每个MPI任务都会创建一个与其全局数组相对应的子数组,并使用它作为视图将其部分域读入/写出到包含所有数据的文件中。

MPI_Type_create_darray允许比单个块更复杂的分布式阵列模式。对于分布式线性代数计算,分布某些矩阵可能是有意义的 - 比方说,如果有5 mpi的任务,任务0获得第0,5,10行...和任务1获得第1,6,6,8行, 11,等等。其他矩阵可能按列分布;或者您可以将它们分布在行,列或两者的块中。这些数据分布与命运不佳的HPF中的数据分布相同,因此您可以通过这种方式逐个数组地定义数组的数据并行布局。

我自己曾经使用MPI_Type_create_darray的唯一方法,也是我见过它的唯一方法,就是创建一个大矩阵的MPI文件视图,以便以block-cyclic的形式分配数据,这样可以读取该文件,然后使用scalapack在分布式矩阵上执行并行线性代数运算。

+0

很好的解释!谢谢! – onatm 2012-04-01 19:45:31