初识MPI - 关于各种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 |