最适合“块分解”的MPI_Datatype?

在Jonathan Dursi和osgx的帮助下 ,我现在已经完成了进程中的“行分解”:

行http://img535.imageshack.us/img535/9118/ghostcells.jpg


现在,我想尝试“块分解”方法(如下图所示): 阻止http://img836.imageshack.us/img836/9682/ghostcellsblock.jpg

应该怎么做呢? 这次, MPI_Datatype是必要的,对吧? 哪种数据类型最合适/易于使用? 或者它可以在没有数据类型的情况下完成吗?

通过创建缓冲区并将缓冲区复制为基础类型的计数,您始终可以在没有数据类型的情况下进行操作; 这在概念上是最简单的。 另一方面,它更慢,实际上涉及更多的代码行。 尽管如此,当你试图让某些东西工作时它可以很方便,然后你可以实现数据类型-y版本,并确保你得到相同的答案。

对于鬼细胞填充,在i方向你不需要一个类型,因为它类似于你一直在做的; 但你可以使用一个, MPI_Type_contiguousMPI_Type_contiguous指定某种类型的计数(你可以在你的send / recv中做任何事情)。

对于j方向上的ghost-cell填充,最简单的方法是使用MPI_Type_Vector 。 如果你发送最右边的一列(例如)一个i = 0..N-1,j = 0..M-1的数组,你想要发送一个count = N,blocksize = 1,stride = M的向量。 也就是说,您要发送1个值的计数块,每个值由数组中的M值分隔。

您还可以使用MPI_Type_create_subarray来拉出所需数组的区域; 在这种情况下,这可能有点矫枉过正了。

现在,如果您在上一个问题中希望能够在某个时刻将所有子数组收集到一个处理器上,那么您可能会使用子数组,并在此处回答部分问题: MPI_Type_create_subarray和MPI_Gather 。 请注意,如果您的arrays块大小不同,那么事情就会开始变得有些小问题。

(实际上,为什么你要聚集到一个处理器上呢?这最终会成为可扩展性的瓶颈。如果你是为I / O做的,一旦你对数据类型感到满意,就可以使用MPI-IO为了这..)