鲲鹏通信组件HMPI之参数使用篇
发表于 2026/05/28
0
1. 背景
华为高性能通信库(Hyper MPI,以下简称HMPI)实现了并行计算的网络通信功能,可以用来支持制造、气象、分子动力学等应用场景。HPCKit包含了完整的MPI通信库。HMPI是基于开源MPI进行优化的,使用起来非常便捷。通常情况下,只需执行 mpirun -np 4 ./exe 即可启动程序。但在深度性能调优或大规模并行运行时,常常需要配置大量参数。本文介绍 MPI 使用过程中的常见参数及其用法。
2. 基础用法
2.1. 单节点运行
mpirun -np 4 ./exe 表示使用 4 个进程运行当前程序。只要进程数不超过机器的物理核心数,一般不会出现问题。
2.2. 跨节点运行
要实现跨节点运行,首先需要让每台机器都能找到 MPI 的安装路径。本文以 HMPI(通过HPCkit加载)为例,其环境变量加载脚本如下:
hwmpi=$(cd $(dirname $BASH_SOURCE)/.. && command pwd -P)
export OPAL_PREFIX=${hwmpi}/${mode}/hmpi
export PATH=${hwmpi}/${mode}/hmpi/bin:${hwmpi}/${mode}/hucx/bin:${hwmpi}/${mode}/xucg/bin:$PATH
export INCLUDE=${hwmpi}/${mode}/hmpi/include:${hwmpi}/${mode}/hucx/include:${hwmpi}/${mode}/xucg/include:$INCLUDE
export LD_LIBRARY_PATH=${hwmpi}/${mode}/hmpi/lib:${hwmpi}/${mode}/hucx/lib:${hwmpi}/${mode}/xucg/lib:$LD_LIBRARY_PATH有两种方式使环境变量生效:
- 永久生效:将上述加载命令写入
~/.bashrc文件。 - 临时传递:在
mpirun命令中通过-x选项传递环境变量。例如:
mpirun -np 4 -x PATH -x LD_LIBRARY_PATH --hostfile hostfile2 ./exe2.3. 主机文件(hostfile)与等级文件(rankfile)
跨节点运行时,需要指定主机列表。假设使用两个节点,IP 地址分别为 196.10.157.97 和 196.10.157.98,则主机文件 hostfile2 的内容为:
196.10.157.97
196.10.157.98如果需要更精细的进程分布(例如:rank 0 使用节点 97 的前 38 个核,rank 1 使用节点 97 的第 39-76 个核,rank 2 和 rank 3 在节点 98 上类似划分),可以编写等级文件(rankfile),示例 rankfile2 如下:
rank 0=196.10.157.97 slot=0-37
rank 1=196.10.157.97 slot=38-75
rank 2=196.10.157.98 slot=0-37
rank 3=196.10.157.98 slot=38-75对应命令为:
mpirun -x PATH -x LD_LIBRARY_PATH --rankfile rankfile2 ./exe当进程数量很多时,手写 rankfile 将变得繁琐。如果只需在每个节点的每个 NUMA 节点上分配一个核(共有 16 个 NUMA 节点),可以使用更简洁的命令:
mpirun -np 32 -N 16 --map-by numa -x PATH -x LD_LIBRARY_PATH --hostfile hostfile2 ./exe2.4. 查看进程绑定
- 在
mpirun命令中添加--report-bindings可以查看进程与 CPU 核心的绑定关系。 - 使用
htop等系统工具实时观察cpu物理核心资源占用情况。
3. 集合通信算法
HMPI 的大量优化集中在集合通信上。下面介绍 Open MPI 中算法的手动指定方法以及 UCG 模块的使用。
3.1. Open MPI 内置算法
Open MPI 默认采用自适应算法选择策略,根据通信进程数和消息大小动态调整。若要手动指定某个算法,可使用如下参数(以 MPI_Allgather 为例):
--mca coll_tuned_use_dynamic_rules true --mca coll_tuned_allgather_algorithm 4各算法的具体编号可参考源码文件 ompi/mca/coll/tuned/coll_tuned_decision_fixed.c。例如 MPI_Allgather 的算法选择逻辑如下:
int ompi_coll_tuned_allgather_intra_dec_fixed(const void *sbuf, int scount,
struct ompi_datatype_t *sdtype,
void* rbuf, int rcount,
struct ompi_datatype_t *rdtype,
struct ompi_communicator_t *comm,
mca_coll_base_module_t *module)
{
int communicator_size, alg;
size_t dsize, total_dsize;
if (MPI_IN_PLACE != sbuf) {
ompi_datatype_type_size(sdtype, &dsize);
} else {
ompi_datatype_type_size(rdtype, &dsize);
}
total_dsize = dsize * (ptrdiff_t)scount;
communicator_size = ompi_comm_size(comm);
/** Algorithms:
* {1, "linear"},
* {2, "bruck"},
* {3, "recursive_doubling"},
* {4, "ring"},
* {5, "neighbor"},
* {6, "two_proc"}
*/
if (communicator_size == 2) {
alg = 6;
} else if (communicator_size < 32) {
alg = 3;
} // ... 后续分支省略
}
也可通过命令查看某个集合通信接口支持的所有算法:
ompi_info --param coll tuned -l 9 | grep -A 2 -w coll_tuned_allgather_algorithm3.2. UCG 模块的使用
HMPI 的 UCG 模块支持多种 MPI 集合通信接口。使用示例(使能 MPI_Allgatherv 的 UCG 算法 2):
--mca coll_ucg_enable_coll allgatherv -x UCG_PLANC_UCX_ALLGATHERV_ATTR=I:2特殊参数:调整 k‑ary tree 的度数(例如设置 MPI_Gatherv 的 k‑ary tree 的 k=4):
-x UCG_PLANC_UCX_GATHERV_KNTREE_DEGREE=4改变 k 值可以调整通信树的形状,从而优化性能。更多 UCG 算法细节可参考其代码仓库,具体接口算法位于 src/planc/ucx/ 目录下(如 allreduce.c 包含 MPI_Allreduce 的算法实现)。
4. 其他常用参数
4.1. 网络传输类型
MPI 跨节点通信依赖网卡,支持两种传输类型:
- RC(可靠连接):性能更高,延迟更低。
- UD(不可靠数据报):扩展性更好,适合大规模通信。
可通过以下参数选择:
-x UCX_TLS=rc # 或 ud4.2. 多网卡选择
若机器配置了多张网卡,可手动指定使用其中一张:
-x UCX_NET_DEVICES=roce0:1 # 示例网卡名称4.3. Rendezvous 阈值
UCX_RNDV_THRESH 参数控制从 Eager 协议切换到 Rendezvous 协议的消息大小阈值:
-x UCX_RNDV_THRESH=512K- Eager 协议:适用于小消息,发送方直接将数据推送给接收方。
- Rendezvous 协议:适用于大消息,通过握手协商后再传输数据


