【问题标题】:MPI ghost-cell exchange with MPI_Type_create_subarray or MPI_Type_vector/contigousMPI ghost-cell 与 MPI_Type_create_subarray 或 MPI_Type_vector/contigous 交换
【发布时间】:2015-03-20 06:36:42
【问题描述】:

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

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

【问题讨论】:

    标签: subdomain mpi


    【解决方案1】:

    我目前面临的问题是,是否有办法使用子数组构建幽灵单元,还是必须使用向量 MPI 类型?

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

    手动打包缓冲区可能相当有效。 MPI_types 简化了这个打包过程,但不一定加快它(William Gropp、Ewing Lusk、Anthony Skjellum 的“使用 MPI:带有消息传递的便携式并行编程”中给出了使用 MPI_TYPES 进行幽灵单元交换的示例) .

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

    【讨论】:

    • 确实第 4.7 章(第二版)包含矢量的用法。我仍然没有在书中找到任何关于 MPI_Type_create_subarray 例程的信息(我只有第 2 版)。新版本中还有更多内容吗?
    • 我在书中阅读了更多内容,并认为做我想做的事情的最佳方法确实是遵循我首先给出的链接中的建议。然后,一旦计算完成,MPI 子阵列可用于收集“子矩阵”的整个块。我想也可以使用子数组来构建幽灵单元,但我认为 MPI 向量和连续对于这种方法更方便。
    • 对不起,我没有 MPI 书的副本了,所以是凭记忆(第 1 版)。我认为子阵列对于您想要的东西来说可能是过度的——它更多的是为了促进通过许多处理器访问全局阵列,而不是扩散求解器所需的相邻处理器交换。我总是手动打包缓冲区,假设 MPI_types 简化了这个打包过程,而不是加快它(我认为他们甚至说使用 MPI 或 MPI-2.0 类型更慢但应该会变得更好)。无论您做什么,您的代码或 MPI 都必须进行跨步数据访问并复制数据以准备幽灵单元数据...
    • 此外,MPI_Type_create_subarray 是在 MPI-2 标准中引入的,因此不会出现在第一本书中(在同一作者的使用 MPI-2:消息传递接口的高级特性中)。虽然,就像你在上一条评论中所说的那样,我认为最后使用 MPI_types 和 MPI_gatherv 将是可行的方法。
    • 这不是一个答案(或者至少没有提供一个全面的解决方案),应该作为评论发布。
    猜你喜欢
    • 1970-01-01
    • 2011-07-31
    • 2011-07-31
    • 1970-01-01
    • 2012-10-31
    • 1970-01-01
    • 2017-08-08
    • 2013-07-08
    • 2018-09-29
    相关资源
    最近更新 更多