有人可以详细说明OpenMPI和MPICH实现MPI的区别吗?这两者哪个实现更好?
有人可以详细说明OpenMPI和MPICH实现MPI的区别吗?这两者哪个实现更好?
首先,重要的是要认识到MPICH和Open-MPI之间的区别,即它们旨在满足不同的需求。MPICH应该是最新MPI标准的高质量参考实现,并且是衍生实现以满足特殊目的需求的基础。Open-MPI针对常见情况进行优化,包括使用和网络通道。
历史上,Open-MPI没有对于MPI_THREAD_MULTIPLE
提供全面的支持,这对于某些应用程序至关重要。它可能在某些平台上得到支持,但不能普遍地假设它可以工作。另一方面,MPICH多年来一直对MPI_THREAD_MULTIPLE
提供全面的支持,尽管实现并不总是高性能的(参见"Locking Aspects in Multithreaded MPI Implementations"以获取一种分析)。
在Open-MPI 1.x中破坏的另一个功能是单边通信,也称为RMA。最近已经修复了这个问题,作为这些功能的非常重度用户,我发现它们在Open-MPI 3.x中通常运行良好(请参见ARMCI-MPI test matrix in Travis CI,其中显示了RMA与两种实现的结果,至少在共享内存中。我在Intel Omni Path上看到了类似的积极结果,但尚未测试Mellanox InfiniBand。
Open-MPI曾经在进程管理方面明显优于MPICH。旧版的MPICH启动程序(MPD)容易出现故障且难以使用。幸运的是,它已经被弃用多年(详见MPICH FAQ entry)。因此,因为MPD而批评MPICH是无稽之谈。
Hydra进程管理器非常好,具有与ORTE(在Open-MPI中)相似的可用性和功能集,例如,两者都支持HWLOC以控制进程拓扑。有报道称,在处理更大的作业(1000个或以上的进程)时,Open-MPI的进程启动速度比MPICH衍生产品快,但由于我在这方面没有第一手经验,因此不确定该得出什么结论。这种性能问题通常是特定于网络甚至特定于机器的。
使用MacOS和VPN时,我发现Open-MPI更加稳健,即MPICH可能会因主机名解析问题而挂起启动。由于这是一个错误,此问题可能会在未来消失。
尽管MPICH和Open-MPI都是开源软件,可以在各种平台上进行编译,但MPI库以二进制形式或与之链接的程序的可移植性通常很重要。
MPICH及其许多衍生产品支持ABI兼容性(website),这意味着库的二进制接口是恒定的,因此可以使用来自一个实现的mpi.h
进行编译,然后在另一个实现中运行。即使在库的多个版本之间也是如此。例如,我经常编译Intel MPI,但在运行时使用MPICH的开发版本的LD_PRELOAD
。ABI兼容性的一个巨大优势是独立软件供应商(ISV)可以发布针对MPICH系列的一个成员编译的二进制文件。
ABI并不是唯一的二进制兼容性类型。上述场景假定用户在所有地方使用相同版本的MPI启动器(通常是mpirun
或mpiexec
,以及其计算节点守护程序)和MPI库。但这在容器中并不一定成立。
我感谢 Open-MPI 团队的 Ralph Castain 向我解释了容器问题。上述引用是他的话。例如,Docker 世界使用的解决方法是将基础架构与应用程序一起放入容器中。换句话说,您将 MPI 守护程序与应用程序一起放入容器中,然后要求所有容器(包括 mpiexec)具有相同的版本。这样就避免了跨版本基础架构操作的问题。
以下是我对各个平台的评估:
苹果电脑上:Open-MPI和MPICH都可以正常工作。如果想要使用MPI-3标准的最新功能,则需要使用来自Homebrew的最新版本的Open-MPI。如果您在Mac笔记本电脑上运行,就没有理由考虑MPI性能。
共享内存的Linux系统上:Open-MPI和MPICH都可以正常工作。如果您想要一个支持MPI-3或MPI_THREAD_MULTIPLE的发行版本,除非您自己构建Open-MPI,否则可能需要使用MPICH,因为例如Ubuntu 16.04仅通过APT提供古老版本1.10。我不知道这两个实现之间是否有任何显着的性能差异。如果操作系统允许,两者都支持单拷贝优化。
搭载Mellanox InfiniBand的Linux系统上:请使用Open-MPI或MVAPICH2。如果您想要一个支持MPI-3或MPI_THREAD_MULTIPLE的发行版本,您可能需要使用MVAPICH2。我发现MVAPICH2表现非常好,但尚未直接与InfiniBand上的OpenMPI进行比较,其中对我来说性能最重要的特性(RMA aka one-sided)过去曾在Open-MPI中出现问题。
搭载Intel Omni Path(或其前身True Scale)的Linux系统:我在这些系统上使用了MVAPICH2、Intel MPI、MPICH和Open-MPI,并且它们都可以正常工作。因为Open-MPI具有经过优化的基于PSM2的后端,所以在开源实现中提供了最佳性能,而Intel MPI则倾向于最优化。我在GitHub上有一些关于如何构建不同开源实现的注释,但是这样的信息很快就会过时。
Cray或IBM超级计算机:MPI会自动安装在这些计算机上,并且在两种情况下都基于MPICH。已经演示了MPICH在Cray XC40上(here)使用OFI,Intel MPI在Cray XC40上(here)使用OFI,MPICH在Blue Gene/Q上使用OFI(here),以及Open-MPI在Cray XC40上同时使用OFI和uGNI(here),但这些都不得到供应商支持。
Windows:我认为在Windows上运行MPI没有意义,除非通过Linux VM进行,但是Microsoft MPI和Intel MPI都支持Windows并基于MPICH。我听说成功构建了MPICH或Open-MPI使用Windows Subsystem for Linux,但我没有个人经验。
完全透明地说,我目前在英特尔担任研究/探索职务(即我不从事任何英特尔软件产品的工作),曾在阿贡国家实验室工作了五年,在那里我与MPICH团队进行了广泛的合作。
两者都符合标准,所以从正确性的角度来看,使用哪个都无所谓。除非有一些特定的调试扩展等功能是必须的,否则建议对两者进行基准测试,并选择在你的硬件上应用程序更快的那一个。此外,还要考虑其他可能提供更好性能或兼容性的MPI实现,例如MVAPICH(可以获得最佳的InfiniBand性能)或Intel MPI(受到广泛支持的ISV)。HP公司努力使其MPI符合许多ISV代码的资格,但在被出售给Platform后,我不确定它的表现如何...