---
title: 鲲鹏通信组件HMPI之参数使用篇-官方技术文章-鲲鹏社区
description: 华为高性能通信库（Hyper MPI，以下简称HMPI）实现了并行计算的网络通信功能，可以用来支持制造、气象、分子动力学等应用场景。HPCKit包含了完整的MPI通信库。HMPI是基于开源MPI进行优化的，使用起来非常便捷。
keywords: HMPI,鲲鹏通信组件,之参数使用篇,官方技术文章,鲲鹏社区,背景,基础用法,单节点运行
url: https://www.hikunpeng.com/developer/techArticles/20260528-4?envFlag=1
section: (其他)
---

# 鲲鹏通信组件HMPI之参数使用篇-官方技术文章-鲲鹏社区

URL: https://www.hikunpeng.com/developer/techArticles/20260528-4?envFlag=1
描述: 华为高性能通信库（Hyper MPI，以下简称HMPI）实现了并行计算的网络通信功能，可以用来支持制造、气象、分子动力学等应用场景。HPCKit包含了完整的MPI通信库。HMPI是基于开源MPI进行优化的，使用起来非常便捷。
关键词: HMPI,鲲鹏通信组件,之参数使用篇,官方技术文章,鲲鹏社区,背景,基础用法,单节点运行

官方技术文章 [了解详情](https://www.hikunpeng.com/zh/developer/techArticles)

鲲鹏通信组件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加载）为例，其环境变量加载脚本如下：

```hljs
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`选项传递环境变量。例如：

```hljs
mpirun -np 4 -x PATH -x LD_LIBRARY_PATH --hostfile hostfile2 ./exe
```

## 2.3. 主机文件（hostfile）与等级文件（rankfile）

跨节点运行时，需要指定主机列表。假设使用两个节点，IP 地址分别为`196.10.157.97`和`196.10.157.98`，则主机文件`hostfile2`的内容为：

```hljs
196.10.157.97
196.10.157.98
```

如果需要更精细的进程分布（例如：rank 0 使用节点 97 的前 38 个核，rank 1 使用节点 97 的第 39-76 个核，rank 2 和 rank 3 在节点 98 上类似划分），可以编写等级文件（rankfile），示例`rankfile2`如下：

```hljs
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
```

对应命令为：

```hljs
mpirun -x PATH -x LD_LIBRARY_PATH --rankfile rankfile2 ./exe
```

当进程数量很多时，手写 rankfile 将变得繁琐。如果只需在每个节点的每个 NUMA 节点上分配一个核（共有 16 个 NUMA 节点），可以使用更简洁的命令：

```hljs
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`为例）：

```hljs
--mca coll_tuned_use_dynamic_rules true --mca coll_tuned_allgather_algorithm 4
```

各算法的具体编号可参考源码文件`ompi/mca/coll/tuned/coll_tuned_decision_fixed.c`。例如`MPI_Allgather`的算法选择逻辑如下：

```hljs
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;
    } // ... 后续分支省略
}

```

也可通过命令查看某个集合通信接口支持的所有算法：

```hljs
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）：

```hljs
--mca coll_ucg_enable_coll allgatherv -x UCG_PLANC_UCX_ALLGATHERV_ATTR=I:2
```

特殊参数：调整 k‑ary tree 的度数（例如设置`MPI_Gatherv`的 k‑ary tree 的 k=4）：

```hljs
-x UCG_PLANC_UCX_GATHERV_KNTREE_DEGREE=4
```

改变 k 值可以调整通信树的形状，从而优化性能。更多 UCG 算法细节可参考其代码仓库 [了解详情](https://gitcode.com/kunpengcompute/xucg)，具体接口算法位于`src/planc/ucx/`目录下（如`allreduce.c`包含`MPI_Allreduce`的算法实现）。

# 4. 其他常用参数

## 4.1. 网络传输类型

MPI 跨节点通信依赖网卡，支持两种传输类型：

- RC（可靠连接）：性能更高，延迟更低。
- UD（不可靠数据报）：扩展性更好，适合大规模通信。

可通过以下参数选择：

```hljs
-x UCX_TLS=rc      # 或 ud
```

## 4.2. 多网卡选择

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

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

## 4.3. Rendezvous 阈值

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

```hljs
-x UCX_RNDV_THRESH=512K
```

- Eager 协议：适用于小消息，方直接将数据推送给接收方。
- Rendezvous 协议：适用于大消息，通过握手协商后再传输数据

本页内容
