c - 最适合 "block decomposition"的 MPI_Datatype ?

标签 c mpi parallel-processing

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

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

<小时/>

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

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

最佳答案

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

对于幽灵细胞填充,在 i 方向上你不需要类型,因为它与你一直在做的类似;但您可以使用一个,MPI_Type_contiguous ,它只是指定某种类型的计数(您无论如何都可以在发送/接收中执行此操作)。

对于 j 方向的鬼细胞填充,最简单的方法可能是使用 MPI_Type_Vector 。如果您要发送(比方说)i=0..N-1、j=0..M-1 的数组的最右列,您希望发送 count=N、blocksize=1、stride=M 的 vector 。也就是说,您要发送 1 个值的计数 block ,每个 block 由数组中的 M 个值分隔。

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

现在,如果像上一个问题一样,您希望能够在某个时刻将所有子数组收集到一个处理器上,那么您可能会使用子数组,并且部分问题在这里得到了回答:MPI_Type_create_subarray and MPI_Gather 。请注意,如果您的数组 block 的大小不同,那么事情就会开始变得有点棘手。

(实际上,为什么要在一个处理器上进行收集?这最终会成为可扩展性瓶颈。如果您是针对 I/O 进行此操作,一旦您熟悉了数据类型,就可以使用MPI-IO 为此..)

关于c - 最适合 "block decomposition"的 MPI_Datatype ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6598578/

相关文章:

我可以从 PIC C18 中的 main.c 访问 source.c 中的并集吗?

c - 为每个 mpi 进程使用不同的 View 写入文件

java - 调试 mpi java

python - 如何使用 PyTorch 并行化 CNN 对图像的评估

c - 地址 sanitizer : SEGV on unknown address

使用VS2008为64位windows平台编译C++静态库

c - 在 Linux 上,当使用 C 执行与端口 0(选择一个随机端口)的套接字绑定(bind)时,我得到 errno 98,Address already in use。这怎么可能?

c++ - 不同进程数的不同浮点答案

r - R 中的并行包在 Windows 上通过引用传递大对象

r - 通过用 lapply 命令替换 For 循环来改进其执行时间