---
title: 集合通信
description: "集合通信是指多个NPU共同参与进行数据传输，从而形成一次集体操作的通信模式，常用于大规模集群中不同NPU之间的梯度同步和参数更新等场景。"
url: https://www.hiascend.com/document/detail/zh/canncommercial/latest/API/hcclug/hcclug_000009.html
sourcePath: /source/zh/canncommercial/900/API/hcclug/hcclug_000009.html
indexId: 6a5400a00361a94ada9c647373a1b83985299da2dbaf738d0fff6354460bd36b59
---
# 集合通信

集合通信是指多个NPU共同参与进行数据传输，从而形成一次集体操作的通信模式，常用于大规模集群中不同NPU之间的梯度同步和参数更新等场景。

HCCL支持AllReduce、Broadcast、AllGather、Scatter、ReduceScatter、Reduce、AlltoAll和AlltoAllV等通信算子，并提供了对应的API供开发者调用，用于快速实现集合通信能力。

#### Broadcast

Broadcast操作是将通信域内root节点的数据广播到其他rank。


注意：通信域内只能有一个root节点。

相关接口：HcclBroadcast。


#### Scatter

Scatter操作是将通信域内root节点的数据均分并散布至其他rank。


注意：通信域内只能有一个root节点。

相关接口：HcclScatter。


#### AllGather

AllGather操作是将通信域内所有节点的输入按照rank id重新排序（rank id按照从小到大的顺序排序），然后拼接起来，再将结果发送到所有节点的输出buffer。


针对AllGather操作，每个节点都接收按照rank id重新排序后的数据集合，即每个节点的AllGather输出都是一样的。


相关接口：HcclAllGather。


#### AllGatherV

AllGatherV操作是将通信域内所有节点的输入按照rank id重新排序（rank id按照从小到大的顺序排序），然后拼接起来，再将结果发送到所有节点的输出。与AllGather操作不同的是，AllGatherV操作支持通信域内不同节点的输入配置不同大小的数据量。


针对AllGatherV操作，每个节点都接收按照rank id重新排序后的数据集合，即每个节点的AllGatherV输出都是一样的。


相关接口：HcclAllGatherV。


#### Reduce

Reduce操作是将通信域内所有rank的输入数据进行归约操作后（支持sum、prod、max、min），再把结果发送到root节点的输出buffer。


注意：通信域内只能有一个root节点。

相关接口：HcclReduce。


#### AllReduce

AllReduce操作是将通信域内所有节点的输入数据进行归约操作后（支持sum、prod、max、min），再把结果发送到所有节点的输出buffer。


注意：每个rank只能有一个输入。

相关接口：HcclAllReduce。


#### ReduceScatter

ReduceScatter操作是将通信域内所有rank的输入数据均分成rank size份，然后分别取每个rank的rank size之一份数据进行归约操作（如sum、prod、max、min）。最后，将结果按照编号分散到各个rank的输出buffer。


相关接口：HcclReduceScatter。


#### ReduceScatterV

ReduceScatterV操作与ReduceScatter操作类似，不同点是支持为通信域内不同的节点配置不同大小的数据量（同一rank不同编号的数据大小可设置，但不同rank间相同编号的数据大小需保持一致），取每个rank对应编号的数据进行归约操作后（如sum、prod、max、min）后，再把结果按照编号分散到各个rank的输出buffer。


相关接口：HcclReduceScatterV。


#### AlltoAll

AlltoAll操作是向通信域内所有rank发送相同数据量的数据，并从所有rank接收相同数据量的数据。


AlltoAll操作将输入数据在特定的维度切分成特定的块数，并按顺序发送给其他rank，同时从其他rank接收输入数据，按顺序在特定的维度拼接数据。

相关接口：HcclAlltoAll。


#### AlltoAllV

AlltoAllV操作是向通信域内所有rank发送数据（数据量可以定制），并从所有rank接收数据。


相关接口：HcclAlltoAllV。


#### AlltoAllVC

AlltoAllVC操作是向通信域内所有rank发送数据（数据量可以定制），并从所有rank接收数据。相比于AlltoAllV，AlltoAllVC通过输入参数sendCountMatrix传入所有rank的收发参数。


相关接口：HcclAlltoAllVC。


#### 接口调用

下面以HcclAllReduce接口为例，介绍其使用示例，HcclAllReduce接口的原型定义如下：

```
HcclResult HcclAllReduce(void *sendBuf, void *recvBuf, uint64_t count, HcclDataType dataType, HcclReduceOp op, HcclComm comm, aclrtStream stream)
```


HcclAllReduce用于将通信域内所有节点的输入进行归约操作，再把结果发送到所有节点的输出，其中op参数用于指定归约的操作类型。HcclAllReduce允许每个节点只有一个输入。

如下代码片段所示，将通信域内所有输入内存中的数据，按照float32的数据格式执行加法操作（示例中每个rank中只有一个数据参与），然后把相加结果发送到所有节点的输出内存。

```
void* hostBuf = nullptr;
void* sendBuf = nullptr;
void* recvBuf = nullptr;
uint64_t count = 1;
int malloc_kSize = count * sizeof(float);
aclrtStream stream;
aclrtCreateStream(&stream);

//申请集合通信操作的内存 
aclrtMalloc((void**)&sendBuf, malloc_kSize, ACL_MEM_MALLOC_HUGE_ONLY); 
aclrtMalloc((void**)&recvBuf, malloc_kSize, ACL_MEM_MALLOC_HUGE_ONLY);

//初始化输入内存
aclrtMallocHost((void**)&hostBuf, malloc_kSize);
aclrtMemcpy((void*)sendBuf, malloc_kSize, (void*)hostBuf, malloc_kSize, ACL_MEMCPY_HOST_TO_DEVICE);

//执行集合通信操作
HcclAllReduce((void *)sendBuf, (void*)recvBuf, count, HCCL_DATA_TYPE_FP32, HCCL_REDUCE_SUM, hcclComm, stream);
```

HcclAllReduce接口调用的完整示例可参见示例代码章节不同通信域初始化方式中的“HcclAllReduce操作代码样例”。
