集合通信
集合通信是指多个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提供的更多集合通信接口可参见集合通信算子。
父主题: 通信功能开发