最适合“块分解”的MPI_Datatype?

时间:2011-07-06 15:02:42

标签: c mpi parallel-processing

Jonathan Dursiosgx的帮助下,我现在已经在流程中完成了“行分解”:

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


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

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

1 个答案:

答案 0 :(得分:2)

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

对于鬼细胞填充,在i方向你不需要类型,因为它与你一直在做的类似;但你可以使用一个MPI_Type_contiguous,它只指定某种类型的数量(你可以在发送/接收中做任何事情)。

对于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仅拉出所需阵列的区域;在这种情况下,这可能有点矫枉过正。

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

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