---
title: 指定算法说明
description: "以下算法序号对应的算法内容请参见算法地图。"
url: https://www.hikunpeng.com/document/detail/zh/hpchistory/hpckit/develop2400/userg_huaweimpi_0017.html
sourcePath: /source/zh/hpchistory/hpckit/develop2400/userg_huaweimpi_0017.html
indexId: 01a8d2ed31bff03f20a903407bb127e44ee26172c46a71c9655664c6749b576766
---
# 指定算法说明

以下算法序号对应的算法内容请参见算法地图。


#### 关于Allreduce指定算法的说明

- 在选用算法13、14时，为保证进程数在Socket上平均分布，需要加上以下选项，命令如下：
  --map-by-socket --rank-by-core

- 在选用算法5、6时，节点内采用了K-nomial算法，可通过调节K-nomial tree结构的K值参数值，寻找最优参数值，从而获得最佳性能。示例命令如下：
  -x UCG_PLANC_UCX_ALLREDUCE_FANOUT_INTRA_DEGREE=3

  -x UCG_PLANC_UCX_ALLREDUCE_FANIN_INTRA_DEGREE=8

- 在选用算法7、8时，节点内与节点间都采用了K-nomial算法，可通过调节K-nomial tree结构的K值参数值，寻找最优参数值，从而获得最佳性能。示例命令如下：
  -x UCG_PLANC_UCX_ALLREDUCE_FANOUT_INTER_DEGREE=7 -x UCG_PLANC_UCX_ALLREDUCE_FANIN_INTER_DEGREE=7

  -x UCG_PLANC_UCX_ALLREDUCE_FANOUT_INTRA_DEGREE=3 -x UCG_PLANC_UCX_ALLREDUCE_FANIN_INTRA_DEGREE=8


为提高性能，也可加入以下选项，调整传输模式：

-x UCX_TLS=sm,rc_x

综上，在调用MPI_Allreduce和MPI_Iallreduce时运行命令示例如下（鲲鹏芯片）：

mpirun -np 16 -N 2 --hostfile hf8 --mca btl ^vader,tcp,openib -x UCX_TLS=sm,rc_x -x UCG_PLANC_UCX_ALLREDUCE_ATTR=I:nS:200R:0- test_case


#### 关于Bcast指定算法的说明

- 在选用算法3时，节点间采用了K-nomial算法，可通过调节K值参数值，寻找最优参数值，从而获得最佳性能。命令示例如下：
  -x UCG_PLANC_UCX_BCAST_NA_KNTREE_INTER_DEGREE=7

- 在选用算法4时，节点内与节点间都采用了K-nomial算法，可通过调节K值参数值，寻找最优参数值，从而获得最佳性能。命令示例如下：
  -x UCG_PLANC_UCX_BCAST_NA_KNTREE_INTER_DEGREE =7

  -x UCG_PLANC_UCX_BCAST_NA_KNTREE_INTRA_DEGREE=3


- 在选用算法9时，可通过以下参数值调整ESBT算法中划分的块数，寻找最优参数值，从而获得最佳性能。默认值为0，表示auto。命令示例如下：
  -x UCG_PLANC_UCX_BCAST_ESBT_BLOCKS=3


为提高性能，也可加入以下选项，调整传输模式：

-x UCX_TLS=sm,rc_x

综上，在调用MPI_Bcast和MPI_Ibcast时运行命令示例如下（鲲鹏芯片）：

mpirun -np 16 -N 2 --hostfile hf8 --mca btl ^vader,tcp,openib -x UCX_TLS=sm,rc_x -x UCG_PLANC_UCX_BCAST_ATTR=I:nS:200R:0- test_case


#### 关于Barrier指定算法的说明

从算法地图可知，Barrier的算法是Allreduce算法的子集，因此可参考Allreduce指定算法说明，此处不再赘述。


#### 关于Alltoallv指定算法的说明

在选用算法1时，可通过调整以下参数值，寻找最优参数值，从而获得最佳性能。命令示例如下：

-x UCG_PLANC_UCX_ALLTOALLV_MIN_SEND_BATCH=7

-x UCG_PLANC_UCX_ALLTOALLV_MAX_SEND_BATCH=8

为提高性能，也可加入以下选项，调整传输模式：

-x UCX_TLS=sm,rc_x

综上，在调用MPI_Alltoallv和MPI_Ialltoallv时运行命令示例如下（鲲鹏芯片）：

mpirun -np 16 -N 2 --hostfile hf8 --mca btl ^vader,tcp,openib -x UCX_TLS=sm,rc_x -x UCG_PLANC_UCX_ALLTOALLV_ATTR=I:nS:200R:0- test_case


#### 关于Scatterv指定算法的说明

- 在选用算法1时，可通过调整以下参数值，寻找最优参数值，从而获得最佳性能。命令示例如下：
  -x UCG_PLANC_UCX_SCATTERV_MIN_SEND_BATCH=7

  -x UCG_PLANC_UCX_SCATTERV_MAX_SEND_BATCH=8

- 在选用算法2时，采用了K-nomial算法，可通过调整K值参数值，寻找最优参数值，从而获得最佳性能。命令示例如下：
  -x UCG_PLANC_UCX_ SCATTERV_KNTREE_DEGREE=3

- 在选用算法3时，采用了Node-aware K-nomial tree算法，由于节点间和节点内通信都采用了K-nomial算法，可通过调整节点间和节点内通信的K值参数值，寻找最优参数值，从而获得最佳性能。命令示例如下：
  -x UCG_PLANC_UCX_ SCATTERV_NA_KNTREE_INTER_DEGREE=4

  -x UCG_PLANC_UCX_ SCATTERV_NA_KNTREE_INTRA_DEGREE=3

  Scatterv操作的算法3在数据量较小的场景下性能较优，数据量大的场景下性能较差。 由于Scatterv操作无法根据数据量的大小自动选择最优算法，建议在数据量较小的场景下使用算法3。


为提高性能，也可加入以下选项，调整传输模式：

-x UCX_TLS=sm,rc_x

综上，在调用MPI_Scatterv和MPI_Iscatterv时运行命令示例如下（鲲鹏芯片）：

mpirun -np 16 -N 2 --hostfile hf8 --mca btl ^vader,tcp,openib -x UCX_TLS=sm,rc_x -x UCG_PLANC_UCX_SCATTERV_ATTR=I:nS:200R:0- test_case


#### 关于Allgatherv指定算法的说明

为提高性能，可加入以下选项，调整传输模式：

-x UCX_TLS=sm,rc_x

综上，在调用MPI_Allgatherv和MPI_Iallgatherv时运行命令示例如下（鲲鹏芯片）：

mpirun -np 16 -N 2 --hostfile hf8 --mca btl ^vader,tcp,openib -x UCX_TLS=sm,rc_x -x UCG_PLANC_UCX_ALLGATHERV_ATTR=I:nS:200R:0- test_case


#### 关于Gatherv指定算法的说明

为提高性能，可加入以下选项，调整传输模式：

-x UCX_TLS=sm,rc_x

综上，在调用MPI_Gatherv和MPI_Igatherv时运行命令示例如下（鲲鹏芯片）：

mpirun -np 16 -N 2 --hostfile hf8 --mca btl ^vader,tcp,openib -x UCX_TLS=sm,rc_x -x UCG_PLANC_UCX_GATHERV_ATTR=I:nS:200R:0- test_case
