下载
中文
注册

集合通信

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

HCCL支持AllReduce、Broadcast、AllGather、Scatter、ReduceScatter、Reduce、AlltoAll和AlltoAllV等通信原语,关于这些通信原语的详细含义可参见集合通信原语。针对这些通信原语,HCCL提供了对应的API供开发者调用,用于快速实现集合通信能力。

例如,HCCL针对集合通信操作AllReduce提供了HcclAllReduce接口,原型定义如下:

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

HcclAllReduce用于将通信域内所有节点的输入进行Reduce操作,再把结果发送到所有节点的输出,其中op参数用于指定Reduce的操作类型,当前版本支持的操作类型有sum、prod、max、min。HcclAllReduce允许每个节点只有一个输入。

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

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
void* host_buf = nullptr;
void* send_buff = nullptr;
void* recv_buff = nullptr;
uint64_t count = 1;
int malloc_kSize = count * sizeof(float);
aclrtStream stream;
aclrtCreateStream(&stream);

//申请集合通信操作的内存 
aclrtMalloc((void**)&sendbuff, mal1oc_kSize, ACL_MEM_MALLOC_HUGE_FIRST); 
aclrtMalloc((void**)&recvbuff, malloc_kSize, ACL_MEM_MALLOC_HUGE_FIRST);

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

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

HcclAllReduce接口调用的完整示例可参见集合通信样例(HcclAllReduce),HCCL提供的更多集合通信接口可参见集合通信算子