【问题标题】:How does OpenMPI's gather work?OpenMP 父亲是如何工作的?
【发布时间】:2017-02-23 10:11:12
【问题描述】:

我是 MPI 的新手,我正在尝试了解 MPI(尤其是 OpenMPI)的工作原理,以了解我的系统的性能。

我尝试在网上查找资源以帮助我更好地理解事物,但运气不佳。我以为我会来这里。

现在我的问题很简单:如果我有 3 个节点(1 个主节点,2 个客户端)并且我发出 MPI_Gather,根进程是按顺序处理还是同时处理传入数据?换句话说,如果进程 1 是第一个与进程 0 建立连接的,那么进程 2 是否必须等到进程 1 发送完数据才能开始发送数据?

谢谢!

【问题讨论】:

    标签: mpi openmpi


    【解决方案1】:

    Open MPI 中有多个组件实现集体操作,其中一些组件为每个操作的实现提供多种算法。

    您最感兴趣的是coll 框架的tuned 组件,因为它是Open MPI 默认使用的。 tuned 使用点对点操作实现所有集合,并提供多种算法用于收集:

    • 线性同步 - 用于大到中等大小的消息
    • 二项式 - 在进程数较大或消息大小较小时使用
    • 基本线性 - 用于所有其他情况

    每种算法的性能在很大程度上取决于消息大小和等级数的特定组合,因此该库带有一组启发式算法,试图根据数据大小和通信器的大小确定最佳算法(如上所述)。有几种机制可以覆盖启发式并强制使用某种算法或提供自定义算法选择规则列表。

    基本的线性算法只是在所有其他队列上按顺序接收消息的根循环。在这种情况下,rank 2 将无法在 rank 1 之前发送其块,因为 root 将首先收到来自 rank 1 的消息,然后才移动到 rank 2。

    线性同步算法将块分成两部分。就像在基本线性算法中一样,按顺序收集第一部分。第二部分是使用非阻塞接收异步收集的。

    二项式算法将等级排列为二项式树。树的节点处的进程接收来自较低级别的块并将它们聚合成更大的块,然后传递到上层,直到它们到达根级别。

    您可以在Open MPI source treeompi/mca/coll/tuned 文件夹中找到tuned 模块的源代码。在开发分支中,tuned 组件的一部分被提升为集体框架的基本实现,而收集的代码将在ompi/mca/coll/base 中找到。

    【讨论】:

    • 惊人的答案!非常感谢!
    【解决方案2】:

    Hristo 的回答当然很好,但我想提供不同的观点。

    出乎你的意料,这个问题并不简单。正如 Hristo 指出的那样,在不了解更多系统细节的情况下,甚至不可能专门回答它。这并不意味着这个问题是无效的,但你应该开始在不同的层面上对性能进行推理。

    首先,考虑收集操作的复杂性:到根的总网络传输以及内存需求随着通信器中的进程数量线性增长。这自然会限制可扩展性。

    其次,您可以假设您的 MPI 实现确实以最有效的方式实现了MPI_Gather - 比您手动实现要好。这个假设很可能是错误的,但它是编写程序的最佳起点。

    现在,当您拥有程序后,您应该衡量并查看时间花在哪里 - 或浪费在哪里。为此,您应该使用MPI performance analysis tools。现在,如果您已经确定您的 Gather 对性能有重大影响,您可以继续尝试优化它:但要这样做,首先考虑您是否可以在概念上更好地构建您的通信,例如通过以某种方式将计算全部删除或使用巧妙的减少来代替。如果您仍然需要坚持收集:继续调整您的 MPI 实现。然后验证您的优化确实提高了特定系统的性能。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-01-09
      • 2012-05-15
      • 1970-01-01
      • 2017-09-26
      • 1970-01-01
      • 1970-01-01
      • 2021-10-22
      • 2012-06-21
      相关资源
      最近更新 更多