Open MPI是开源的消息传递接口(MPI)实现,由多所高校、研究机构与厂商组成的联合体共同开发与维护。MPI本身只是一份并行编程接口规范,需要具体实现才能使用,Open MPI就是其中应用最广的实现之一,覆盖从笔记本到大型超级计算机的各种系统。项目采用修改版BSD许可证,内部以模块化组件架构组织,可同时支持多种网络、进程调度器与操作系统,是高性能计算领域常用的并行通信库。
定义
Open MPI是一套开源的消息传递接口(Message Passing Interface,MPI)实现,即把 MPI 标准所定义的函数接口用可编译、可运行的代码加以落实的类库[1]。MPI 标准由 MPI 论坛制定,本身只是接口规范而非代码,因此同一份 MPI 程序需要由具体实现来提供支撑,Open MPI是其中两大主流开源实现之一,另一支为 MPICH[2]。
它由多个学术、研究与产业伙伴组成的联合体共同开发维护,目标是提供开源、高性能、可移植的 MPI 实现,既面向系统和软件厂商,也面向应用开发者与计算机科学研究人员[3]。库主体以 C 语言编写,内嵌 Fortran 绑定,并提供 mpicc、mpic++、mpifort 等包装编译命令,编译时自动加入头文件路径与库链接参数[1]。
原理
MPI 程序以单程序多数据方式运行,同一个可执行文件被启动为多个进程,进程间通过点对点通信和集合通信交换数据。点对点操作由发送与接收函数完成,集合操作则覆盖广播、归约、扫描、栅栏同步等常见模式,Open MPI 在实现时把消息切分成片段、选择可用网络设备逐片发送,并对资源占用加以控制[4]。
Open MPI 的内部结构建立在模块化组件架构(MCA)之上。上层框架定义一组接口,各组件分别实现这些接口,组件既可与源码一同编译,也可作为第三方插件在运行时动态加载;MPI 初始化时,上层会探测并发现可用的框架与组件[1]。常见的框架包括负责点对点通信的 pml、匹配传输层 mtl、字节传输层 btl、集合操作 coll、单边通信 osc、归约操作 op 等[5]。
对于网络传输,运行时会按固定次序自动挑选默认通道:若存在 InfiniBand 设备则优先使用 UCX 的 pml;若存在 PSM、PSM2 或支持标签匹配的 Libfabric 设备则使用 cm pml 配合相应的 mtl;否则退回 ob1 pml 配合一个或多个 btl 模块[6]。用户也可以用 mpirun 的 --mca 参数强制指定,例如 --mca pml ucx 强制走 UCX,或 --mca pml ob1 --mca btl tcp,self 强制走 TCP[6]。
进程启动由运行时环境负责,Open MPI 同时支持 mpirun 与 mpiexec 两个命令,并可通过参数选择 rsh/ssh、PBS/Torque、SLURM 等启动机制[7]。ompi_info 工具可以列出已安装版本、编译配置、已启用的组件及其可调参数,便于诊断运行环境[7]。
发展历程
Open MPI 的源头是三个已有 MPI 实现:田纳西大学的 FT-MPI、洛斯阿拉莫斯国家实验室的 LA-MPI、印第安纳大学的 LAM/MPI,斯图加特高性能计算中心的 PACX-MPI 团队也参与贡献[8]。2003 年,这几个项目的主要开发者不断在各类高性能计算会议上碰面,逐渐发现彼此在做大量重复工作,于是在 SC2003 会议期间决定放下旧有代码,完全从头编写新实现[8]。
新代码库的首次提交发生在 2003 年 11 月 22 日,正式的大规模开发从 2004 年 1 月 5 日开始[8]。项目在 2004 年的 SC 大会上做了演示,2005 年 11 月 17 日发布 1.0 版;此后 1.0.1 于 2005 年 12 月 12 日、1.0.2 于 2006 年 4 月 7 日相继发布,1.0 系列随后停止维护[9]。
2006 年前后,项目以 v1.1.x 与 v1.2.x 为稳定版本,成员包括 4 个美国能源部实验室、多所高校与若干厂商[10]。2017 年 11 月,Open MPI 3.0.0 以子包形式进入 Red Hat 系列发行版;2019 年前后 4.0.x 系列发布;2024 年前后 5.0.x 系列进入 Fedora、Ubuntu 等发行版[3][11]。
版本兼容策略上,v4.0.x 与 v3.0.x、v3.1.x 保持 ABI 兼容,v4.1.x 又与 v4.0.x 保持 ABI 兼容,因此跨大版本升级通常无需重新编译应用[12]。社区同时维护两个发布分支,新的大版本发布后,较旧的一支转入不再支持状态[1]。
应用
Open MPI 被全球众多高性能计算中心采用,或作为主要的 MPI 实现,或作为厂商 MPI、MPICH、MVAPICH 之外的备选方案,同时也出现在商用云平台上[1]。由于获取途径众多——发行版软件仓库、源码包、包管理器、厂商打包版本等,实际使用者规模难以准确统计,很多人在使用它时并不知情[1]。
在发行版层面,Open MPI 被收录进 Debian、Red Hat、SuSE、Fedora、CentOS、Scientific Linux、Ubuntu 等众多 Linux 发行版,也通过 Homebrew、MacPorts 进入 macOS,并可由 Spack、EasyBuild 等构建工具安装,还被英伟达 HPC-X 之类的厂商套件打包分发[1][13]。
库支持的网络与运行环境比较广泛,包括共享内存、InfiniBand、Cray uGNI、TCP 以及英伟达 CUDA 驱动等,可适配多种作业调度器与 32 位、64 位操作系统[6]。除 MPI 本身,它还在同一代码基础上提供 OpenSHMEM 支持,其中的主力网络模型同样基于 UCX[14]。
性能方面,基于 Open MPI 及其底层 OpenFabrics 组件的系统曾登上 2006 年 11 月 Top500 榜单第 6 位,实测性能约 53 万亿次浮点运算每秒[4]。
局限
Open MPI 的 MPI 标准合规程度有限。v5.0.x 发布线对外声明符合 MPI 3.1,而非 MPI 4.0;v6.1.x 系列支持全部 MPI-3.1 功能,只覆盖部分 MPI-4.0 功能,MPI_VERSION 与 MPI_SUBVERSION 分别取值为 3 和 1[1][15]。在 MPI 论坛的合规状态表中,MPI 4.0 的 MPI_T Events 一项 Open MPI 尚未实现,大计数(Large Counts)特性也仍标注为部分完成[16]。
从 v4.0.0 起,若干在 MPI-2.0 中已废弃、并在 MPI-3.0 中被删除的 MPI-1 旧符号不再默认出现在 mpi.h 中,这会让部分老应用编译失败;虽然符号仍保留在库里,使旧程序仍可链接运行,但需要显式配置 --enable-mpi1-compatibility 才能恢复原型[15]。
网络支持也在收缩。自 4.0.0 起,通过 openib 插件提供 InfiniBand 支持的做法被标记为弃用,改由 UCX 的 pml 组件承担;openib 的 btl 在 v5.0.0 中被彻底移除,这意味着原本依赖 libibverbs 的配置需要改为依赖 UCX 库[14]。
功能移除还涉及调试接口。MPIR 接口曾在 SC17 的 BOF 上宣布弃用,2018 年初在 NEWS 中给出弃用通知,v4.0.0 中运行时给出警告,最终在 v5.0.0 中被删除,改由 PMIx 工具接口取代,依赖 MPIR 例程的 gdb 脚本需要相应改写[5]。此外 v5.0.0 与 4.1 发布线之间改动较多,跨版本迁移时可能需要调整 Spack 等构建工具的变体配置[5]。
配置层面也有若干约束。若在指定 --with- 后仍找不到该依赖的头文件或库,configure 会直接中止而非静默跳过,需要人工处理[14]。与基于 OpenFabrics 的网络配合使用时,fork() 只获得部分支持,且限于较新内核与 libibverbs 版本,这受制于 OFED 网络栈本身的限制[6]。
参见
参考资料
- LA-UR-26-27054 [引用日期2026-10-14]
- MPI Evolution [引用日期2026-10-14]
- Linux @ CERN [引用日期2026-10-14]
- Open MPI Is [引用日期2026-10-14]
- Open MPI versioning [引用日期2026-10-14]
- ornl.gov 上的网页 [引用日期2026-10-14]
- Open MPI – History [引用日期2026-10-14]
- History of Open MPI [引用日期2026-10-14]
- Open MPI: Version 1.0 [引用日期2026-10-14]
- Open MPI: Overview [引用日期2026-10-14]
- openmpi-bin binary package in Ubuntu Noble arm64 [引用日期2026-10-14]
- major-changes [引用日期2026-10-14]
- parallel/openmpi - The NetBSD Packages Collection [引用日期2026-10-14]
- ompi [引用日期2026-10-14]
- mpi [引用日期2026-10-14]
- Implementation Status [引用日期2026-10-14]