代码之家  ›  专栏  ›  技术社区  ›  lava

MPICH与OpenMPI

  •  112
  • lava  · 技术社区  · 15 年前

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

    5 回复  |  直到 7 年前
        1
  •  129
  •   Jeff Hammond    7 年前

    目的

    首先,重要的是要认识到MPICH和开放式MPI是如何不同的,即它们是为满足不同的需求而设计的。MPICH应该是最新MPI标准的高质量参考实现,是满足特殊用途需求的派生实现的基础。开放式MPI的目标是共同的情况,无论是在使用和网络管道。

    网络技术支持

    打开MPI文档及其网络支持 here . MPICH在随每个版本分发的自述文件中列出了这些信息(例如 this 适用于3.2.1)。注意,因为open mpi和mpich都支持 OFI (又称libfabric)网络层,它们支持许多相同的网络。但是,libfabric是一个多方面的API,因此并非每个网络都支持相同的API(例如,MPICH有一个基于OFI的IBM Blue Gene/Q实现,但我不知道在开放MPI中有同等的支持)。然而,基于OFI的MPICH和开放MPI实现都在共享内存、以太网(通过TCP/IP)、Mellanox Infiniband、Intel Omni Path以及其他网络上工作。OpenMPI还支持这些网络和其他本地网络(即中间没有OFI)。

    在过去,关于MPICH的一个常见抱怨是它不支持Infiniband,而OpenMPI支持。然而,mvapich和intel mpi(其中包括mpich衍生产品)都支持infiniband,所以如果你愿意将mpich定义为“mpich及其衍生产品”,那么mpich具有非常广泛的网络支持,包括infiniband和专有互连,如cray seastar、gEmini和Aries以及IBM Blue Gene(/L,/P和/Q)。开放MPI也支持Cray-Gemini互连,但Cray不支持其使用。最近,MPICH通过netmod支持Infiniband(现在已弃用),但mvapich2进行了广泛的优化,使其在几乎所有情况下都成为首选实现。

    最新MPI标准的功能支持

    正交轴到硬件/平台的支持覆盖了MPI标准。在这里,MPICH通常是远远领先的。MPICH是MPI标准从MPI-1到MPI-3每个版本的第一个实现。开放式MPI最近才支持MPI-3,我发现有些MPI-3功能在某些平台上有缺陷(当然,MPICH不是无缺陷的,但MPI-3功能中的缺陷却不常见)。

    历史上,开放式MPI对 MPI_THREAD_MULTIPLE 这对于某些应用程序是至关重要的。它可能在某些平台上得到支持,但通常不能被认为是有效的。另一方面,MPICH对 MPI_线程_多个 多年来,尽管实施并不总是高性能的(参见 "Locking Aspects in Multithreaded MPI Implementations" 一次分析)。

    另一个在开放MPI1.x中被破坏的特性是单向通信,也就是RMA。最近已经解决了这个问题,作为这些功能的一个非常重要的用户,我发现它们在OpenMPI3.x中通常工作得很好(参见 ARMCI-MPI test matrix in Travis CI 结果显示,至少在共享内存中,两个实现都可以使用RMA。我在IntelOmniPath上看到了类似的积极结果,但还没有测试MellanoxInfiniband。

    过程管理

    过去开放式MPI的一个显著优势是流程管理器。旧的MPICH发布(MPD)既脆弱又难以使用。幸运的是,它已被弃用多年(参见 MPICH FAQ entry 详细信息)。因此,对MPIC的批评是虚假的。

    Hydra Process Manager非常好,具有与Orte(在开放MPI中)相似的可用性和功能集,例如,两者都支持HwLoc控制流程拓扑。有报道称,开放式MPI流程的启动速度比MPICH衍生产品要快(超过1000个流程),但由于我在这里没有第一手经验,所以我不愿意陈述任何结论。这种性能问题通常是特定于网络的,有时甚至是特定于机器的。

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

    二进制可移植性

    虽然mpich和open mpi都是可以在多种平台上编译的开源软件,但二进制形式的mpi库或与之相连的程序的可移植性通常很重要。

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

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

    尽管开放式MPI不能保证ABI的兼容性,但它们在支持容器方面投入了大量资金。( docs , slides )这需要非常小心地维护不同版本的MPI启动程序、启动程序守护程序和MPI库之间的兼容性,因为用户可以使用比容器支持中的启动程序守护程序更新版本的MPI启动程序来启动作业。如果不注意启动器接口的稳定性,容器作业将不会启动,除非启动器的每个组件的版本都兼容。这不是一个无法克服的问题:

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

    我感谢开放MPI团队的拉尔夫·卡斯坦向我解释了容器问题。前一句话是他的。

    平台特定比较

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

    • Mac OS:开放式MPI和MPICH都可以正常工作。要获得MPI-3标准的最新功能,您需要使用最新版本的OpenMPI,该版本可从自制程序中获得。如果您在Mac笔记本电脑上运行,就没有理由考虑MPI性能。

    • 带共享内存的Linux:开放式MPI和MPICH都可以正常工作。如果您想要一个支持所有MPI-3或MPI线程的发布版本,那么您可能需要MPICH,除非您自己构建开放式MPI,因为例如Ubuntu 16.04只通过apt提供了古老的版本1.10。我不知道这两个版本之间有任何显著的性能差异。实施。如果操作系统允许,两者都支持单副本优化。

    • 使用Mellanox Infiniband的Linux:使用开放式MPI或MVAPICH2。如果需要支持所有MPI-3或 MPI_线程_多个 不过,您可能需要mvapich2。我发现MVAPICH2在Infiniband上的性能非常好,但没有直接与OpenMPI进行比较,部分原因是过去在OpenMPI中,性能对我来说最重要的功能(即单侧功能)已经被打破了。

    • Linux与Intel Omni Path(或其前身,真正的规模):我已经使用MVAPICH2、IntelMPI、MPICH和OpenMPI在这类系统上,而且都在工作。“英特尔MPI”趋向于最优化,而“开放MPI”则提供了开源实现的最佳性能,因为它们具有良好的优化性能 PSM2 -基于后端。我有一些 notes on GitHub 关于如何构建不同的开源实现,但是这样的信息很快就过时了。

    • CRAY或IBM超级计算机:MPI自动安装在这些机器上,在这两种情况下都是基于MPICH的。已经在cray xc40上演示了MPICH( here )使用 OFI ,cray xc40上的Intel MPI( here )使用ofi,mpich on blue gene/q使用ofi( here )并使用ofi和ugni在cray xc40上打开mpi( 在这里 ,但这些都不受供应商支持。

    • Windows:我认为在Windows上运行MPI没有意义,除了通过Linux虚拟机,但是Microsoft MPI和Intel MPI都支持Windows,并且是基于MPICH的。我听过有关成功构建MPICH或使用 Windows Subsystem for Linux 但没有个人经验。

    笔记

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

        2
  •  11
  •   Jeff Hammond    9 年前

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

    在生产中,打开MPI最有可能更快。但是,您可能需要研究其他替代方案,如英特尔MPI。

        3
  •  10
  •   Chad Brewbaker    15 年前

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

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

        4
  •  6
  •   Jeff Hammond    9 年前

    两者都是标准兼容的,所以从正确的角度来看,使用哪一个并不重要。除非您需要某些功能,例如特定的调试扩展,否则请对两者进行基准测试,并为硬件上的应用选择速度更快的功能。另外,考虑到还有其他MPI实现可能提供更好的性能或兼容性,例如MVAPIC(可以具有最好的InfiniBand性能)或IntelMPI(广泛支持的ISV)。惠普也在努力让他们的MPI通过许多ISV代码的认证,但我不确定在平台上销售后会怎么样…

        5
  •  1
  •   hmofrad    7 年前

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

    最后,如果您需要控制列组到核心的映射,我绝对建议您使用OpenMPI编写和编译代码。