关于各种MPI的关系
个人接触的最多其实是CUDA,但因为最近工作需要用到MPI,又重新对MPI有了新的认识。 本篇内容简单介绍MPI,并阐述mpicc、mpich等各种mpi的关系
什么MPI
MPI 实际上是 计算编程模型 + 通信语义接口规范
MPI 是一个并行编程标准,它既定义了模型,也定义了协议;并由多个实现完成实际运行支持。
关于 mpi 与 openmp 与 cuda
cuda就不用多说了,深度学习离不开cuda;gpt3.5问世之后 nvidia 市价更是狂涨
一开始总是分不清openmp 与 openmpi 的关系,有一段时间以为是同一个东西, 这里简单两个表格区别三者
架构
| 并行模型 | 面向架构 | 编程范式 | 粒度 | 使用方式 |
|---|---|---|---|---|
| OpenMP | 多核 CPU | 共享内存并行 | 中等粒度 | 在单节点上用线程并行 |
| MPI | 多节点集群 | 分布式内存并行 | 大粒度 | 多进程 + 消息传递 |
| CUDA | GPU | 大规模 SIMD 并行 | 细粒度 | 在 GPU 上运行线程块 |
特性
| 特性 | MPI | OpenMP | CUDA |
|---|---|---|---|
| 并行模型 | 分布式 + 消息传递 | 共享内存 + 多线程 | GPU 并行 + SIMT |
| 是否开放标准 | ✅ 是(MPI Forum) | ✅ 是(OpenMP ARB) | ❌ 否(NVIDIA 私有) |
| 是否定义接口规范 | ✅ 是(API + 语义) | ✅ 是(指令 + API) | ✅ 是(NVIDIA 定义的 API 规范) |
| 是否有官方实现 | ❌(由第三方如 MPICH 提供) | ❌(由编译器支持) | ✅ 有(NVIDIA 提供完整工具链) |
| 是否跨平台 | ✅(理论) | ✅(只要编译器支持) | ❌(只能跑在 NVIDIA GPU 上) |
MPI实现
常见的openmpi mpich mpi-intel 就是MPI的实现
一般使用 which mpicc 和 mpicc --show 检查真实路径与底层调用的编译器
| 实现名称 | 开源/商业 | 特色与用途 |
|---|---|---|
| MPICH | 开源 | 标准参考实现之一,稳定,兼容性好,适合教学与通用集群环境 |
| Open MPI | 开源 | 可扩展性强,模块化设计,社区活跃,支持多种平台和网络 |
| Intel MPI | 商业(有免费版) | 对 Intel 编译器和硬件优化极好,常用于 HPC 与商业计算 |
| MVAPICH2 | 开源 | 基于 MPICH,专为 InfiniBand 和高性能互连优化 |
| Cray MPI | 商业 | Cray 超算平台专用,深度优化,通常预装 |
| IBM Spectrum MPI | 商业 | IBM 平台专用,基于 Open MPI,适配 Power 架构 |
| Microsoft MPI (MS-MPI) | 开源 | Windows 平台的主要 MPI 实现,适合开发和教育场景 |
编译器包装器
还有一些 如 mpicc mpif90 等,是MPI实现的编译器包装器
| 编译器包装器: 自动进行编译和链接过程、并进行一定的优化,以提高开发效率
| MPI 实现 | C 编译器包装器 | C++ 编译器包装器 | Fortran 包装器(77) | Fortran 包装器(90/95) |
|---|---|---|---|---|
| MPICH | mpicc | mpicxx | mpif77 | mpif90 |
| Open MPI | mpicc | mpic++ | mpif77 | mpif90 |
| Intel MPI | mpiicc | mpiicpc | mpiifort | mpiifort |
| MVAPICH2 | mpicc | mpicxx | mpif77 | mpif90 |
| Cray MPI | cc | CC | ftn | ftn |
| IBM Spectrum | mpixlc | mpixlcxx | mpixlf77 | mpixlf90 |
| MS-MPI | mpicc.exe | 无官方包装器 | 无 | 无 |
gcc main.c \
-I/usr/local/mpi/include \
-L/usr/local/mpi/lib \
-lmpi \
-o myprog
# 简化
mpicc main.c -o myprog🧩 用 Python 类比
| MPI 生态 | Python 类比 | 说明 |
|---|---|---|
MPI | NumPy API 或 Python 标准规范 | 标准定义了怎么通信,就像 NumPy 定义了数组操作接口 |
MPICH | NumPy 的 C 实现 / python解释器(PyPy、CPython) | 提供标准的实现,底层做了优化 |
MPICC | python setup.py build_ext 中调用的 C 编译器包装器 | mpicc 是 gcc 的包装器,自动链接 MPI 库,避免你手动加 -I 和 -L |