与MPI_Type_create_subarray或MPI_Type_vector / contiguous的MPI ghost-cell交换

时间:2015-03-18 11:53:05

标签: subdomain mpi

我目前正在尝试实现类似于2D中的扩散的模拟。我想通过使用域组合来加速该过程,在正确的块中自动拆分整个域(根据硬件 - MPI_Dims_create)。然后,我在每次迭代后交换相邻单元/进程之间的重影单元(因为它们是下一次迭代所需的) 我用笛卡尔坐标(MPI_Cart_create)实现了整体,所以我将整个域分成Nx * Ny个不同维度Nx和Ny的块。我已经有了缓冲区在概念上最简单的实现,但我想使用现在的MPI类型来提高性能。

我目前面临的问题是,是否有办法使用子阵列构建鬼细胞或者我是否必须使用向量MPI类型?我发现了对子阵列here的提示,但我想我不能用它来构建来自不连续内存的子阵列。这个假设是否正确,我应该最好使用MPI_Type_vector吗?

1 个答案:

答案 0 :(得分:0)

  

我目前面临的问题是,如果有一种方法可以使用子阵列构建鬼细胞,还是必须使用向量MPI类型?

你可以使用MPI_Type_create_subarray来实现鬼细胞交换,但我认为这有点过分。它的主要目的是促进对遍布许多处理器的全局阵列的访问。使用MPI,您最好使用本地解决方案,在这种情况下,打包数据并仅在相邻进程之间传递。这避免了对大量处理器进行严重扩展的集体操作。

手动打包缓冲区可能相当有效。 MPI_types简化了这个打包过程,但并不一定能加快它的速度(使用MPI_TYPES进行重影交换的例子见“使用MPI:消息传递的便携式并行编程”作者:William Gropp,Ewing Lusk,Anthony Skjellum) 。

无论你做什么,MPI都必须进行跨步数据访问和复制数据,以准备用于交换重影数据的缓冲区。