二维拓扑中的 MPI 分区和通信(速度方向)

MPI partition and communication in 2D topology (velocity directions)

我找到了 this program,我的问题是...是否可以像这里一样更改此程序中的通信和邻居?

我需要在处理器之间将一个二维数组分成 4 个块(在每个处理器上只有一个进程应该工作)。额外的我必须使用格子模型模具(9分),而不是像康威生活游戏(5分模具)

我不确定,MPI 中的 2d 笛卡尔虚拟拓扑是否提供了使用超过 4 个方向来交换数据。也许我应该使用图表?而且我不知道如何在 tiles/halo/ghosts 之间的对角线方向上找不到任何有关交换数据的信息。有人可以解释一下吗?我真的需要帮助:(

您可以通过以下两个同步步骤进行通信:

  1. 分别向上和向下发送边界节点的顶部和底部行。

  2. 将扩展的左右列边界节点(即处理器拥有的边界节点加上刚刚收到的每个边界列的顶部和底部节点)发送到左右邻居。

并且将此通信与处理器内部节点所需的计算重叠将是有益的。

MPI 中的虚拟拓扑只是一种将抽象坐标映射到等级的机制,反之亦然。两个进程在笛卡尔拓扑中不是邻居并不会阻止它们进行通信。

您没有找到任何关于对角光环交换的信息的原因是根本没有必要明确地进行,因为当本地光环单元也包含在其中时,它作为常规光环交换的副作用发生交易所。

下面说明了典型的 2D 光晕交换是如何实现的。密切注意用大写字母表示的元素是如何移动的。源 columns/rows 用双 v/< 标记,目标用单 v/<.

初始配置

......      ......      ......
.aaaa.      .bbbb.      .cccc.
.aaaa.      .bbbb.      .cccc.
.aaaA.      .BbbB.      .Cccc.
......      ......      ......

......      ......      ......
.dddD.      .EeeE.      .Ffff.
.dddd.      .eeee.      .ffff.
.dddd.      .eeee.      .ffff.
......      ......      ......

沿第一个维度的正向光晕交换:

    v           v
    v       v   v       v
......      ......      ......
.aaaa.      abbbb.      bcccc.
.aaaa. ---> abbbb. ---> bcccc.
.aaaA.      ABbbB.      BCccc.
......      ......      ......

......      ......      ......
.dddD.      DEeeE.      EFfff.
.dddd. ---> deeee. ---> effff.
.dddd.      deeee.      effff.
......      ......      ......

沿第一个维度的负方向光环交换:

             v           v
     v       v   v       v
......      ......      ......
.aaaab      abbbbc      bcccc.
.aaaab <--- abbbbc <--- bcccc.
.aaaAB      ABbbBC      BCccc.
......      ......      ......

......      ......      ......
.dddDE      DEeeEF      EFfff.
.dddde <--- deeeef <--- effff.
.dddde      deeeef      effff.
......      ......      ......

沿第二个维度的正向光环交换:

......      ......      ......
.aaaab      abbbbc      bcccc.
.aaaab      abbbbc      bcccc.
.aaaAB      ABbbBC      BCccc. <<
......      ......      ......
   |           |           |
   v           v           v
.aaaAB      ABbbBC      BCccc. <
.dddDE      DEeeEF      EFfff.
.dddde      deeeef      effff.
.dddde      deeeef      effff.
......      ......      ......

沿第二个维度的负方向光环交换:

......      ......      ......
.aaaab      abbbbc      bcccc.
.aaaab      abbbbc      bcccc.
.aaaAB      ABbbBC      BCccc.
.dddDE      DEeeEF      EFfff. <
   ^           ^           ^
   |           |           |
.aaaAB      ABbbBC      BCccc.
.dddDE      DEeeEF      EFfff. <<
.dddde      deeeef      effff.
.dddde      deeeef      effff.
......      ......      ......

重要的是,对于在第一个之后沿所有维度进行的光晕交换,整个平板,包括局部光晕单元,都被交换。为简单起见,通常在第一次交换中也包含光环单元。

每个步骤都可以使用单个 MPI_Sendrecv 调用轻松实现。因此,在 2D 情况下,每个方向需要两个 MPI_Sendrecv 总共四个调用。使用 MPI_Cart_shift 可以轻松获得发送 to/receive 的排名。必须使用的另一个 MPI 特性是向量数据类型 (MPI_Type_vector),它允许访问 C/C++ 数组的列。对于三维或更高维拓扑,MPI_Type_create_subarray 函数会派上用场。