---
title: AllGatherOperation
description: "| 产品 | 是否支持 |"
url: https://www.hiascend.com/document/detail/zh/canncommercial/latest/API/ascendtb/ascendtb_01_0050.html
sourcePath: /source/zh/canncommercial/900/API/ascendtb/ascendtb_01_0050.html
indexId: 0b650cdb35df6089898b3187a2a11c5c3b38cbb1248635936dddc8d9a787445264
---
# AllGatherOperation

#### 产品支持情况

| 产品 | 是否支持 |
| --- | --- |
| Atlas 350 加速卡 | x |
| Atlas A3 推理系列产品 / Atlas A3 训练系列产品 | √ |
| Atlas A2 训练系列产品 / Atlas A2 推理系列产品 | √ |
| Atlas 训练系列产品 | x |
| Atlas 推理系列产品 | √ |
| Atlas 200I/500 A2 推理产品 | x |


#### 功能说明

将多个通信卡上的数据按所属rank号的顺序在第一维进行聚合，然后发送到每张卡上。

该算子涉及多卡相关操作，可根据实际需求配置HCCL相关环境变量，具体请参见《CANN 环境变量参考》中的“集合通信(https://www.hiascend.com/document/detail/zh/canncommercial/900/maintenref/envvar/envref_07_0077.html)”章节。


#### 使用场景

多对多。收集所有的数据到所有的节点上。把多个节点的数据收集到一个主节点上（Gather），再把这个收集到的数据分发到其他节点上（broadcast）。

图1 通信原理示意图

应用场景：

- All-Gather可应用于模型并行。
- 模型并行里前向计算里的参数全同步，需要用All-Gather把模型并行里将切分到不同的NPU上的参数全同步到一张NPU上才能进行前向计算。

使用示例

- 参数设置
  rankSize=2

- 输入输出
  npu0 （通信主卡）：

  x=

```
[[16, 56],
[ 5, 96]]
```


  output=

```
[[[ 16,  56],
[  5,  96]],
[[ -7, -91],
[-75,  38]]]
```


  npu1：

  x=

```
[[ -7, -91],
[-75,  38]]
```


  output=

```
[[[ 16,  56],
[  5,  96]],
[[ -7, -91],
[-75,  38]]]
```


#### 定义

```
struct AllGatherParam {
    int rank = 0;
    int rankSize = 0;
    int rankRoot = 0;
    std::string backend = "hccl";
    HcclComm hcclComm = nullptr;
    CommMode commMode = COMM_MULTI_PROCESS;
    std::string rankTableFile;
    std::string commDomain;
    uint8_t rsv[64] = {0};
};
```


#### 参数列表

| 成员名称 | 类型 | 默认值 | 描述 |
| --- | --- | --- | --- |
| rank | int | 0 | 当前卡所属通信编号。 |
| rankSize | int | 0 | 通信卡的数量。 |
| rankRoot | int | 0 | 主通信编号。 |
| backend | string | hccl | 通信后端指示，仅支持“hccl”和“lccl”。LCCL功能将在后续版本删除，建议使用HCCL功能。 Atlas 推理系列产品 仅支持“backend”为“hccl”。 当“backend”为“lccl”且机器为 Atlas A2 训练系列产品 里的Atlas 200T A2 Box16 异构子框时支持单机16卡（16卡全量拓扑通信或单节点内任意卡通信）。 注意：此为实验性功能，建议不要使用该功能。 |
| hcclComm | HcclComm | nullptr | HCCL通信域指针。 默认为空，加速库为用户创建；若用户想要自己管理通信域，则需要传入该通信域指针，加速库使用传入的通信域指针来执行通信算子。 |
| commMode | CommMode | COMM\_MULTI\_PROCESS | 通信模式，CommMode类型枚举值。hccl多线程只支持外部传入通信域方式。 |
| rankTableFile | string | \- | 集群信息的配置文件路径，适用单机以及多机通信场景，当前仅支持hccl后端场景。 若单机配置了ranktable，则以ranktable来初始化通信域。 配置请参见《HCCL集合通信库》的“rank table配置资源信息(https://www.hiascend.com/document/detail/zh/canncommercial/900/API/hcclug/hcclug\_000065.html)”。 |
| commDomain | string | \- | 通信device组用通信域名标识，多通信域时使用。当backend为lccl时，commMode为多进程时，commDomain需要设置0\-65535，支持设置通信域的内存大小，用于性能优化，配置方式通信域：通信域大小（MB），如“0:400”，当同一个通信域中多个算子配置冲突时，以第一个执行到的该通信域算子配置为准。 限制：默认值为200，当前配置大小不支持小于200。 |
| rsv[64] | uint8\_t | {0} | 预留参数。 |


#### 输入

| 参数 | 维度 | 数据类型 | 格式 | 描述 |
| --- | --- | --- | --- | --- |
| x | [dim\_0, dim\_1, ..., dim\_n] | backend为hccl时：float16/float/int8/int16/int32/int64/bf16 backend为lccl时：float16/float/int8/int16/int32/int64/bf16 | ND | 输入tensor，维度小于8。 |


#### 输出

| 参数 | 维度 | 数据类型 | 格式 | 描述 |
| --- | --- | --- | --- | --- |
| output | [rankSize, dim\_0, dim\_1, ... ，dim\_n] | backend为hccl时：float16/float/int8/int16/int32/int64/bf16 backend为lccl时： float16/float/int8/int16/int32/int64/bf16 | ND | 输出tensor，维度小于或等于8。 输出output的维数比输入x的维数多一维。 |


#### 约束说明

- rank、rankSize、rankRoot需满足以下条件。

  - 0 ≤ rank < rankSize
  - 0 ≤ rankRoot < rankSize

- 多用户使用时需要使用ATB_SHARE_MEMORY_NAME_SUFFIX环境变量（请参见  Transformer加速库环境变量说明
）进行共享内存的区分，以进行初始化信息同步。
- 当使用加速库的通信算子异常退出时，需要清空残留数据，避免影响之后的使用，命令参考如下：

```
rm -rf /dev/shm/sem.lccl*
rm -rf /dev/shm/sem.hccl*
ipcrm -a
```


- 当前不支持单device上跑多个HCCP进程实例，不能单卡同时跑多个通信算子。比如运行通信算子场景下，不支持同一张卡上跑多个模型。
