【问题标题】:MPI partition and communication in 2D topology (velocity directions)二维拓扑中的 MPI 分区和通信(速度方向)
【发布时间】:2019-03-24 10:53:18
【问题描述】:

我找到了this program,我的问题是......是否可以像这里一样改变这个程序中的沟通和邻里关系?

我需要将 2D 数组划分为处理器之间的 4 个块(在每个块上只有一个进程应该工作)。另外我必须使用格子模型模板(9 分),而不是康威生命游戏(5 分模板)

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

【问题讨论】:

    标签: c mpi decomposition


    【解决方案1】:

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

    您没有找到关于对角光环交换的任何信息的原因是,完全没有必要明确地这样做,因为当本地光环单元也包含在交换中时,它会作为常规光环交换的副作用发生.

    以下说明了如何实现典型的 2D 光环交换。密切注意用大写字母表示的元素如何移动。源列/行标有双 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 调用轻松实现。因此,在二维情况下,每个方向需要两个MPI_Sendrecv,总共需要四个调用。使用MPI_Cart_shift 可以轻松获得发送/接收的排名。另一个必须使用的 MPI 特性是向量数据类型 (MPI_Type_vector),它允许访问 C/C++ 数组的列。对于三维或更高维拓扑,MPI_Type_create_subarray 函数会派上用场。

    【讨论】:

      【解决方案2】:

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

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

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

      将这种通信与处理器内部节点上所需的计算重叠将是有益的。

      【讨论】:

        猜你喜欢
        • 2016-12-01
        • 2014-07-23
        • 2013-04-18
        • 2019-05-24
        • 2014-04-28
        • 1970-01-01
        • 2014-01-22
        • 1970-01-01
        • 2013-03-19
        相关资源
        最近更新 更多