---
title: ReduceScatterOperation
description: "| 硬件型号 | 是否支持 | 特殊说明 |"
url: https://www.hiascend.com/document/detail/zh/canncommercial/latest/API/ascendtb/ascendtb_01_0217.html
sourcePath: /source/zh/canncommercial/900/API/ascendtb/ascendtb_01_0217.html
indexId: 22625f5c2e04bd0b8260152184759b18806ce3927f9ed987d568f6f23b01641a64
---
# ReduceScatterOperation

#### 产品支持情况

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


#### 功能说明

多对多。在集群内的所有节点上都按维度执行相同的Reduce规约运算，再将结果发散到集群内所有的节点上。该算子不支持确定性计算。

图1 通信原理图

注：硬件类型仅支持 Atlas A2 训练系列产品 / Atlas A2 推理系列产品 和 Atlas A3 推理系列产品 / Atlas A3 训练系列产品 ，不支持确定性计算和多机通信。


#### 使用场景

- 可应用于数据并行和模型并行。
- 数据并行allReduce里的 ReduceScatter+ Allgather组合里的ReduceScatter操作。
- 模型并行里在前向allgather后的反向计算里的ReduceScatter。

使用示例

以rankSize=2为例

reduceType=sum

输入tensor的shape为（2 * 3 * 4）

输入tensor:

```
input_tensor_0 = [[[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]],
[[13, 14, 15, 16], [17, 18, 19, 20], [21, 22, 23, 24]]]
input_tensor_1 = [[[25, 26, 27, 28], [29, 30, 31, 32], [33, 34, 35, 36]],
[[37, 38, 39, 40], [41, 42, 43, 44], [45, 46, 47, 48]]]
```

输出tensor的shape为（1 * 3 * 4）

输出tensor:

```
output_tensor_0 = [[[26, 28, 30, 32],[34, 36, 38, 40],[42, 44, 46, 48]]]
output_tensor_1 = [[[50, 52, 54, 56],[58, 60, 62, 64],[66, 68, 70, 72]]]
```


#### 定义

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


#### 参数列表

| 成员名称 | 类型 | 默认值 | 取值范围 | 是否必选 | 描述 |
| --- | --- | --- | --- | --- | --- |
| rank | int | 0 | [0, rankSize\-1] | 是 | 当前卡所属通信编号。 |
| rankSize | int | 0 | \- | 是 | 通信的卡的数量。 |
| rankRoot | int | 0 | [0, rankSize\-1] | 是 | 主通信编号。 |
| reduceType | string | "sum" | sum prod max min | 是 | 通信计算类型。 支持sum（相加）、prod（相乘）、max（取最大）和min（取最小）。 |
| backend | string | “lccl” | lccl/hccl | 是 | 通信计算类型，仅支持“hccl”和“lccl”。LCCL功能将在后续版本删除，建议使用HCCL功能。 “backend”为“hccl”时 支持sum、prod、max和min。 Atlas A2 训练系列产品 / Atlas A2 推理系列产品 上“reduceType”为prod时，不支持数据类型int16和bf16。 Atlas 训练系列产品 不支持int16、bf16。 “backend”为“lccl”时 支持sum、max和min。 Atlas 200T A2 Box16 异构子框场景下，通信域仅支持前8卡或后8卡内部建立，不支持同时包含前8卡和后8卡的通信域。 |
| hcclComm | HcclComm | nullptr | \- | 否 | HCCL通信域指针。 默认为空，加速库为用户创建；若用户想要自己管理通信域，则需要传入该通信域指针，加速库使用传入的通信域指针来执行通信算子。 |
| commMode | CommMode | COMM\_MULTI\_PROCESS | COMM\_MULTI\_PROCESS/COMM\_MULTI\_THREAD | 否 | 通信模式，CommMode类型枚举值。 |
| rankTableFile | string | 无 | \- | 否 | 集群信息的配置文件路径。 |
| commDomain | string | 无 | \- | 否 | 通信device组用通信域名标识，多通信域时使用。当backend为lccl时，commMode为多进程时，commDomain需要设置0\-65535，支持设置通信域的内存大小，用于性能优化，配置方式通信域：通信域大小（MB），如“0:400”，当同一个通信域中多个算子配置冲突时，以第一个执行到的该通信域算子配置为准。 限制：默认值为200，当前配置大小不支持小于200。 |
| rsv[64] | uint8\_t | {0} | [0] | 否 | 预留参数。 |


#### 输入

| 参数 | 维度 | 数据类型 | 格式 | 描述 |
| --- | --- | --- | --- | --- |
| x | [rankSize\*n, dim\_0, dim\_1, ..., dim\_n] | "lccl": float16/float/int8/int16/int32/bf16 "hccl": float16/float/int8/int16/int32/bf16 | ND | 输入tensor，维度小于等于8，第一维的大小为rankSize的n倍（n为正整数）。 |


#### 输出

| 参数 | 维度 | 数据类型 | 格式 | 描述 |
| --- | --- | --- | --- | --- |
| output | [n, dim\_0, dim\_1, ..., dim\_n] | "lccl"： float16/float/int8/int16/int32/bf16 "hccl"： float16/float/int8/int16/int32/bf16 | ND | 输出tensor，维度小于等于8，第一维的大小n=x[0]/rankSize，从第二维开始输出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进程实例，不能单卡同时跑多个通信算子。比如运行通信算子场景下，不支持同一张卡上跑多个模型。
