MPI调优
原理
MPI全称Message Passing Interface Specification(消息传递接口规范),这是并行计算体系结构设计的一个标准化和便携式的消息传递系统,该标准包含点对点通信、集群操作、进程组、通信上下文、进程拓扑、环境管理和调查、过程创建和管理等功能。
推荐使用Hyper MPI。Hyper MPI是基于Open MPI,结合Open UCX P2P点对点通讯框架,新增了UCX COLL集合通讯优化框架,并在该框架实现了优化算法加速库,构建MPI的集合通信操作性能竞争力。
使用方法
- 在mpirun命令后添加“--bind-to core”参数进行MPI进程绑核。
最新版本的OpenMPI默认会根据策略对将进程绑定到对应的CPU核心上,但某些特殊编译器的版本可能默认不会编译。如果发现MPI程序运行的时候程序没有绑定(grep Cpus_allowed_list /proc/<pid>/status),可以使用“--bind-to core”参数。
- 调整MPI通信参数UCX_TLS。
UCX_TLS可用于调整MPI使用的通信协议。可设置的参数包括shm,rc,ud,rc_x,ud_x,dc_x等。具体各个参数的含义可参考:https://github.com/openucx/ucx/wiki/UCX-environment-parameters
默认的参数在某些场景下可能不是最优的,可尝试如下
-x UCX_TLS=shm,rc_x,ud_x
-x UCX_TLS=shm,ud_x
-x UCX_TLS=shm,dc_x
-x UCX_TLS=mm,rc_x,ud_x
等组合。其中shm和mm二选一,rc,ud,rc_x,ud_x,dc_x 可以选一个或多个。
默认不设置时等同于-x UCX_TLS=all。小规模场景下可以不设置,也可以使用-x UCX_TLS=rc_x,shm。
- 调整HCOLL参数。
HCOLL的参数用于控制集合通信的参数,在非标准胖树组网时可考虑使用。使用“hcoll_info -a”可以查看各个参数的含义和可设置值。
- MPI rank重排序。
MPI进程(也称为MPI rank)之间会有很多通信,不同的进程之间的通信量不一样。通过IPM可以采集到MPI各个进程之间的通信量。将MPI进程间通信量大的进程通过rank id找出来,将这些进程尽量放在一个节点内,一个TOR交换机内,可以提升通信性能。
- 通过手工编写MPI rankfile可以实现上述目标,具体方法可以参考《OpenMPI 使用手册》。以下为简要解释:
Rankfile文件myrankfile内容如下:
rank 0=aa slot=2
rank 1=bb slot=3
rank 2=cc slot=1-2
运行程序时带rankfile :
mpirun -H aa,bb,cc,dd -rf myrankfile ./a.out
- Rank 0 在节点 aa上,绑定到CPU核心2。
- Rank 1 在节点 bb上,绑定到CPU核心3。
- Rank 2 在节点 cc上,绑定到CPU核心1和2。