- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
有人可以详细说明 MPI 的 OpenMPI 和 MPICH 实现之间的区别吗?
两者中哪一个是更好的实现?
最佳答案
目的
首先,重要的是要认识到 MPICH 和 Open-MPI 的不同之处,即它们旨在满足不同的需求。 MPICH 应该是最新 MPI 标准的高质量引用实现,也是衍生实现以满足特殊用途需求的基础。 Open-MPI 在使用和网络管道方面针对常见情况。
网络技术支持
Open-MPI 记录了他们的网络支持 here . MPICH 在随每个版本分发的 README 中列出了此信息(例如 this 适用于 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、英特尔 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
有全面的支持。多年来,尽管实现并不总是高性能的(参见 "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 发射 (MPD) 脆弱且难以使用。幸运的是,它已被弃用多年(详见 MPICH FAQ entry)。因此,由于 MPD 而对 MPICH 的批评是虚假的。
Hydra 流程管理器非常好,具有与 ORTE(在 Open-MPI 中)相似的可用性和功能集,例如两者都支持 HWLOC 以控制过程拓扑。有报道称,对于大型作业(1000 多个进程)而言,Open-MPI 进程的启动速度比 MPICH 衍生程序更快,但由于我在这里没有第一手经验,因此我不便说出任何结论。此类性能问题通常是特定于网络的,有时甚至是特定于机器的。
我发现 Open-MPI 在将 MacOS 与 VPN 一起使用时更加健壮,即 MPICH 可能由于主机名解析问题而在启动时挂起。由于这是一个错误,此问题将来可能会消失。
二进制可移植性
虽然 MPICH 和 Open-MPI 都是可以在各种平台上编译的开源软件,但二进制形式的 MPI 库或链接到它们的程序的可移植性通常很重要。
MPICH 及其许多衍生产品支持 ABI 兼容性( website ),这意味着库的二进制接口(interface)是恒定的,因此可以使用 mpi.h
进行编译。从一个实现开始,然后与另一个实现一起运行。即使跨多个版本的库也是如此。例如,我经常编译 Intel MPI 但 LD_PRELOAD
运行时 MPICH 的开发版本。 ABI 兼容性的一大优势是 ISV(独立软件供应商)可以发布仅针对 MPICH 系列成员编译的二进制文件。
ABI 不是唯一的二进制兼容性类型。上述场景假设用户使用相同版本的 MPI 启动器(通常是 mpirun
或 mpiexec
,以及它的计算节点守护进程)和 MPI 库无处不在。容器不一定是这种情况。
虽然 Open-MPI 不 promise ABI 兼容性,但他们在支持容器( docs 、 slides )方面投入了大量资金。这需要非常小心地维护不同版本的 MPI 启动程序、启动程序守护程序和 MPI 库之间的兼容性,因为用户可以使用比容器支持中的启动程序守护程序更新的 MPI 启动程序版本来启 Action 业。如果不注意启动器界面的稳定性,除非启动器的每个组件的版本兼容,否则容器作业将不会启动。这不是一个不可逾越的问题:
The workaround used by the Docker world, for example, is to containerize the infrastructure along with the application. In other words, you include the MPI daemon in the container with the application itself, and then require that all containers (mpiexec included) be of the same version. This avoids the issue as you no longer have cross-version infrastructure operations.
MPI_THREAD_MULTIPLE
的发布版本,不过您可能需要 MVAPICH2。我发现 MVAPICH2 性能非常好,但没有在 InfiniBand 上与 OpenMPI 进行直接比较,部分原因是性能对我来说最重要的功能(RMA 又名片面)过去在 Open-MPI 中已被破坏。 关于MPICH 与 OpenMPI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2427399/
我有一组需要在集群中执行的计算操作(可能像 512 MPI 进程)。现在,我让集群上的根节点打开一个套接字并在计算操作之间将数据传输到我的本地计算机,但我想知道是否可以只创建两个 MPI 组,其中一个
我的 Linux 机器上有一个可执行文件,我知道它是使用 OpenMPI 或 MPICH 库编译的。 问题:如何确定是哪一个? 最佳答案 以下诊断过程假设 MPICH/MPICH2 和 Open MP
我有一个为 gcc 编写的用于并行计算的 C 代码,我想在集群上编译它,这显然是通过 mpicc opal_wrapper -rwxr-xr-x /usr/bin/opal_wrapper 如果我能
我正在具有OpenMPI的服务器上编译我的代码,但是我需要知道我使用的版本,以便阅读正确的文档。我可以打印中的常量来显示当前版本吗? 最佳答案 使用OpenMPI,最简单的方法是运行ompi_info
例如,我使用mpirun -n 4 启动4个进程。进程 0 接收来自进程 1、进程 2 和进程 3 的消息。进程1按照message0, message1, message2的顺序发送消息。当进程0收
在阻塞和非阻塞操作(在 OpenMPI 中)的上下文中,我对同步的概念有点混淆 - 从这里开始: link 1 :MPI_Isend是 不一定异步(所以它可以同步?) link 2 :MPI_Isen
有人可以详细说明 MPI 的 OpenMPI 和 MPICH 实现之间的区别吗? 两者中哪一个是更好的实现? 最佳答案 目的 首先,重要的是要认识到 MPICH 和 Open-MPI 的不同之处,即它
我正在用 C 语言学习 OpenMPI。我在用这个程序做矩阵乘法时遇到了一些麻烦,结果是错误的。程序编译通过了,但是我觉得我的矩阵乘法算法哪里有问题。 我解决这个问题的方法是使用 MPI_Scatte
在MPI中,启动后是否可以添加新节点?例如,我有 2 台计算机已经在运行并行 MPI 应用程序。我在第三台计算机上启动此应用程序的另一个实例,并将其添加到现有的通信器中。所有计算机都在本地网络中。 最
我已成功在服务器和我的计算机之间设置无密码 ssh。有一个简单的openMPI程序,在单机上运行良好。但是,不幸的是,当我在集群上尝试此操作时,我既没有收到密码提示(因为我已经设置了 ssh 授权),
我一直在使用 OpenMPI,但在需要从我的过程中获得排名时,我没有得到预期的行为。 我有一个简单的 C 程序,应该打印每个进程的排名: minimal.c: #include #include "
我正在尝试并行化 BMP 图像的灰度过滤器,当尝试从像素数组发送数据时,我的函数卡住了。 #include #include #include #include #include "mpi.h
我希望使用此代码执行以下操作: 将文件读入缓冲区(效果很好!)(并且不希望更改我读取文件的方式或存储文件的方式)。 使用MPI_Scatter跨多个“节点”发送该缓冲区,因此每个节点都可以计算空白的次
我正在努力了解 OpenMPI 中的信号处理。我读到“Open MPI 会将 SIGUSR1 和 SIGUSR2 从 mpiexec 转发到其他进程”。我的问题是默认安装时启用此功能。 场景是一个 M
几天以来,我一直在努力解决这个问题。我有一个混合 OpenMPI + Pthreads 程序。这意味着,程序在多台机器上运行,每台机器运行一组 pthreads。 为了简化问题,让我们假设有 3 台机
我有一些使用 OpenMPI 的 *.cpp 文件。我还有 *.h 文件,其中包含指定给我的函数(其中一些)和它们的实现: void Show(std::string s); void ShowLin
目前,我有一个很好的 c++ 图算法,它是用链表或链表数组的自定义结构定义编写的(我应该将其转换为模板定义,但目前不是)。这个算法很容易分发,我想测试一下。但是,除了了解一些基本的 MPI 示例之外,
我包含一个静态头文件 utils.h 和一个函数 linspace。我的main.cpp文件如下: #include #include #include using namespace std;
我目前正在构建一个小型实用程序库,作为一个较大项目的一部分。OpenMPI 有一个记录良好的 API 库,但当涉及到节点之间的低级通信时,我有点困惑。我知道在编写你的算法时,你将它分布在所有预期进行计
你好:我正在为我设置一个 OpenMPI 环境,我在其中设置了三个使用无密码身份验证等的虚拟机。我有一个简单的“Hello World”样式程序已成功编译/链接: #include #include
我是一名优秀的程序员,十分优秀!