---
title: AllToAllOperation
description: "| 硬件型号 | 是否支持 |"
url: https://www.hiascend.com/document/detail/zh/canncommercial/latest/API/ascendtb/ascendtb_01_0135.html
sourcePath: /source/zh/canncommercial/900/API/ascendtb/ascendtb_01_0135.html
indexId: c6bd7b79f2ed4d9f837c6b8768c49960272b75f90fcc7cb349dc9371b50e876564
---
# AllToAllOperation

#### 产品支持情况

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


#### 功能说明

向通信域内所有通信卡发送相同数据量（输入切分成rankSize份）的数据，并从所有通信卡接收相同数据量的数据。如下图所示，对于rankSize=4的情况，各个通信卡将自身的数据均匀分成rankSize份，发送给其他的通信卡。

图1 AllToAll算子功能示意图

计算过程示意（Python）：

```
goldenTensors = []
for i in range(rankSize):
    golden_out = []
    for j in range(rankSize):
        golden_out_list = intensors[j].reshape(-1).tolist() # intensors[j]代表第j张卡上的intensor，计算时视为一维向量
        split = golden_out_list[i*len(golden_out_list) // rankSize:(i+1)*len(golden_out_list) // rankSize]
        golden_out += split
    golden_out_tensor = torch.tensor(golden_out).reshape(shape) # golden_out_tensor是第i张卡上的输出tensor，输出时shape和输入tensor一致
    goldenTensors.append(golden_out_tensor)
return [goldenTensors[rank].cpu()]
```


#### 算子上下文

图2 通信INT8量化中AllToAll的位置

模型传输一个int8的量化输入tensor数据X，首先使用AllToAll进行通信发送到各个节点上（这里使用int8进行通信，提升了通信速度）。

然后使用reduce的sum操作对X进行求和，将int8数据反量化为float16，最后使用AllGather进行通信将计算结果传输到各个节点上。


#### 使用场景

用于将数据发送到各个节点上，多对多。AllToAll是对Allgather的扩展，相比于AllGather，AllToAll不同的节点从某一节点收集到的数据是不同的。

图3 AllToAll和AllGather使用对比

应用于模型并行，模型并行里的矩阵转置，数据并行到模型并行的矩阵转置。


#### 定义

```
struct AllToAllParam {
    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;
    bool transpose = false;
    uint8_t rsv[62] = {0};
};
```


#### 参数列表

| 成员名称 | 类型 | 默认值 | 描述 |
| --- | --- | --- | --- |
| rank | int | 0 | 当前卡所属通信编号。 |
| rankSize | int | 0 | 通信的卡的数量。 |
| rankRoot | int | 0 | 主通信编号 |
| backend | std::string | "hccl" | 通信计算类型，支持hccl和lccl。LCCL功能将在后续版本删除，建议使用HCCL功能。 当backend为lccl时，Atlas 200T A2 Box16 异构子框场景下，通信域仅支持前8卡或后8卡内部建立，不支持同时包含前8卡和后8卡的通信域。 |
| hcclComm | HcclComm | nullptr | HCCL通信域指针。 默认为空，加速库为用户创建；若用户想要自己管理通信域，则需要传入该通信域指针，加速库使用传入的通信域指针来执行通信算子。 |
| commMode | CommMode | COMM\_MULTI\_PROCESS | 通信模式，CommMode类型枚举值。hccl多线程只支持外部传入通信域方式。 |
| rankTableFile | std::string | \- | 集群信息的配置文件路径，适用单机以及多机通信场景，当前仅支持hccl后端场景。 若单机配置了rankTable，则以rankTable来初始化通信域。 配置请参见《HCCL集合通信库》的“rank table配置资源信息(https://www.hiascend.com/document/detail/zh/canncommercial/900/API/hcclug/hcclug\_000065.html)”。 |
| commDomain | std::string | \- | 通信Device组用通信域名标识，多通信域时使用。当backend为lccl时，commMode为多进程时，commDomain需要设置为0\-65535的数字。commMode为多线程时，不支持确定性计算，"LCCL\_DETERMINISTIC"需要为0或者false。 LCCL在多进程/多线程多通信域并发场景下，"LCCL\_PARALLEL"需要设置为1或者true。多通信域并行功能使用结束后，"LCCL\_PARALLEL"需要设置为0或者false，否则会导致基础场景性能下降。 支持设置通信域的内存大小，用于性能优化，配置方式通信域：通信域大小（MB）。如“0:400”，当同一个通信域中多个算子配置冲突时，以第一个执行到的该通信域算子配置为准。 限制：默认值为200，当前配置大小不支持小于200。 |
| transpose | bool | false | 通信结果对输入进行转置，当前仅支持lccl。 |
| rsv[62] | uint8\_t | {0} | 预留参数。 |


#### 基础场景输入输出

transpose置为false

| 参数 | 维度 | 数据类型 | 格式 | 描述 |
| --- | --- | --- | --- | --- |
| x | [dim\_0, dim\_1, ..., dim\_n] | float16/float/int8/int16/int32/int64/bf16 | ND | 输入tensor。 |
| output | [dim\_0, dim\_1, ..., dim\_n] | float16/float/int8/int16/int32/int64/bf16 数据类型和输入相同 | ND | 输出tensor，与输入维度相同。 |


#### 转置场景输入输出

transpose置为true

| 参数 | 维度 | 数据类型 | 格式 | 描述 |
| --- | --- | --- | --- | --- |
| x | [b, w] | float16/bf16/int8 | ND | 输入tensor。 |
| output | [b\*rankSize, w/rankSize] | float16/bf16/int8 | ND | 输出tensor。 |


#### 约束说明

- backend为lccl时不支持多机通信和多通信域，且只支持偶数的rankSize。
- 各个通信卡的输入tensor维度相等。
- 参数维度相乘要能整除rankSize。
- 进行AllToAll计算时会将输入tensor视为一维向量计算，输出的shape则会和输入tensor一致。
- 转置场景下有如下约束：

  - w需要被rankSize整除。
  - w/rankSize的值不能超过90KB。
  - 整个x tensor的大小不能超过190MB。
  - rankSize只能为2、4、8。
- 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
```
