文件最后提交记录最后更新时间
[文档] 补充4个算子的通信引擎约束说明 Co-authored-by: libohao6<libohao3@huawei.com> # message auto-generated for no-merge-commit merge: !5058 merge comm_engine_doc into master [文档] 补充4个算子的通信引擎约束说明 Created-by: libohao6 Commit-by: libohao6 Merged-by: cann-robot Description: ## 描述 [文档] 补充4个算子的通信引擎约束说明 ## 关联的Issue [Documentation|文档反馈]: [文档] 补充4个算子的通信引擎约束说明 #2299 ## 测试 不涉及 ## 文档更新 更新了aclnn文档。 ## 类型标签 <!-- [x] 表示选中 --> - [.] 🐛 Bug 修复 - [ ] ✨ 新特性 - [ ] ⚡ 性能优化 - [ ] ♻️ 重构 - [ ] 🧪 测试 - [ ] 📦 构建/CI - [ ] 🔧 配置变更 - [x] 📝 文档更新 - [ ] ⬆️ 依赖升级 - [ ] 🔒 安全修复 - [ ] 🧹 代码清理 - [ ] ❓ 其他,请描述: See merge request: cann/ops-transformer!505820 天前
修复AlltoAllvGroupedMatmul、AlltoAllvQuantGroupedMatmul、MatmulReduceScatter、MatmulReduceScatterV2资料问题 Co-authored-by: libohao6<libohao3@huawei.com> # message auto-generated for no-merge-commit merge: !2916 merge master_0316_fix_md into master 修复AlltoAllvGroupedMatmul、AlltoAllvQuantGroupedMatmul、MatmulReduceScatter、MatmulReduceScatterV2资料问题 Created-by: libohao6 Commit-by: libohao6 Merged-by: cann-robot Description: ## 描述 修复MatmulReduceScatter资料问题 ## 关联的Issue [Documentation|文档反馈]: 修复MatmulReduceScatter资料问题 #1253 ## 测试 不涉及。 ## 文档更新 更新AlltoAllvGroupedMatmul、AlltoAllvQuantGroupedMatmul、MatmulReduceScatter、MatmulReduceScatterV2的docs和README。 ## 类型标签 <!-- [x] 表示选中 --> - [x] 🐛 Bug 修复 - [ ] ✨ 新特性 - [ ] ⚡ 性能优化 - [ ] ♻️ 重构 - [ ] 🧪 测试 - [ ] 📦 构建/CI - [ ] 🔧 配置变更 - [x] 📝 文档更新 - [ ] ⬆️ 依赖升级 - [ ] 🔒 安全修复 - [ ] 🧹 代码清理 - [ ] ❓ 其他,请描述: See merge request: cann/ops-transformer!29162 个月前
修复A3默认AICPU通信引擎方式 Co-authored-by: libohao6<libohao3@huawei.com> # message auto-generated for no-merge-commit merge: !5262 merge fix_pr3730_ut into master 修复A3默认AICPU通信引擎方式 Created-by: libohao6 Commit-by: libohao6 Merged-by: cann-robot Description: ## 描述 修复A3默认AICPU通信引擎方式 #5262 ## 关联的Issue [Bug-Report|缺陷反馈]: 修复A3默认AICPU通信引擎方式 #2411 ## 测试 rdv ## 文档更新 不涉及。 ## 类型标签 <!-- [x] 表示选中 --> - [x] 🐛 Bug 修复 - [ ] ✨ 新特性 - [ ] ⚡ 性能优化 - [ ] ♻️ 重构 - [ ] 🧪 测试 - [ ] 📦 构建/CI - [ ] 🔧 配置变更 - [ ] 📝 文档更新 - [ ] ⬆️ 依赖升级 - [ ] 🔒 安全修复 - [ ] 🧹 代码清理 - [ ] ❓ 其他,请描述: See merge request: cann/ops-transformer!526215 天前
修复A3默认AICPU通信引擎方式 Co-authored-by: libohao6<libohao3@huawei.com> # message auto-generated for no-merge-commit merge: !5262 merge fix_pr3730_ut into master 修复A3默认AICPU通信引擎方式 Created-by: libohao6 Commit-by: libohao6 Merged-by: cann-robot Description: ## 描述 修复A3默认AICPU通信引擎方式 #5262 ## 关联的Issue [Bug-Report|缺陷反馈]: 修复A3默认AICPU通信引擎方式 #2411 ## 测试 rdv ## 文档更新 不涉及。 ## 类型标签 <!-- [x] 表示选中 --> - [x] 🐛 Bug 修复 - [ ] ✨ 新特性 - [ ] ⚡ 性能优化 - [ ] ♻️ 重构 - [ ] 🧪 测试 - [ ] 📦 构建/CI - [ ] 🔧 配置变更 - [ ] 📝 文档更新 - [ ] ⬆️ 依赖升级 - [ ] 🔒 安全修复 - [ ] 🧹 代码清理 - [ ] ❓ 其他,请描述: See merge request: cann/ops-transformer!526215 天前
alltoallvgmm非量化算子性能优化:改调用量化模板 Co-authored-by: libohao6<libohao3@huawei.com> # message auto-generated for no-merge-commit merge: !5243 merge use_quant_compute_template_v2 into master alltoallvgmm非量化算子性能优化:改调用量化模板 Created-by: libohao6 Commit-by: libohao6 Merged-by: cann-robot Description: ## 描述 alltoallvgmm非量化算子性能优化:改调用量化模板 ## 关联的Issue [Requirement|需求建议]: alltoallvgmm非量化算子性能优化:改调用量化模板 #2732 ## 测试 二级冒烟、性能测试。 ## 文档更新 不涉及。 ## 类型标签 <!-- [x] 表示选中 --> - [ ] 🐛 Bug 修复 - [ ] ✨ 新特性 - [x] ⚡ 性能优化 - [ ] ♻️ 重构 - [ ] 🧪 测试 - [ ] 📦 构建/CI - [ ] 🔧 配置变更 - [ ] 📝 文档更新 - [ ] ⬆️ 依赖升级 - [ ] 🔒 安全修复 - [ ] 🧹 代码清理 - [ ] ❓ 其他,请描述: # Ascend C 算子代码检视报告 ## PR概述 | 项目 | 内容 | |------|------| | PR标题 | alltoallvgmm非量化算子性能优化:改调用量化模板 | | PR编号 | #5243 | | 分支 | use_quant_compute_template_v2 → master | | 变更文件数 | 17个文件 | | 代码行变更 | +643/-822 (主要变更) | | Head SHA | 2a25fecc851b57a680f1a03742a99e71a6401256 | ## 代码概要 ### 侧别识别结果 | 侧别 | 文件数 | 文件类型 | |------|--------|----------| | Kernel侧 | 8个 | .h/.cpp (含 __aicore__ 标记) | | Tiling侧 | 6个 | .cpp/.h (Host侧Tiling逻辑) | | 配置文件 | 3个 | CMakeLists.txt, tiling_key.h | ### Kernel侧关键文件 1. mc2/3rd/grouped_matmul/op_kernel/gqmm_cube_on_the_fly.h - 量化模式判断逻辑重构 2. mc2/allto_allv_grouped_mat_mul/op_kernel/arch22/allto_allv_grouped_mat_mul.cpp - Kernel入口重构 3. mc2/allto_allv_quant_grouped_mat_mul/op_kernel/mc2_templates/a2av_gmm_utils.h - 类型大小宏定义 4. mc2/allto_allv_quant_grouped_mat_mul/op_kernel/mc2_templates/communication/hccl_a2av_op.h - 核间同步新增 5. mc2/allto_allv_quant_grouped_mat_mul/op_kernel/mc2_templates/compute/quant_grouped_matmul.h - 参数新增nullptr检查 6. mc2/allto_allv_quant_grouped_mat_mul/op_kernel/mc2_templates/scheduler/a2av_gmm_scheduler.h - workspace计算新增X_TYPE_SIZE ### Tiling侧关键文件 1. mc2/allto_allv_grouped_mat_mul/op_host/op_tiling/allto_allv_grouped_mat_mul_tiling.cpp - Tiling实现重构(大量变更) 2. mc2/allto_allv_grouped_mat_mul/op_host/op_tiling/allto_allv_grouped_mat_mul_tiling.h - Tiling头文件重构 3. mc2/allto_allv_grouped_mat_mul/op_host/op_tiling/allto_allv_grouped_mat_mul_tiling_base.h - Tiling基类继承重构 ### 领域特征 **MC² 通算融合算子**:AlltoAllv + GroupedMatmul 融合 - 核间同步: SyncAll<false>() 新增 - HCCL通信: HcclA2avOp 模板类 - 量化计算: QuantGroupedMatmul 模板类 --- ## 条款级检视结果 ### 1. SEC-2.1: 有符号整数运算不溢出 **状态**: PASS **置信度**: HIGH **分析**: 检查 diff 中的整数运算: - a2av_gmm_scheduler.h 第49行: uint64_t commOutLen 存储乘法结果 - A * H1 乘法运算,变量来自TilingData (已校验) - 结果存储在 uint64_t (足够大) - 业务约束下不会溢出 **证据链**: - 变量来源: TilingData参数,已在Tiling阶段校验范围 - 结果类型: uint64_t,范围足够大 - 业务约束: 最大数据量 batch×seqLen×headDim ≈ 67MB,远小于 UINT64_MAX --- ### 2. SEC-2.2: 无符号整数运算不回绕 **状态**: PASS **置信度**: HIGH **分析**: - uint64_t 用于GM偏移/大小计算 - CeilDiv 返回 uint64_t - PACK_FACTOR 宏定义为 1U/2U - 业务约束下不会回绕 --- ### 3. SEC-2.3: 除法/余数运算除零保护 **状态**: PASS **置信度**: HIGH **分析**: - CeilDiv 函数: (a + b - 1) / b - 除数 b 来自编译期常量 PACK_FACTOR (1U/2U) 或 TilingData - 符合Kernel侧排除规则: 除数为编译期常量或TilingData参数 **Kernel侧排除规则验证**: | 排除条件 | 参数模式 | 结果 | |---------|---------|------| | 除数来自TilingData | tilingData->taskTilingInfo.* | PASS | | 编译期常量 | PACK_FACTOR 宏定义 | PASS | --- ### 4. SEC-3.1: 禁止使用未初始化的变量 **状态**: PASS **置信度**: HIGH **分析**: - userWorkspace = GetUserWorkspace(workspaceGM) - 函数返回值初始化 - pipe = TPipe对象 - 默认构造 - a2avGmmScheduler 模板类对象 - 后续调用Init() **PASS** - 所有变量正确初始化 --- ### 5. SEC-3.5: 指针使用前判空 **状态**: PASS **置信度**: HIGH **改进点**: 新增nullptr检查 (代码质量提升) **代码片段** (quant_grouped_matmul.h 第59-67行): ```cpp if (xScaleGM != nullptr) { xScaleGlobalBuffer_.SetGlobalBuffer((__gm__ scaleType *)xScaleGM); } if (weightScaleGM != nullptr) { wScaleGlobalBuffer_.SetGlobalBuffer((__gm__ scaleType *)weightScaleGM); } ``` **分析**: - PR新增了 xScaleGMweightScaleGM 的 nullptr 检查 - 符合 SEC-3.5 规范: 指针使用前必须判空 - 这是代码质量改进,不是新风险 **证据链**: - 新增代码: nullptr 检查 → SetGlobalBuffer - 原代码可能直接调用 SetGlobalBuffer 无判空 → 已修复 --- ### 6. TOPK-8: gm内存偏移或大小必须用int64表示 **状态**: PASS **置信度**: HIGH **分析**: - commOutLen = uint64_t (符合规范) - groupListSize = uint64_t (符合规范) - 所有GM偏移/大小使用 uint64_t/int64_t --- ### 7. TOPK-11: 通信算子融合需核间同步 **状态**: PASS **置信度**: HIGH **改进点**: 新增核间同步 (代码质量提升) **代码片段** (hccl_a2av_op.h 第274-275行): ```cpp __aicore__ inline void End() { SyncAll<false>(); // 新增的核间同步 if ASCEND_IS_AIC { return; } ``` **分析**: - PR新增 SyncAll<false>() 在通信结束后 - 符合 TOPK-11 规范: 通信算子融合需核间同步 - 这是代码质量改进,不是新风险 **证据链**: - AlltoAllv通信结束后 → SyncAll确保所有核完成 --- ### 8. MC2-01: 核间同步必要性 **状态**: PASS **置信度**: HIGH **分析**: - SyncAll<false>() 位于通信结束后(End函数) - 确保下一轮计算开始前通信数据已就绪 - 同步屏障正确放置 --- ### 9. MC2-03: SyncAll同步生效 **状态**: PASS **置信度**: HIGH **分析**: - SyncAll<false>() 参数说明: - false: 同步所有核含AIC - true: 仅同步AIV - 使用 false 确保通算融合场景所有核同步 --- ### 10. MC2-11: 量化精度保护 **状态**: PASS **置信度**: HIGH **改进点**: 变量声明位置优化 (代码质量提升) **代码片段** (gqmm_cube_on_the_fly.h 第145-160行): ```cpp } else { if (gmmQuantParams_->aQuantMode == static_cast<uint32_t>(Mc2QuantUtils::QuantMode::DEFAULT) && gmmQuantParams_->bQuantMode == static_cast<uint32_t>(Mc2QuantUtils::QuantMode::DEFAULT)) { } else if (...) { __gm__ scaleType *scaleB = ... // scaleB 声明移至分支内部 ... } ``` **分析**: - PR将 scaleB 变量声明从公共区域移至各分支内部 - 避免未初始化访问风险 - 符合 SEC-3.1 和 MC2-11 规范 - 这是代码质量改进,不是新风险 --- ### 11. MC2-18: HCCL通信生命周期与参数 **状态**: PASS **置信度**: HIGH **分析**: - PR新增 SyncAll<false>() 不涉及生命周期变更 - Kernel入口使用阻塞模式: HcclA2avOp<half, true, ...> - true 模板参数表示阻塞模式 - 自动包含 Commit/Wait - 生命周期由调度器管理,正确 --- ### 12. API-12: CrossCoreSetFlag/WaitFlag必须对称 **状态**: PASS **置信度**: HIGH **分析**: - PR新增 SyncAll<false>() 不涉及 CrossCoreSetFlag/WaitFlag - 不存在该API使用变更 --- ## 发现的问题和建议 ### 无高风险问题 所有条款检视均通过,代码质量良好。 ### 代码改进点 以下改进提升了代码安全性/规范性: | 改进点 | 条款 | 原状态 | 新状态 | |--------|------|---------|---------| | 新增nullptr检查 | SEC-3.5 | 无判空 | 有判空 | | 新增核间同步 | TOPK-11 | 无同步 | 有同步 | | 变量声明位置优化 | SEC-3.1 | 公共声明 | 分支内声明 | ### 建议关注的代码点 **1. 空分支处理** (gqmm_cube_on_the_fly.h 第145-148行): ```cpp if (gmmQuantParams_->aQuantMode == static_cast<uint32_t>(Mc2QuantUtils::QuantMode::DEFAULT) && gmmQuantParams_->bQuantMode == static_cast<uint32_t>(Mc2QuantUtils::QuantMode::DEFAULT)) { // 空分支 } ``` - 空分支可能表示 DEFAULT 模式无需特殊处理 - 建议: 添加注释说明 DEFAULT 模式的预期行为 **2. SetValue 使用** (quant_grouped_matmul.h 第96行): ```cpp groupListGlobalBuffer_.SetValue(GROUP_LIST_INDEX, groupListToken); ``` - SetValue 是逐元素操作,性能较低 - 但此场景是 groupList 更新,数据量小 - 注释说明: "flush groupList到GM确保Cube引擎读到最新数据" - 符合特定场景需求 --- ## 总结与风险评估 ### 总体评估 | 维度 | 评分 | 说明 | |------|------|------| | 安全编码规范 | PASS | 所有条款通过,无高风险问题 | | API使用正确性 | PASS | SyncAll参数正确,HCCL模式正确 | | 性能优化 | PASS | 核间同步改进,指针判空改进 | | 精度标准 | PASS | 量化逻辑正确,变量初始化改进 | | Tiling设计 | PASS | 参数类型正确,结构重构合理 | | 代码规范 | PASS | 变量声明改进,符合规范 | ### 风险等级 **无高风险问题** - 代码质量良好,符合安全编码规范。 ### 主要改进总结 本次 PR 的主要改进: 1. **核间同步增强**: 新增 SyncAll<false>() 确保通算融合场景同步 2. **指针安全**: 新增 nullptr 检查避免空指针解引用 3. **变量初始化**: scaleB 变量声明移至分支内部避免未初始化 ### 建议 1. 为 DEFAULT 模式空分支添加注释说明预期行为 2. 继续关注 SetValue 在大数据量场景的性能影响 --- ## 附录 ### 检视执行信息 - 检视时间: 2026-05-25 - 检视工具: ascendc-code-review skill - 检视方法论: 假设检验驱动 - 条款覆盖: 12条 (100%覆盖) - 置信度标注: HIGH (所有条款) ### 变更文件清单 | 文件 | 侧别 | 变更类型 | |------|------|----------| | gqmm_cube_on_the_fly.h | Kernel | 量化逻辑重构 | | allto_allv_grouped_mat_mul.cpp | Kernel | 入口重构 | | a2av_gmm_utils.h | Kernel | 宏定义新增 | | hccl_a2av_op.h | Kernel | 核间同步新增 | | quant_grouped_matmul.h | Kernel | nullptr检查新增 | | a2av_gmm_scheduler.h | Kernel | workspace计算改进 | | allto_allv_grouped_mat_mul_tiling.cpp | Tiling | 大量重构 | | allto_allv_grouped_mat_mul_tiling.h | Tiling | 头文件重构 | | allto_allv_grouped_mat_mul_tiling_base.h | Tiling | 基类重构 | | arch22/..._tiling_a3.cpp | Tiling | 架构适配 | | arch35/..._tiling_a5.cpp | Tiling | 架构适配 | --- **报告生成完成** See merge request: cann/ops-transformer!52431 天前
alltoallvgmm非量化算子性能优化:改调用量化模板 Co-authored-by: libohao6<libohao3@huawei.com> # message auto-generated for no-merge-commit merge: !5243 merge use_quant_compute_template_v2 into master alltoallvgmm非量化算子性能优化:改调用量化模板 Created-by: libohao6 Commit-by: libohao6 Merged-by: cann-robot Description: ## 描述 alltoallvgmm非量化算子性能优化:改调用量化模板 ## 关联的Issue [Requirement|需求建议]: alltoallvgmm非量化算子性能优化:改调用量化模板 #2732 ## 测试 二级冒烟、性能测试。 ## 文档更新 不涉及。 ## 类型标签 <!-- [x] 表示选中 --> - [ ] 🐛 Bug 修复 - [ ] ✨ 新特性 - [x] ⚡ 性能优化 - [ ] ♻️ 重构 - [ ] 🧪 测试 - [ ] 📦 构建/CI - [ ] 🔧 配置变更 - [ ] 📝 文档更新 - [ ] ⬆️ 依赖升级 - [ ] 🔒 安全修复 - [ ] 🧹 代码清理 - [ ] ❓ 其他,请描述: # Ascend C 算子代码检视报告 ## PR概述 | 项目 | 内容 | |------|------| | PR标题 | alltoallvgmm非量化算子性能优化:改调用量化模板 | | PR编号 | #5243 | | 分支 | use_quant_compute_template_v2 → master | | 变更文件数 | 17个文件 | | 代码行变更 | +643/-822 (主要变更) | | Head SHA | 2a25fecc851b57a680f1a03742a99e71a6401256 | ## 代码概要 ### 侧别识别结果 | 侧别 | 文件数 | 文件类型 | |------|--------|----------| | Kernel侧 | 8个 | .h/.cpp (含 __aicore__ 标记) | | Tiling侧 | 6个 | .cpp/.h (Host侧Tiling逻辑) | | 配置文件 | 3个 | CMakeLists.txt, tiling_key.h | ### Kernel侧关键文件 1. mc2/3rd/grouped_matmul/op_kernel/gqmm_cube_on_the_fly.h - 量化模式判断逻辑重构 2. mc2/allto_allv_grouped_mat_mul/op_kernel/arch22/allto_allv_grouped_mat_mul.cpp - Kernel入口重构 3. mc2/allto_allv_quant_grouped_mat_mul/op_kernel/mc2_templates/a2av_gmm_utils.h - 类型大小宏定义 4. mc2/allto_allv_quant_grouped_mat_mul/op_kernel/mc2_templates/communication/hccl_a2av_op.h - 核间同步新增 5. mc2/allto_allv_quant_grouped_mat_mul/op_kernel/mc2_templates/compute/quant_grouped_matmul.h - 参数新增nullptr检查 6. mc2/allto_allv_quant_grouped_mat_mul/op_kernel/mc2_templates/scheduler/a2av_gmm_scheduler.h - workspace计算新增X_TYPE_SIZE ### Tiling侧关键文件 1. mc2/allto_allv_grouped_mat_mul/op_host/op_tiling/allto_allv_grouped_mat_mul_tiling.cpp - Tiling实现重构(大量变更) 2. mc2/allto_allv_grouped_mat_mul/op_host/op_tiling/allto_allv_grouped_mat_mul_tiling.h - Tiling头文件重构 3. mc2/allto_allv_grouped_mat_mul/op_host/op_tiling/allto_allv_grouped_mat_mul_tiling_base.h - Tiling基类继承重构 ### 领域特征 **MC² 通算融合算子**:AlltoAllv + GroupedMatmul 融合 - 核间同步: SyncAll<false>() 新增 - HCCL通信: HcclA2avOp 模板类 - 量化计算: QuantGroupedMatmul 模板类 --- ## 条款级检视结果 ### 1. SEC-2.1: 有符号整数运算不溢出 **状态**: PASS **置信度**: HIGH **分析**: 检查 diff 中的整数运算: - a2av_gmm_scheduler.h 第49行: uint64_t commOutLen 存储乘法结果 - A * H1 乘法运算,变量来自TilingData (已校验) - 结果存储在 uint64_t (足够大) - 业务约束下不会溢出 **证据链**: - 变量来源: TilingData参数,已在Tiling阶段校验范围 - 结果类型: uint64_t,范围足够大 - 业务约束: 最大数据量 batch×seqLen×headDim ≈ 67MB,远小于 UINT64_MAX --- ### 2. SEC-2.2: 无符号整数运算不回绕 **状态**: PASS **置信度**: HIGH **分析**: - uint64_t 用于GM偏移/大小计算 - CeilDiv 返回 uint64_t - PACK_FACTOR 宏定义为 1U/2U - 业务约束下不会回绕 --- ### 3. SEC-2.3: 除法/余数运算除零保护 **状态**: PASS **置信度**: HIGH **分析**: - CeilDiv 函数: (a + b - 1) / b - 除数 b 来自编译期常量 PACK_FACTOR (1U/2U) 或 TilingData - 符合Kernel侧排除规则: 除数为编译期常量或TilingData参数 **Kernel侧排除规则验证**: | 排除条件 | 参数模式 | 结果 | |---------|---------|------| | 除数来自TilingData | tilingData->taskTilingInfo.* | PASS | | 编译期常量 | PACK_FACTOR 宏定义 | PASS | --- ### 4. SEC-3.1: 禁止使用未初始化的变量 **状态**: PASS **置信度**: HIGH **分析**: - userWorkspace = GetUserWorkspace(workspaceGM) - 函数返回值初始化 - pipe = TPipe对象 - 默认构造 - a2avGmmScheduler 模板类对象 - 后续调用Init() **PASS** - 所有变量正确初始化 --- ### 5. SEC-3.5: 指针使用前判空 **状态**: PASS **置信度**: HIGH **改进点**: 新增nullptr检查 (代码质量提升) **代码片段** (quant_grouped_matmul.h 第59-67行): ```cpp if (xScaleGM != nullptr) { xScaleGlobalBuffer_.SetGlobalBuffer((__gm__ scaleType *)xScaleGM); } if (weightScaleGM != nullptr) { wScaleGlobalBuffer_.SetGlobalBuffer((__gm__ scaleType *)weightScaleGM); } ``` **分析**: - PR新增了 xScaleGMweightScaleGM 的 nullptr 检查 - 符合 SEC-3.5 规范: 指针使用前必须判空 - 这是代码质量改进,不是新风险 **证据链**: - 新增代码: nullptr 检查 → SetGlobalBuffer - 原代码可能直接调用 SetGlobalBuffer 无判空 → 已修复 --- ### 6. TOPK-8: gm内存偏移或大小必须用int64表示 **状态**: PASS **置信度**: HIGH **分析**: - commOutLen = uint64_t (符合规范) - groupListSize = uint64_t (符合规范) - 所有GM偏移/大小使用 uint64_t/int64_t --- ### 7. TOPK-11: 通信算子融合需核间同步 **状态**: PASS **置信度**: HIGH **改进点**: 新增核间同步 (代码质量提升) **代码片段** (hccl_a2av_op.h 第274-275行): ```cpp __aicore__ inline void End() { SyncAll<false>(); // 新增的核间同步 if ASCEND_IS_AIC { return; } ``` **分析**: - PR新增 SyncAll<false>() 在通信结束后 - 符合 TOPK-11 规范: 通信算子融合需核间同步 - 这是代码质量改进,不是新风险 **证据链**: - AlltoAllv通信结束后 → SyncAll确保所有核完成 --- ### 8. MC2-01: 核间同步必要性 **状态**: PASS **置信度**: HIGH **分析**: - SyncAll<false>() 位于通信结束后(End函数) - 确保下一轮计算开始前通信数据已就绪 - 同步屏障正确放置 --- ### 9. MC2-03: SyncAll同步生效 **状态**: PASS **置信度**: HIGH **分析**: - SyncAll<false>() 参数说明: - false: 同步所有核含AIC - true: 仅同步AIV - 使用 false 确保通算融合场景所有核同步 --- ### 10. MC2-11: 量化精度保护 **状态**: PASS **置信度**: HIGH **改进点**: 变量声明位置优化 (代码质量提升) **代码片段** (gqmm_cube_on_the_fly.h 第145-160行): ```cpp } else { if (gmmQuantParams_->aQuantMode == static_cast<uint32_t>(Mc2QuantUtils::QuantMode::DEFAULT) && gmmQuantParams_->bQuantMode == static_cast<uint32_t>(Mc2QuantUtils::QuantMode::DEFAULT)) { } else if (...) { __gm__ scaleType *scaleB = ... // scaleB 声明移至分支内部 ... } ``` **分析**: - PR将 scaleB 变量声明从公共区域移至各分支内部 - 避免未初始化访问风险 - 符合 SEC-3.1 和 MC2-11 规范 - 这是代码质量改进,不是新风险 --- ### 11. MC2-18: HCCL通信生命周期与参数 **状态**: PASS **置信度**: HIGH **分析**: - PR新增 SyncAll<false>() 不涉及生命周期变更 - Kernel入口使用阻塞模式: HcclA2avOp<half, true, ...> - true 模板参数表示阻塞模式 - 自动包含 Commit/Wait - 生命周期由调度器管理,正确 --- ### 12. API-12: CrossCoreSetFlag/WaitFlag必须对称 **状态**: PASS **置信度**: HIGH **分析**: - PR新增 SyncAll<false>() 不涉及 CrossCoreSetFlag/WaitFlag - 不存在该API使用变更 --- ## 发现的问题和建议 ### 无高风险问题 所有条款检视均通过,代码质量良好。 ### 代码改进点 以下改进提升了代码安全性/规范性: | 改进点 | 条款 | 原状态 | 新状态 | |--------|------|---------|---------| | 新增nullptr检查 | SEC-3.5 | 无判空 | 有判空 | | 新增核间同步 | TOPK-11 | 无同步 | 有同步 | | 变量声明位置优化 | SEC-3.1 | 公共声明 | 分支内声明 | ### 建议关注的代码点 **1. 空分支处理** (gqmm_cube_on_the_fly.h 第145-148行): ```cpp if (gmmQuantParams_->aQuantMode == static_cast<uint32_t>(Mc2QuantUtils::QuantMode::DEFAULT) && gmmQuantParams_->bQuantMode == static_cast<uint32_t>(Mc2QuantUtils::QuantMode::DEFAULT)) { // 空分支 } ``` - 空分支可能表示 DEFAULT 模式无需特殊处理 - 建议: 添加注释说明 DEFAULT 模式的预期行为 **2. SetValue 使用** (quant_grouped_matmul.h 第96行): ```cpp groupListGlobalBuffer_.SetValue(GROUP_LIST_INDEX, groupListToken); ``` - SetValue 是逐元素操作,性能较低 - 但此场景是 groupList 更新,数据量小 - 注释说明: "flush groupList到GM确保Cube引擎读到最新数据" - 符合特定场景需求 --- ## 总结与风险评估 ### 总体评估 | 维度 | 评分 | 说明 | |------|------|------| | 安全编码规范 | PASS | 所有条款通过,无高风险问题 | | API使用正确性 | PASS | SyncAll参数正确,HCCL模式正确 | | 性能优化 | PASS | 核间同步改进,指针判空改进 | | 精度标准 | PASS | 量化逻辑正确,变量初始化改进 | | Tiling设计 | PASS | 参数类型正确,结构重构合理 | | 代码规范 | PASS | 变量声明改进,符合规范 | ### 风险等级 **无高风险问题** - 代码质量良好,符合安全编码规范。 ### 主要改进总结 本次 PR 的主要改进: 1. **核间同步增强**: 新增 SyncAll<false>() 确保通算融合场景同步 2. **指针安全**: 新增 nullptr 检查避免空指针解引用 3. **变量初始化**: scaleB 变量声明移至分支内部避免未初始化 ### 建议 1. 为 DEFAULT 模式空分支添加注释说明预期行为 2. 继续关注 SetValue 在大数据量场景的性能影响 --- ## 附录 ### 检视执行信息 - 检视时间: 2026-05-25 - 检视工具: ascendc-code-review skill - 检视方法论: 假设检验驱动 - 条款覆盖: 12条 (100%覆盖) - 置信度标注: HIGH (所有条款) ### 变更文件清单 | 文件 | 侧别 | 变更类型 | |------|------|----------| | gqmm_cube_on_the_fly.h | Kernel | 量化逻辑重构 | | allto_allv_grouped_mat_mul.cpp | Kernel | 入口重构 | | a2av_gmm_utils.h | Kernel | 宏定义新增 | | hccl_a2av_op.h | Kernel | 核间同步新增 | | quant_grouped_matmul.h | Kernel | nullptr检查新增 | | a2av_gmm_scheduler.h | Kernel | workspace计算改进 | | allto_allv_grouped_mat_mul_tiling.cpp | Tiling | 大量重构 | | allto_allv_grouped_mat_mul_tiling.h | Tiling | 头文件重构 | | allto_allv_grouped_mat_mul_tiling_base.h | Tiling | 基类重构 | | arch22/..._tiling_a3.cpp | Tiling | 架构适配 | | arch35/..._tiling_a5.cpp | Tiling | 架构适配 | --- **报告生成完成** See merge request: cann/ops-transformer!52431 天前
提升allto_allv_quant_grouped_mat_mul算子ut覆盖率 Co-authored-by: chenyifan<chenyifan66@h-partners.com> # message auto-generated for no-merge-commit merge: !5982 merge ataqgm_ut into master 提升allto_allv_quant_grouped_mat_mul算子ut覆盖率 Created-by: mutex_lock Commit-by: chenyifan Merged-by: cann-robot Description: ## 描述 提升allto_allv_quant_grouped_mat_mul算子ut覆盖率 ## 关联的Issue https://gitcode.com/cann/ops-transformer/issues/2341 ## 测试 <!--描述进行了哪些测试来验证你的改动。包括但不限于二级冒烟、算子泛化等。--> ## 文档更新 <!--如果这个PR包含文档的更新,请在这里指出。例如:更新了README.md文件。--> ## 类型标签 <!-- [x] 表示选中 --> - [ ] 🐛 Bug 修复 - [ ] ✨ 新特性 - [ ] ⚡ 性能优化 - [ ] ♻️ 重构 - [x] 🧪 测试 - [ ] 📦 构建/CI - [ ] 🔧 配置变更 - [ ] 📝 文档更新 - [ ] ⬆️ 依赖升级 - [ ] 🔒 安全修复 - [ ] 🧹 代码清理 - [ ] ❓ 其他,请描述: See merge request: cann/ops-transformer!59821 天前
新增AlltoAllvQuantGroupedMatmul、QuantGroupedMatmulAlltoAllv算子 Co-authored-by: libohao6<libohao3@huawei.com> Co-authored-by: huangshuai<huangshuai59@huawei.com> # message auto-generated for no-merge-commit merge: !2548 merge alltoallv_v2 into master 新增AlltoAllvQuantGroupedMatmul、QuantGroupedMatmulAlltoAllv算子 Created-by: libohao6 Commit-by: huangshuai;libohao6 Merged-by: cann-robot Description: ## 描述 新增AlltoAllvQuantGroupedMatmul、QuantGroupedMatmulAlltoAllv算子 ## 关联的Issue <!-- 如果这个PR是为了解决特定的Issue,请在这里提供Issue链接。例如:关联Issue #000--> <!-- 如果这个PR是为了解决特定的问题单,请在这里描述问题单单号。--> ## 测试 二级冒烟 ## 文档更新 更新了AlltoAllvQuantGroupedMatmul、QuantGroupedMatmulAlltoAllv的aclnn文档。 ## 类型标签 <!-- [x] 表示选中 --> - [X] 🐛 Bug 修复 - [ ] ✨ 新特性 - [ ] ⚡ 性能优化 - [ ] ♻️ 重构 - [ ] 🧪 测试 - [ ] 📦 构建/CI - [ ] 🔧 配置变更 - [ ] 📝 文档更新 - [ ] ⬆️ 依赖升级 - [ ] 🔒 安全修复 - [ ] 🧹 代码清理 - [ ] ❓ 其他,请描述: See merge request: cann/ops-transformer!25482 个月前
[文档] 补充4个算子的通信引擎约束说明 Co-authored-by: libohao6<libohao3@huawei.com> # message auto-generated for no-merge-commit merge: !5058 merge comm_engine_doc into master [文档] 补充4个算子的通信引擎约束说明 Created-by: libohao6 Commit-by: libohao6 Merged-by: cann-robot Description: ## 描述 [文档] 补充4个算子的通信引擎约束说明 ## 关联的Issue [Documentation|文档反馈]: [文档] 补充4个算子的通信引擎约束说明 #2299 ## 测试 不涉及 ## 文档更新 更新了aclnn文档。 ## 类型标签 <!-- [x] 表示选中 --> - [.] 🐛 Bug 修复 - [ ] ✨ 新特性 - [ ] ⚡ 性能优化 - [ ] ♻️ 重构 - [ ] 🧪 测试 - [ ] 📦 构建/CI - [ ] 🔧 配置变更 - [x] 📝 文档更新 - [ ] ⬆️ 依赖升级 - [ ] 🔒 安全修复 - [ ] 🧹 代码清理 - [ ] ❓ 其他,请描述: See merge request: cann/ops-transformer!505820 天前
README.md

AlltoAllvQuantGroupedMatMul

产品支持情况

产品 是否支持
Ascend 950PR/Ascend 950DT
Atlas A3 训练系列产品/Atlas A3 推理系列产品 ×
Atlas A2 训练系列产品/Atlas A2 推理系列产品 ×
Atlas 200I/500 A2 推理产品 ×
Atlas 推理系列产品 ×
Atlas 训练系列产品 ×

功能说明

  • 算子功能:完成路由专家AlltoAllv、量化GroupedMatMul融合并实现与共享专家量化MatMul并行融合,先通信后计算

  • 计算公式: 假设通信域中的总卡数为epWorldSize,每张卡上通信后路由专家个数为e,每张卡分组矩阵乘只负责本卡专家的计算。对于每张卡的计算公式如下:

    • 本卡共享专家分组矩阵乘计算

      mm_y=(mm_x × mm_x_scale) @ (mm_weight × mm_weight_scale)
      
    • Alltoallv通信和permute

      permute_out=Alltoallv(gmm_x)
      
    • 本卡路由专家按专家维度分组矩阵乘计算

      gmm_y=(permute_out × gmm_x_scale) @ (gmm_weight × gmm_weight_scale)
      

参数说明

参数名 输入/输出/属性 描述 数据类型 数据格式
gmmX 输入 该输入进行AlltoAllv通信后结果作为GroupedMatMul计算的左矩阵。 HIFLOAT8、FLOAT8_E4M3FN、FLOAT8_E5M2、FLOAT4_E2M1 ND
gmmWeight 输入 GroupedMatMul计算的右矩阵。 HIFLOAT8、FLOAT8_E4M3FN、FLOAT8_E5M2、FLOAT4_E2M1 ND
gmmXScale 输入 gmmX的量化系数。 FLOAT32、FLOAT8_E8M0 ND
gmmWeightScale 输入 gmmWeight的量化系数。 FLOAT32、FLOAT8_E8M0 ND
sendCountsTensorOptional 输入 预留参数,当前版本仅支持传nullptr。 - -
recvCountsTensorOptional 输入 预留参数,当前版本仅支持传nullptr。 - -
mmXOptional 输入 可选输入,共享专家MatMul计算中的左矩阵。 与gmmX保持一致 ND
mmWeightOptional 输入 可选输入,共享专家MatMul计算中的右矩阵。 与gmmWeight保持一致 ND
mmXScaleOptional 输入 可选输入,mmX的量化系数。 FLOAT32、FLOAT8_E8M0 ND
mmWeightScaleOptional 输入 可选输入,mmWeight的量化系数。 FLOAT32、FLOAT8_E8M0 ND
gmmXQuantMode 输入 gmmX的量化模式。 INT64 -
gmmWeightQuantMode 输入 gmmWeight的量化模式。 INT64 -
mmXQuantMode 输入 mmX的量化模式。 INT64 -
mmWeightQuantMode 输入 mmWeight的量化模式。 INT64 -
group 输入 专家并行的通信域名,字符串长度要求(0, 128)。 STRING -
epWorldSize 输入 ep通信域大小。 INT64 -
sendCounts 输入 表示发送给其他卡的token数。 aclIntArray*(元素类型INT64) -
recvCounts 输入 表示接收其他卡的token数。 aclIntArray*(元素类型INT64) -
transGmmWeight 输入 GroupedMatMul的右矩阵是否需要转置。 BOOL -
transMmWeight 输入 共享专家MatMul的右矩阵是否需要转置。 BOOL -
groupSize 输入 用于表示量化中gmmXScale/gmmWeightScale/mmXScale/mmWeightScale输入的一个数在其所在的对应维度方向上可以用于该方向gmmX/gmmWeight/mmX/mmWeight输入的多少个数的量化。 INT64 -
permuteOutFlag 输入 permuteOutOptional是否需要输出。 BOOL -
gmmY 输出 路由专家计算的输出。 FLOAT16、BFLOAT16 ND
mmYOptional 输出 共享专家计算的输出。 与gmmY保持一致 ND
permuteOutOptional 输出 permute之后的输出。 与gmmX保持一致 ND

约束说明

  • 通信引擎约束:仅支持CCU通信。

  • 确定性计算:

    • aclnnAlltoAllvQuantGroupedMatMul默认确定性实现。
  • 参数说明里shape使用的变量:

    • BSK:本卡发送的token数,是sendCounts参数累加之和,取值范围(0, 52428800)。
    • H1:表示路由专家hidden size隐藏层大小,取值范围(0, 65536)。
    • H2:表示共享专家hidden size隐藏层大小,取值范围(0, 12288]。
    • e:表示单卡上专家个数,取值范围(0, 32],e * epWorldSize最大支持256。
    • N1:表示路由专家的head_num,取值范围(0, 65536)。
    • N2:表示共享专家的head_num,取值范围(0, 65536)。
    • BS:batch sequence size。
    • K:表示选取TopK个专家,K的范围[2, 8]。
    • A:本卡收到的token数,是recvCounts参数累加之和。
    • ep通信域内所有卡的 A 参数的累加和等于所有卡上的 BSK 参数的累加和。
    • mx量化且gmmX与gmmWeight为FLOAT4_E2M1时,H1和H2必须为偶数且不能为2,同时transGmmWeight和transMmWeight为false情况下,N1和N2必须为偶数。
    • gmmWeight和gmmWeightScale的转置状态必须保持一致:同时转置或同时不转置。mmWeight和mmWeightScale同样需要保持转置状态一致。
    • groupSize:
      • 仅当gmmXScale/gmmWeightScale/mmXScale/mmWeightScale输入都是2维及以上数据时,groupSize取值有效,其他场景需传入0。
      • groupSize值支持公式推导:传入的groupSize内部会按如下公式分解得到groupSizeM、groupSizeN、groupSizeK,当其中有1个或多个为0,会根据gmmX/gmmWeight/mmX/mmWeight/gmmXScale/gmmWeightScale/mmXScale/mmWeightScale输入shape重新设置groupSizeM、groupSizeN、groupSizeK用于计算。设置原理:如果groupSizeM=0,表示m方向量化分组值由接口推导,推导公式为groupSizeM = m / scaleM(需保证m能被scaleM整除),其中m与gmmX/mmX shape中的m一致,scaleM与gmmXScale/mmXScale shape中的m一致;如果groupSizeK=0,表示k方向量化分组值由接口推导,推导公式为groupSizeK = k / scaleK(需保证k能被scaleK整除),其中k与gmmX/mmX shape中的k一致,scaleK与gmmXScale/mmXScale shape中的k一致;如果groupSizeN=0,表示n方向量化分组值由接口推导,推导公式为groupSizeN = n / scaleN(需保证n能被scaleN整除),其中n与gmmWeight/mmWeight shape中的n一致,scaleN与gmmWeightScale/mmWeightScale shape中的n一致。

      groupSize=groupSizeK∣groupSizeN<<16∣groupSizeM<<32groupSize = groupSizeK | groupSizeN << 16 | groupSizeM << 32

      • 如果满足重新设置条件,当gmmXScale/gmmWeightScale/mmXScale/mmWeightScale输入是2维及以上时,且数据类型都为FLOAT8_E8M0时,[groupSizeM,groupSizeN,groupSizeK]取值组合会推导为[1, 1, 32],对应groupSize的值为4295032864。
  • 量化参数约束:

    • 当前版本支持pertensor量化、mx量化。
  • 类型约束

    • pertensor量化

      gmmX gmmWeight gmmXScale gmmWeightScale mmXScale mmWeightScale gmmY
      HIFLOAT8 HIFLOAT8 FLOAT32 FLOAT32 FLOAT32 FLOAT32 FLOAT16/BFLOAT16
    • mx量化

      gmmX gmmWeight gmmXScale gmmWeightScale mmXScale mmWeightScale gmmY
      FLOAT8_E4M3FN FLOAT8_E4M3FN FLOAT8_E8M0 FLOAT8_E8M0 FLOAT8_E8M0 FLOAT8_E8M0 FLOAT16/BFLOAT16
      FLOAT8_E4M3FN FLOAT8_E5M2 FLOAT8_E8M0 FLOAT8_E8M0 FLOAT8_E8M0 FLOAT8_E8M0 FLOAT16/BFLOAT16
      FLOAT8_E5M2 FLOAT8_E4M3FN FLOAT8_E8M0 FLOAT8_E8M0 FLOAT8_E8M0 FLOAT8_E8M0 FLOAT16/BFLOAT16
      FLOAT8_E5M2 FLOAT8_E5M2 FLOAT8_E8M0 FLOAT8_E8M0 FLOAT8_E8M0 FLOAT8_E8M0 FLOAT16/BFLOAT16
      FLOAT4_E2M1 FLOAT4_E2M1 FLOAT8_E8M0 FLOAT8_E8M0 FLOAT8_E8M0 FLOAT8_E8M0 FLOAT16/BFLOAT16
    • mmX类型与gmmX类型保持一致,mmWeight类型与gmmWeight类型保持一致,mmY类型与gmmY类型保持一致,permuteOut类型与gmmX保持一致。

调用说明

调用方式 样例代码 说明
aclnn接口 test_aclnn_allto_allv_quant_grouped_mat_mul.cpp 通过aclnnAlltoAllvQuantGroupedMatMul接口方式调用AlltoAllvQuantGroupedMatMul算子。