---
title: MPI调优
description: "MPI全称Message Passing Interface Specification（消息传递接口规范），这是并行计算体系结构设计的一个标准化和便携式的消息传递系统，该标准包含点对点通信、集群操作、进程组、通信上下文、进程拓扑、环境管理和调查、过程创建和管理等功能。"
url: https://www.hikunpeng.com/document/detail/zh/kunpenghpcs/hpcindapp/tngg/kunpenghpcsolution_05_0026.html
sourcePath: /source/zh/kunpenghpcs/hpcindapp/tngg/kunpenghpcsolution_05_0026.html
indexId: 5dc7bab9921c8e35a888e60f3744895e348a7d52b5ef85b026a335b2ec82957b69
---
# MPI调优

#### 原理

MPI全称Message Passing Interface Specification（消息传递接口规范），这是并行计算体系结构设计的一个标准化和便携式的消息传递系统，该标准包含点对点通信、集群操作、进程组、通信上下文、进程拓扑、环境管理和调查、过程创建和管理等功能。

推荐使用Hyper MPI。Hyper MPI是基于Open MPI，结合Open UCX P2P点对点通讯框架，新增了UCX COLL集合通讯优化框架，并在该框架实现了优化算法加速库，构建MPI的集合通信操作性能竞争力。


#### 使用方法

1. 在mpirun命令后添加“--bind-to core”参数进行MPI进程绑核。
  最新版本的OpenMPI默认会根据策略对将进程绑定到对应的CPU核心上，但某些特殊编译器的版本可能默认不会编译。如果发现MPI程序运行的时候程序没有绑定（grep Cpus_allowed_list /proc/<pid>/status），可以使用“--bind-to core”参数。

2. 调整MPI通信参数UCX_TLS。
  UCX_TLS可用于调整MPI使用的通信协议。可设置的参数包括shm，rc，ud，rc_x，ud_x，dc_x等。具体各个参数的含义可参考：https://github.com/openucx/ucx/wiki/UCX-environment-parameters(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。

3. 调整HCOLL参数。
  HCOLL的参数用于控制集合通信的参数，在非标准胖树组网时可考虑使用。使用“hcoll_info -a”可以查看各个参数的含义和可设置值。

4. MPI rank重排序。
  MPI进程（也称为MPI rank）之间会有很多通信，不同的进程之间的通信量不一样。通过IPM可以采集到MPI各个进程之间的通信量。将MPI进程间通信量大的进程通过rank id找出来，将这些进程尽量放在一个节点内，一个TOR交换机内，可以提升通信性能。

5. 通过手工编写MPI rankfile可以实现上述目标，具体方法可以参考《OpenMPI 使用手册(https://www.open-mpi.org/doc/current/)》。以下为简要解释：
  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。
