148

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

4

5 回答 5

175

目的

首先,重要的是要认识到 MPICH 和 Open-MPI 的不同之处,即它们旨在满足不同的需求。MPICH 应该是最新 MPI 标准的高质量参考实现,是满足特殊目的需求的衍生实现的基础。Open-MPI 在使用和网络管道方面都针对常见情况。

网络技术支持

Open-MPI在此处记录其网络支持。MPICH 在随每个版本分发的 README 中列出了这些信息(例如,是针对 3.2.1 的)。请注意,因为 Open-MPI 和 MPICH 都支持OFI(又名 libfabric)网络层,它们支持许多相同的网络。然而,libfabric 是一个多方面的 API,所以不是每个网络都支持相同的(例如 MPICH 有一个基于 OFI 的 IBM Blue Gene/Q 实现,但我不知道 Open-MPI 中的等效支持) . 但是,MPICH 和 Open-MPI 的基于 OFI 的实现都在共享内存、以太网(通过 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 标准每个版本的第一个实现,从 MPI-1 到 MPI-3。Open-MPI 直到最近才支持 MPI-3,我发现某些 MPI-3 功能在某些平台上存在错误(当然,MPICH 并非没有错误,但 MPI-3 功能中的错误远不常见)。

从历史上看,Open-MPI 没有对 . 的全面支持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 可能由于主机名解析问题而在启动时挂起。由于这是一个错误,因此此问题将来可能会消失。

二进制可移植性

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

MPICH 及其许多衍生产品支持 ABI 兼容性(网站),这意味着库的二进制接口是恒定的,因此可以mpi.h从一个实现编译然后与另一个实现一起运行。即使跨多个版本的库也是如此。例如,我经常编译英特尔 MPI,但LD_PRELOAD在运行时编译 MPICH 的开发版本。ABI 兼容性的一大优势是 ISV(独立软件供应商)可以发布仅针对 MPICH 系列的一个成员编译的二进制文件。

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

虽然 Open-MPI 不承诺 ABI 兼容性,但他们在支持容器(文档幻灯片)方面投入了大量资金。这需要非常小心地维护不同版本的 MPI 启动器、启动器守护程序和 MPI 库之间的兼容性,因为用户可能使用比容器支持中的启动器守护程序更新的 MPI 启动器版本来启动作业。如果不注意启动器界面的稳定性,除非启动器的每个组件的版本兼容,否则容器作业将无法启动。这不是一个无法克服的问题:

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

我感谢 Open-MPI 团队的 Ralph Casttain 向我解释了容器问题。前面的报价是他的。

特定平台比较

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

  • 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 with Mellanox InfiniBand:使用 Open-MPI 或 MVAPICH2。如果您想要一个支持所有 MPI-3 或 的发布版本MPI_THREAD_MULTIPLE,您可能需要 MVAPICH2。我发现 MVAPICH2 的性能非常好,但没有与 InfiniBand 上的 OpenMPI 进行直接比较,部分原因是过去对我来说性能最重要的功能(RMA 又称单面)在 Open-MPI 中已被破坏。

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

  • Cray 或 IBM 超级计算机:MPI 自动安装在这些机器上,并且在这两种情况下都基于 MPICH。使用 OFI 在 Cray XC40(此处)上演示了 MPICH,使用 OFI 在 Cray XC40(此处上演示了英特尔 MPI,使用 OFI(此处)在 Blue Gene/Q 上演示了 MPICH ,以及使用 OFI 和 uGNI 在 Cray XC40 上演示了 Open- MPI此处),但这些都不支持供应商。

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

笔记

完全公开,我目前在英特尔从事研究/寻路工作(即我不从事任何英特尔软件产品的工作),之前在阿贡国家实验室工作了五年,在那里我与 MPICH 团队进行了广泛的合作。

于 2014-08-25T19:46:52.827 回答
17

如果您进行开发而不是生产系统,请使用 MPICH。MPICH 有内置调试器,而我上次检查时 Open-MPI 没有。

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

于 2010-03-11T21:47:26.977 回答
13

我同意之前的海报。尝试两者,看看您的应用程序在哪一个上运行得更快,然后将其用于生产。它们都符合标准。如果是您的桌面,那也可以。OpenMPI 在 Macbook 上开箱即用,而 MPICH 似乎对 Linux/Valgrind 更友好。它在您和您的工具链之间。

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

于 2010-03-18T15:29:55.987 回答
8

两者都符合标准,因此从正确性的角度来看,使用哪一个并不重要。除非您需要某些功能(例如特定的调试扩展),否则请对两者进行基准测试并为您的硬件上的应用程序选择更快的那个。还要考虑其他 MPI 实现可能会提供更好的性能或兼容性,例如 MVAPICH(可以具有最佳的 InfiniBand 性能)或 Intel MPI(广泛支持的 ISV)。惠普也努力让他们的 MPI 获得大量 ISV 代码的资格,但我不确定它在被出售给平台后的表现如何......

于 2010-03-18T16:07:11.200 回答
3

根据我的经验,OpenMPI 支持但 MPICH 不支持的一项好功能是进程关联。例如,在 OpenMPI 中,使用-npersocket您可以设置在每个套接字上启动的排名数。rankfile此外,当您想确定核心等级或超额订阅它们时,OpenMPI非常方便。

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

于 2018-06-08T18:10:35.800 回答