HcclReduce
【免费下载链接】runner-imagesGitHub Actions runner images项目地址: https://gitcode.com/GitHub_Trending/ru/runner-images
接口速览
CANN 集合通信算子 HcclReduce,用于多 rank 数据归约。它把各 rank 同一位置的数据做运算,结果写入 root 的 recvBuf。
适用环境
- Ascend 950PR/Ascend 950DT:支持
- Atlas A3 训练系列产品/Atlas A3 推理系列产品:支持
- Atlas A2 训练系列产品/Atlas A2 推理系列产品:支持
- Atlas 训练系列产品:支持
- Atlas 推理系列产品:不支持
[!NOTE] 针对 Atlas A2 训练系列产品/Atlas A2 推理系列产品,当前仅支持 Atlas 800T A2 训练服务器、Atlas 900 A2 PoD 集群基础单元、Atlas 200T A2 Box16 异构子框。
数据流与原理
每个 rank 在 sendBuf 的同一位置各存一个待归约的数值。集合通信算子收集所有 rank 对应位置的数据,按 op 指定的操作做归约。root 节点像考试中的"收卷老师",负责汇总所有答案。最终结果写回它自己的 recvBuf。
函数签名
HcclResult HcclReduce(void *sendBuf, void *recvBuf, uint64_t count, HcclDataType dataType, HcclReduceOp op, uint32_t root, HcclComm comm, aclrtStream stream)前两个指针分别是源和目的 buffer,中间依次是元素个数、数据类型、操作类型。最后三个是 root、通信域和任务流。
参数逐项说明
| 参数名 | 方向 | 说明 |
|---|---|---|
| sendBuf | 输入 | 源数据 buffer 地址,位于 Device 侧。对齐要求见"硬性限制"。 |
| recvBuf | 输出 | 目的数据 buffer 地址,位于 Device 侧,归约结果写入此处。 |
| count | 输入 | 参与归约的元素个数,按 dataType 的元素计。例如 1 个 int32 参与则 count 为 1。 |
| dataType | 输入 | 归约数据类型(HcclDataType)。 Ascend 950PR/Ascend 950DT:int8、int16、int32、int64、uint64、float16、float32、float64、bfp16,其中 int64、uint64、float64 当前仅支持节点内通信。 Atlas A3 训练/推理系列产品:int8、int16、int32、int64、float16、float32、bfp16。 Atlas A2 训练/推理系列产品:int8、int16、int32、int64、float16、float32、bfp16,其中 int64 性能有一定劣化。 Atlas 训练系列产品:int8、int32、int64、float16、float32。 |
| op | 输入 | 归约操作类型,支持 sum、prod、max、min。 Ascend 950PR/Ascend 950DT 当前支持 sum、max、min。 Atlas A3 与 Atlas A2 训练/推理系列产品,当前版本 prod 操作不支持 int16、bfp16 数据类型。 |
| root | 输入 | 作为归约 root 的 rank id,取值为本通信域内合法的 rank id(0 到 rank 总数减 1)。 |
| comm | 输入 | 集合通信操作所在的通信域(HcclComm),由通信域初始化接口创建。 |
| stream | 输入 | 本 rank 使用的任务流(aclrtStream)。 |
返回值
成功返回 HCCL_SUCCESS,其他取值均表示失败。返回码类型 HcclResult 的完整定义以官方文档为准。
硬性限制
- 所有 rank 的 count、dataType、op 必须相同,否则归约结果未定义。
- sendBuf 与 recvBuf 需按数据类型满足地址对齐:
- int8 按 1 Byte 对齐。
- int16、float16、bfp16 按 2 Byte 对齐。
- int32、float32 按 4 Byte 对齐。
- int64、uint64、float64 按 8 Byte 对齐。
- Ascend 950PR/Ascend 950DT 上,int64、uint64、float64 当前仅支持节点内通信。
端到端示例
// ← 申请 Device 内存 void *sendBuf = nullptr; void *recvBuf = nullptr; uint64_t count = 8; size_t mallocSize = count * sizeof(float); aclrtMalloc((void **)&sendBuf, mallocSize, ACL_MEM_MALLOC_HUGE_ONLY); aclrtMalloc((void **)&recvBuf, mallocSize, ACL_MEM_MALLOC_HUGE_ONLY); // ← 初始化通信域 uint32_t rankSize = 8; HcclComm comm; HcclCommInitRootInfo(rankSize, &rootInfo, deviceId, &comm); // ← 创建任务流 aclrtStream stream; aclrtCreateStream(&stream); // ← 核心 API 调用:将各 rank 对应位置数据求和,结果写入 root 的 recvBuf HcclReduce(sendBuf, recvBuf, count, HCCL_DATA_TYPE_FP32, HCCL_REDUCE_SUM, root, comm, stream); // ← 同步等待 aclrtSynchronizeStream(stream); // ← 释放全部资源 aclrtFree(sendBuf); // 释放 Device 侧内存 aclrtFree(recvBuf); // 释放 Device 侧内存 aclrtDestroyStream(stream); // 销毁任务流 HcclCommDestroy(comm); // 销毁通信域易错提醒
- 错误写法:各 rank 的 count 不一致 → 后果:归约结果未定义 → 正确做法:所有 rank 保持相同 count。
- 错误写法:使用 int64 却只按 4 Byte 对齐 buffer → 后果:地址未对齐导致报错或数据错乱 → 正确做法:按 int64 的 8 Byte 对齐要求分配内存。
- 错误写法:默认 root 一定是 0 → 后果:结果写入错误 rank → 正确做法:按实际 root 的 rank id 传入 root。
【免费下载链接】runner-imagesGitHub Actions runner images项目地址: https://gitcode.com/GitHub_Trending/ru/runner-images
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考