与 MPI_Type_create_subarray 或 MPI_Type_vector/contigous 的 MPI 幽灵细胞交换

MPI ghost-cell exchange with MPI_Type_create_subarray or MPI_Type_vector/contigous

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

我目前面临的问题是,是否有一种方法可以使用子阵列构建幽灵单元,或者我是否必须使用矢量 MPI 类型?我找到了子数组 here 的提示,但我想我不能用它从不连续的内存中构建子数组。这个假设是否正确,我最好使用 MPI_Type_vector?

The question i currently face is if there is a way to build the ghost cells using subarrays or do i have to use the vector MPI Type?

您可以使用 MPI_Type_create_subarray 来实现幽灵细胞交换,但我认为这太过分了。它的主要目的是促进对分布在许多处理器上的全局数组的访问。对于 MPI,理想情况下您希望使用本地解决方案,在本例中是打包数据并仅在相邻进程之间传递。这避免了对于大量处理器来说扩展性很差的集体操作。

像您一样手动打包缓冲区可能相当有效。 MPI_types 简化了这个包装过程,但不一定会加快它的速度("Using MPI: Portable Parallel Programming with the Message-passing" 中给出了使用 MPI_TYPES 进行幽灵细胞交换的示例,作者:William Gropp、Ewing Lusk、Anthony Skjellum) .

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