我有一个并行编程类的并行I / O项目,我必须实现派生数据类型。我没有清楚地理解darray和子阵列之间的区别。 darray可以从动态分配的数组派生吗?主要区别是什么?
答案 0 :(得分:5)
Subarray允许您描述更大的多维数组的单个块/切片。如果每个MPI任务都有一个大型全局数组的单个切片/块,(或者如果您在任务之间传递本地数组的块),则MPI_Type_create_subarray是可行的方法;语法非常简单。为了解决常规网格上的PDE问题,这种分布非常普遍 - 每个处理器都有自己的全局网格块,尽可能多的网格单元是本地的。在MPI-IO的情况下,每个MPI任务将创建一个与其全局数组相对应的子数组,并使用该数据作为视图将其部分域读入/写入包含所有数据的文件。
MPI_Type_create_darray允许比单块每个更复杂的分布式阵列模式。对于分布式线性代数计算,逐行分配一些矩阵可能是有意义的 - 比方说,如果有5个mpi任务,任务0得到第0行,第5行,第10行......任务1得到第1,6行第1行, 11,依此类推。其他矩阵可能按列分布;或者您可以将它们分布在行,列或两者中。这些数据分布与命运多HPF中的数据分布相同,它允许您以逐个数组的方式以这种方式定义数组的数据并行布局。
我自己使用MPI_Type_create_darray的唯一方法,也是我见过它的唯一方法,就是创建一个大矩阵的MPI文件视图,以block-cyclic方式分发数据,以便人们可以读取文件,然后使用scalapack对分布式矩阵进行并行线性代数运算。