MPI¶
OpenMPI 和 MPICH 是最主要的 MPI 实现,后者衍生版本众多。下表对比了常见的 MPI 实现。
对比项 | OpenMPI | MVAPICH | Intel MPI | MPICH | |
---|---|---|---|---|---|
历史 | History of Open MPI 2003 由 OSU、LANL、UTK 的 MPI 实现合并而来 |
mug15-overview_of_the_mvapich_project-dk_panda.pdf 2002 OSU 开发,衍生自 MPICH |
(来自 Wikipedia)衍生自 MPICH | MPICH Overview 2001 由 ANL 和 MSU 开发 |
|
文档 | Open MPI main documentation | MVAPICH :: UserGuide | Intel® MPI Library Documentation | Guides | MPICH | |
mpirun 指向 | prun (v5.x)orterun (v4.x) |
mpiexec.hydra mpiexec.mpirun_rsh (推荐) |
mpiexec.hydra |
hydra(默认) gforker(编译选项) |
|
Host 选项 | -H/--host node1:1,node1:1 |
-np 2 node1 node2 |
-hosts node1:1,node2:1 |
-f hf |
|
Hostfile 格式 | node1 slots=n |
node1:n:hca1 |
node1:n |
node1:n |
|
例程/测试 | examples/ | OSU Benchmark | Intel MPI Benchmark | exmaples/make testing |
|
信息 | ompi_info --all |
mpiexec -info |
OpenMPI¶
Quote
基础概念¶
我们从 2020 年的 The ABCs of Open MPI 系列讲座开始。
OpenMPI 是一个大型项目,采用模块化组织,称为 MCA(Modular Component Architecture),从上至下分为 Project、Framework、Component:
默认情况下,所有 component 被编译为动态链接库(Dynamic Shared Objects, DSO),可以按需加载:
到 OpenMPI v5.0,共有如下 FrameWork
-
MPI:
-
coll
:MPI Collecitves,实现MPI_BCAST
、MPI_BARRIER
、MPI_REDUCE
等集合通信。在 v4.1.0 后,增加了可选的组件,并且可以对默认的通信算法选择进行调优。
-
op
:MPI Reduction Operations osc
:MPI One-sided Communications-
pml
:MPI Point-to-Point Communications,实现MPI_SEND
、MPI_RECV
等点对点通信。可选: -
topo
:MPI Topologies
-
-
底层传输:
-
btl
:Byte Transport Layer可选组件:
ofi
:Libfabricself
:loopbacksm
:共享内存tcp
其余不常见的略过。
-
bml
:BTL Multipliexing Layer mtl
:Matching Transport Layer,不常用,略
-
-
文件:
-
io
:MPI IO,实现MPI_FILE_OPEN
、MPI_FILE_READ
、MPI_FILE_WRITE
等文件操作。可选:ompio
:默认romio
:来自 MPICH
-
fbtl
:MPI File Byte Transfer Layer fcoll
:MPI File Collectivesfs
:MPI File Managementsharedfp
:MPI shared file pointer operations
-
-
其他:
hook
:Generic Hooksvprotocol
:Virtual Protocol API Interposition
通信库¶
通信库主要通过 PML 选择。一般会采用如下组合:
--mca pml ucx
--mca pml_ucx_verbose 100
--mca osc_ucx_verbose 100
-x UCX_NET_DEVICES=
-x UCX_LOG_LEVEL=trace
PMIx¶
ORTE 与 PRRTE¶
ORTE 就是
orterun
、mpirun
、mpiexec
是同一个文件,见 Ubuntu Manpage: orterun, mpirun, mpiexec - Execute serial and parallel jobs in Open MPI.
如果要阅读 ORTE 源码,可以在 v4.x 下找到 orte
文件夹,其中 orte/tools/orterun/main.c
就是 orterun 的入口。
在 OpenMPI v5.0 中,PRRTE 取代了 ORTE。现在,prun
的入口在 prrte/src/tools/prun/main.c
。
构建和运行¶
构建:
OpenMPI 内置了某些依赖(如 hwloc 和 libevent),但是也可以用 --with-hwloc
等选项替换为外部版本。
要构建支持 CUDA 的 OpenMPI,需要:
- 构建支持 GDR 的 UCX
- 然后构建支持 CUDA 和 UCX 的 OpenMPI
查看当前构建的信息:
运行:
Example
在 OpenMPI v4.x 中:
$ ompi_info --all | grep btl_openib_if_include
MCA btl openib: parameter "btl_openib_if_include" (current value: "", data source: default, level: 9 dev/all, type: string)
Comma-delimited list of devices/ports to be used (e.g. "mthca0,mthca1:2"; empty value means to use all ports found). Mutually exclusive with btl_openib_if_exclude.
可以通过下面的方式:
调试选项:
源码阅读¶
构建系统¶
从 Makefile 开始,构建时我们使用 all
这个目标,它进入到所有子文件夹并执行构建,见 Where is the target all-recursive in makefile? - Stack Overflow。
运行时¶
MCA¶
BTL¶
openib¶
MPICH¶
MPICH 是 MVAPICH、Intel MPI 等众多 MPI 实现的基础。MPICH 维护四个组件:
- mpich
- hydra:启动器,衍生版本大多也支持 hydra 启动
- libpmi
- mpich-testsuite
简单梳理:
- Process Manager(PM):默认 hydra。编译时可选 gforker,仅在单节点上通过 fork 和 exec 创建进程。
- Communication Device:MPICH 中的通信分为 device 和 module 层。
ch3
意思是 3rd version of Channel interface。通过编译时--with-device=ch3:channel:module
可选组件。nemesis
是默认 channel,单节点用 shared-memory,跨节点用 socket。- 默认:
ch4
,支持的 module 有 ofi、UCX、POSIX 共享内存。
MVAPICH¶
这可能是目前最先进的 MPI 实现,受 NVIDIA 喜爱,并且也是神威 - 太湖之光所使用的 MPI 实现。
MVAPICH 提供非常多种细分的版本,可根据需求选择。一般选用 MVAPICH2(源码分发)或 MVAPICH2-X(打包分发),提供最全面的 MPI 和 IB/RoCE 支持。
用户手册见 MVAPICH 首页 Support->UserGuide。