开发者
鲲鹏通信组件HMPI之参数使用篇

鲲鹏通信组件HMPI之参数使用篇

HPC

发表于 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 ./exe

2.3. 主机文件(hostfile)与等级文件(rankfile)

跨节点运行时,需要指定主机列表。假设使用两个节点,IP 地址分别为 196.10.157.97196.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 ./exe

2.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_algorithm

3.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      # 或 ud

4.2. 多网卡选择

若机器配置了多张网卡,可手动指定使用其中一张:

-x UCX_NET_DEVICES=roce0:1      # 示例网卡名称

4.3. Rendezvous 阈值

UCX_RNDV_THRESH 参数控制从 Eager 协议切换到 Rendezvous 协议的消息大小阈值:

-x UCX_RNDV_THRESH=512K
  • Eager 协议​:适用于小消息,发送方直接将数据推送给接收方。
  • Rendezvous 协议​:适用于大消息,通过握手协商后再传输数据


本页内容