十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

HcclReduce

HcclReduce 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 950DTint8、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 id0 到 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),仅供参考
返回列表