MPICH vs OpenMPI

有人能详细说明 MPI 的 OpenMPI 和 MPICH 实现之间的区别吗? 两者中哪一个是更好的实现?

98345 次浏览

如果你做的是开发而不是生产系统,那就用 MPICH。MPICH 有内置的调试器,而 Open-MPI 上次检查时没有。

在生产中,Open-MPI 很可能会更快。但是,您可能需要研究其他替代方案,例如英特尔 MPI。

我同意之前的海报。尝试两种方法,看看哪一种应用程序运行得更快,然后将其用于生产。它们都符合标准。如果它是你的桌面或者是罚款。OpenMPI 在 Macbook 上是开箱即用的,而 MPICH 似乎更加适合 Linux/ValGraduate。它在你和你的工具链之间。

如果它是一个生产集群,你需要进行更广泛的基准测试,以确保它是针对你的网络拓扑优化的。在生产集群上配置它将是主要的时间差异,因为您必须使用 RTFM。

两者都是符合标准的,所以从正确的角度来看,使用哪种方法并不重要。除非您需要某些特性,例如特定的调试扩展,否则都要进行基准测试,并选择硬件上运行速度更快的应用程序。还要考虑其他 MPI 实现可能提供更好的性能或兼容性,例如 MVAPICH (可以具有最好的 InfiniBand 性能)或 Intel MPI (广泛支持的 ISV)。惠普努力工作,以获得他们的 MPI 资格与许多 ISV 代码,但我不知道它是如何进展后,被出售给平台..。

目的

首先,重要的是要认识到 MPICH 和 Open-MPI 是如何不同的,即它们是为满足不同的需求而设计的。MPICH 被认为是最新 MPI 标准的高质量参考实现,是满足特殊需求的衍生实现的基础。Open-MPI 针对常见情况,包括使用和网络管道两方面。

网络技术支持

开放 MPI 文档他们的网络支持 给你。MPICH 在每个版本发布的 README 中列出了这些信息(例如,这个用于3.2.1)。请注意,因为 Open-MPI 和 MPICH 都支持 火警调查办公室(又名 libric)网络层,所以它们支持许多相同的网络。然而,libFabric 是一个多方面的 API,所以不是每个网络都可以在两者中得到相同的支持(例如,MPICH 有一个基于 OFI 的 IBM Blue Gene/Q 实现,但是我不知道 Open-MPI 中有相同的支持)。然而,基于 OFI 的 MPICH 和 Open-MPI 实现正在共享内存、以太网(通过 TCP/IP)、 Mellanox InfiniBand、 Intel Omni Path 以及可能的其他网络上工作。Open-MPI 还支持这两种网络和其他网络(即中间没有 OFI)。

过去,关于 MPICH 的一个常见抱怨是它不支持 InfiniBand,而 Open-MPI 支持。然而,MVAPICH 和 Intel MPI (以及其他两个都是 MPICH 的衍生物)都支持 InfiniBand,所以如果有人愿意将 MPICH 定义为“ MPICH 及其衍生物”,那么 MPICH 拥有极其广泛的网络支持,包括 InfiniBand 和专有互连,如 Cray Seastar,Gemini 和 Aries 以及 IBM Blue Gene (/L,/P 和/Q)。Open-MPI 也支持 Cray Gemini 互连,但是 Cray 不支持它的使用。最近,MPICH 通过 netmod 支持 InfiniBand (现在已经废弃) ,但是 MVAPICH2具有广泛的优化,使其成为几乎所有情况下的首选实现。

最新 MPI 标准的特性支持

硬件/平台支持的正交轴是 MPI 标准的覆盖率。在这里 MPICH 通常是远远优于。MPICH 是从 MPI-1到 MPI-3的每一个 MPI 标准版本的第一个实现。Open-MPI 最近才支持 MPI-3,我发现一些 MPI-3特性在一些平台上存在 bug (当然,MPICH 并非没有 bug,但是 MPI-3特性中的 bug 要少得多)。

从历史上看,Open-MPI 还没有对 MPI_THREAD_MULTIPLE提供全面的支持,而 MPI_THREAD_MULTIPLE对于某些应用程序来说是至关重要的。它可能在某些平台上受到支持,但通常不能假定它可以工作。另一方面,MPICH 多年来一直全面支持 MPI_THREAD_MULTIPLE,尽管实施效果并不总是很好(见 “多线程 MPI 实现中的锁定方面”的一个分析)。

Open-MPI 1.x 中另一个被破坏的特性是单向通信,也就是 RMA。这个问题最近已经解决了,我发现,作为这些特性的重度使用者,它们在 Open-MPI 3.x 中通常工作得很好(参见例如 Travis CI 中的 ARMCI-MPI 测试矩阵的结果显示 RMA 可以同时使用两种实现,至少在共享内存中是这样的。我在 Intel Omni Path 上看到过类似的积极结果,但是还没有测试过 Mellanox InfiniBand。

过程管理

Open-MPI 过去明显优越的一个领域是流程管理器。旧的 MPICH 发射(MPD)是脆弱的,难以使用。幸运的是,它已经被弃用多年了(详见 MPICH 常见问题条目)。因此,因 MPD 而对 MPICH 的批评是虚假的。

Hydra 流程管理器非常好,具有与 ORTE (在 Open-MPI 中)类似的可用性和特性集,例如,两者都支持 HWLOC 控制流程拓扑。有报道称,对于更大的工作(1000多个流程) ,Open-MPI 流程的启动速度比 MPICH 衍生物更快,但由于我在这里没有第一手经验,因此我不愿意陈述任何结论。这种性能问题通常是特定于网络的,有时甚至是特定于计算机的。

我发现 Open-MPI 在使用带 VPN 的 MacOS 时更加健壮,也就是说,由于主机名解析问题,MPICH 在启动时可能会挂起。因为这是一个 bug,所以这个问题将来可能会消失。

二进制便携性

虽然 MPICH 和 Open-MPI 都是可以在各种平台上编译的开源软件,但是二进制形式的 MPI 库或与之相关的程序的可移植性通常很重要。

MPICH 及其许多衍生物支持 ABI 兼容性(网站) ,这意味着库的二进制接口是常数,因此可以从一个实现用 mpi.h编译,然后用另一个实现运行。即使在多个版本的库中也是如此。例如,我经常在运行时编译 Intel MPI 但是 LD_PRELOAD是 MPICH 的开发版本。ABI 兼容性的最大优势之一是,ISV (独立软件供应商)可以发布只针对 MPICH 家族中的一个成员编译的二进制文件。

ABI 并不是唯一的二进制兼容类型。上面描述的场景假设用户在任何地方都使用相同版本的 MPI 启动程序(通常是 mpirunmpiexec,以及它的计算节点守护进程)和 MPI 库。对于容器来说,情况不一定是这样。

虽然 Open-MPI 不能保证 ABI 兼容性,但是他们已经在支持容器(医生幻灯片)上投入了大量资金。这需要在保持不同版本的 MPI 启动程序、启动程序守护进程和 MPI 库之间的兼容性方面非常小心,因为用户可能使用比容器支持中的启动程序守护进程更新版本的 MPI 启动程序来启动作业。如果不仔细注意启动程序接口的稳定性,容器作业将不会启动,除非启动程序的每个组件的版本是兼容的。这不是一个无法解决的问题:

例如,Docker 使用的变通方法是将基础设施与应用程序一起容器化。换句话说,您将 MPI 守护进程包含在应用程序本身的容器中,然后要求所有容器(包括 mpiexec)具有相同的版本。这可以避免这个问题,因为您不再拥有跨版本的基础设施操作。

我感谢 Open-MPI 团队的 Ralph Castain 向我解释了容器问题。前面的引用是他的。

平台比较

以下是我对每个平台的评价:

  • Mac OS: Open-MPI 和 MPICH 都可以正常工作。要获得 MPI-3标准的最新特性,您需要使用 Open-MPI 的最新版本,可以从 Homebrew 获得。如果您使用的是 Mac 笔记本电脑,那么就没有理由考虑 MPI 性能。

  • 带有共享内存的 Linux: Open-MPI 和 MPICH 都应该可以正常工作。如果你想要一个支持所有 MPI-3或 MPI _ THREAD _ MULTIPLE 的发行版,你可能需要 MPICH,除非你自己构建 Open-MPI,因为例如 Ubuntu 16.04只通过 APT 提供了古老版本1.10。我不知道这两个实现之间有任何显著的性能差异。如果操作系统允许,它们都支持单拷贝优化。

  • Linux 与 Mellanox InfiniBand: 使用 Open-MPI 或 MVAPICH2。如果您想要一个支持所有 MPI-3或 MPI_THREAD_MULTIPLE的发行版,您可能需要 MVAPICH2。我发现 MVAPICH2的性能非常好,但是还没有和 InfiniBand 上的 OpenMPI 进行直接比较,部分原因是因为性能对我来说最重要的特性(RMA 也就是片面的)在过去的 Open-MPI 中已经被打破了。

  • Linux 与英特尔 Omni Path (或其前身 True Scale) : 我在这样的系统上使用了 MVAPICH2、英特尔 MPI、 MPICH 和 Open-MPI,它们都能正常工作。Intel MPI 趋向于最优化,而 Open-MPI 提供了开源实现的最佳性能,因为它们有一个优化良好的基于 PSM2的后端。我有一些关于如何构建不同的开源实现的 GitHub 上的注释,但是这些信息很快就过时了。

  • Cray 或 IBM 超级计算机: MPI 自动安装在这些计算机上,并且在这两种情况下都基于 MPICH。已经有使用 火警调查办公室的 Cray XC40(给你)上的 MPICH 的示范,使用 OFI 的 Cray XC40(给你)上的 Intel MPI,使用 OFI 的 Blue Gene/Q 上的 MPICH (给你)和使用 OFI 和 uGNI (给你)的 Cray XC40上的 Open-MPI,但是这些都不是供应商支持的。

  • Windows: 我认为在 Windows 上运行 MPI 除了通过 Linux VM 之外没有任何意义,但是 Microsoft MPI 和 Intel MPI 都支持 Windows 并且是基于 MPICH 的。我听说过使用 用于 Linux 的 Windows 子系统成功构建 MPICH 或 Open-MPI 的报道,但没有个人经验。

笔记

在充分披露,我目前为英特尔公司的研究/寻路能力(即,我不工作在任何英特尔软件产品) ,以前在阿贡国家实验室工作了五年,在那里我与 MPICH 团队广泛合作。

根据我的经验,OpenMPI 支持但 MPICH 不支持的一个好特性是 过程亲和力过程亲和力。例如,在 OpenMPI 中,使用 -npersocket可以设置在每个套接字上启动的等级数。此外,OpenMPI 的 rankfile非常方便,当你想要确定核心排名或过度订阅。

最后,如果您需要控制等级到核心的映射,我肯定会建议使用 OpenMPI 编写和编译代码。