文件最后提交记录最后更新时间
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!52435 天前
grouped_mat_mul_allto_allv算子性能优化 Co-authored-by: huangshuai<huangshuai59@huawei.com> # message auto-generated for no-merge-commit merge: !5704 merge prof_1 into master grouped_mat_mul_allto_allv算子性能优化 Created-by: huangshuai59 Commit-by: huangshuai Merged-by: cann-robot Description: ## 描述 <!--在这里详细描述你的改动,包括改动的原因和所采取的方法。--> ## 关联的Issue https://gitcode.com/cann/ops-transformer/issues/2707 ## 测试 <!--描述进行了哪些测试来验证你的改动。包括但不限于二级冒烟、算子泛化等。--> ## 文档更新 <!--如果这个PR包含文档的更新,请在这里指出。例如:更新了README.md文件。--> ## 类型标签 <!-- [x] 表示选中 --> - [ ] 🐛 Bug 修复 - [ ] ✨ 新特性 - [ ] ⚡ 性能优化 - [ ] ♻️ 重构 - [ ] 🧪 测试 - [ ] 📦 构建/CI - [ ] 🔧 配置变更 - [ ] 📝 文档更新 - [ ] ⬆️ 依赖升级 - [ ] 🔒 安全修复 - [ ] 🧹 代码清理 - [ ] ❓ 其他,请描述: # 代码检视报告(更新版) ## 检视概览 - 代码文件:PR #5704 (https://gitcode.com/cann/ops-transformer/pull/5704) - 代码侧别:混合(Tiling + Kernel) - 检视文档:cpp-secure + cpp-general + ascendc-api + ascendc-perf + ascendc-topk + mc2-specific - 总条例数:24(适用条例,过滤后,含重叠合并) - 检视时间:2026-05-26(代码更新后重新检视) - 与上次检视对比:代码已更新,上次发现的 5 个 HIGH 问题中 **4 个已修复** ## 检视统计 | 状态 | 条例数 | 占比 | |-----|--------|------| | PASS(已修复) | 4 | 16.7% | | PASS(持续通过) | 12 | 50.0% | | FAIL(新发现) | 0 | 0% | | SUSPICIOUS(需关注) | 2 | 8.3% | | MED(残余未修复) | 2 | 8.3% | | LOW(信息性) | 4 | 16.7% | ## 上次检视问题修复状态 | # | 上次问题 | 条例 | 上次置信度 | 修复状态 | 修复行号 | |---|---------|------|---------|---------|------| | 1 | BsK == 0 未拦截 | SEC-4.1+TOPK-7 | HIGH | ✅ **已修复** | quant_tiling_common.cpp:637 | | 2 | send/recv 逐元素上界缺失 | SEC-4.1+TOPK-7 | HIGH | ✅ **已修复** | quant_tiling_common.cpp:617-624 | | 3 | GetInputDesc 6处未判空 | SEC-3.5+TOPK-1 | HIGH | ✅ **已修复** | gmm_allto_allv_tiling.cpp:92-94,103-105,118-119,161-166,187-188 | | 4 | L0C CeilAlign 反弹 | TIL-2 | HIGH | ✅ **已修复** | gmm_qbmm_tiling.cpp:954-956 (CeilAlign→FloorAlign) | | 5 | transMmWeight 日志缺值 | MC2-07 | MED | ✅ **已修复** | gmm_allto_allv_tiling.cpp:232-235 | ## 修复验证详情 ### [SEC-4.1+TOPK-7] BsK == 0 校验修复 - **修复行号**: quant_grouped_mat_mul_allto_allv_tiling_common.cpp:637 - **修复内容**: (localParams_.BsK >= MAX_BSK_VALUE)(localParams_.BsK == 0) || (localParams_.BsK >= MAX_BSK_VALUE) - **验证**: ✅ 修复正确,与 H1/N1 检查模式保持一致(H1 == 0 || H1 >= MAX_H1_VALUE) ### [SEC-4.1+TOPK-7] send/recv 逐元素上界修复 - **修复行号**: quant_grouped_mat_mul_allto_allv_tiling_common.cpp:617-624 - **修复内容**: 仅 sendCounts[i] < 0sendCounts[i] < 0 || sendCounts[i] > static_cast<int64_t>(localParams_.A);同理 recvCounts 增加 > BsK 上界 - **验证**: ✅ 修复正确,与同类算子(allto_allv_grouped_mat_mul、allto_allv_quant_grouped_mat_mul)保持一致,且数学合理性已证明(总量+非负约束下逐元素上界是冗余但合理的防御性编程) ### [SEC-3.5+TOPK-1] GetInputDesc 判空修复 - **修复行号**: gmm_allto_allv_tiling.cpp:92-94, 103-105, 118-119, 161-166, 187-188 - **修复内容**: 所有 GetInputDesc/GetOptionalInputDesc/GetOutputDesc 调用先赋值到局部变量,再判空后解引用 - **验证**: ✅ 6处全部修复,无遗漏。模式为 auto desc = context_->GetXxxDesc(index); OP_TILING_CHECK(desc == nullptr, ...); localParams_.dtype = desc->GetDataType(); ### [TIL-2] FloorAlign 替代 CeilAlign 修复 - **修复行号**: gmm_qbmm_tiling.cpp:954-956 - **修复内容**: CeilAlign(basicTiling_.baseN, CUBE_BLOCK)FloorAlign(basicTiling_.baseN, CUBE_BLOCK) - **验证**: ✅ FloorAlign 向下对齐,确保 baseN ≤ maxBaseN,不再超过 L0C 限制 ### [MC2-07] transMmWeight 日志补值修复 - **修复行号**: gmm_allto_allv_tiling.cpp:232-235 - **修复内容**: "transMmWeight should not be true when mmX is null!""transMmWeight should not be true when mmX is null! transMmWeight=%d, hasSharedMm=%d.", *transMmWeightPtr, localParams_.hasSharedMm) - **验证**: ✅ 日志包含参数名和实际值,符合 MC2-07 要求 ## 需关注(MED 置信度 — 残余未修复) ### [MC2-19] send/recv 逐卡 per-rank 数据量校验缺失 - **问题描述**: 老代码 A3 架构验证每卡 ∑ recvCounts[j] * H∑ sendCounts[j] * H 的合理性,新代码无此校验。总量一致性已覆盖全局,但单卡数据量合理性(如 UB 容量是否足够)未校验。 - **影响**: A3 架构特有校验(A5 不执行),总量校验已覆盖全局一致性。属于增强型校验而非安全底线。 - **置信度**: MED (60-80%) - **备注**: 新代码已有 sendCounts[i] > ArecvCounts[i] > BsK 的逐元素上界,在总量+非负+逐元素上界三重约束下,per-card H-multiply sum 校验的数学必要性已降低 ### [MC2-18] HCCL InitV2/Finalize 核类型不匹配 - **问题描述**: HcclA2avOp.Init()hccl_.InitV2()hccl_.SetCcTilingV2() 在所有核上调用(无 AIC/AIV 过滤),但 HcclA2avOp.End()hccl_.Finalize() 仅在非 AIC 核上调用。HCCL 文档要求"Finalize 在 AIC 或 AIV 核上调用必须与对应 Prepare 接口的调用核保持一致"。 - **代码位置**: hccl_a2av_op.h:48-65 (Init) + 行 274-280 (End) - **影响**: 此代码不在 diff 变更范围内,属于预存设计模式。旧代码也存在此模式。需与 HCCL 框架团队确认是否为已知例外。 - **置信度**: MED (65%) ## 通过条例(持续通过 — 与上次检视一致) SEC-2.1 有符号整数运算不溢出 SEC-2.2 无符号整数运算不回绕 SEC-2.3 除法/余数运算除零保护(qbmm: DATA_SIZE_L0C=4 constexpr,baseM 上游保证非零) SEC-3.3 数组索引校验 TOPK-2 使用GetInputDesc获取Dtype,context获取Shape TOPK-5+MC2-08 属性获取类型需与ir原型一致 MC2-01 核间同步必要性(GmmA2avScheduler 循环内 compute→SyncAll<false>→hccl.Launch,同步完整) MC2-03 SyncAll 同步生效(所有核 SyncAll 总次数一致) MC2-04 全局操作一致性(无 rankId 分支导致参数差异) MC2-10 量化模式校验完整性(gqmm DEFAULT bug fix 正确) MC2-11 量化精度保护(无 Cast 在 diff 茦围围内) MC2-19 AlltoAllV 跨 rank 参数一致性(总量+逐元素约束下跨 rank 一致性通过) API-6 AllocTensor/FreeTensor 必须配对使用(委托模板框架管理) PERF-2 禁止写死硬件参数(新代码无硬编码,旧硬编码已删除) SEC-1.2 保证内存安全(引用绑定生命周期安全) SEC-3.1 禁止使用未初始化的变量(所有变量已初始化) GEN-1.1 外部数据合法性检查(通过 — BsK==0 已在基类修复) MC2-14 Tiling 校验与结构规范(通过 — BsK==0 修复、send/recv 上界修复、FloorAlign 修复) --- ## 被检视代码 > 本次检视的完整 diff 来自 PR #5704(更新版) **PR diff 文件路径**: ./operators/.pr_diff/5704_v2.diff **完整源码路径**: ./operators/.pr_repo/5704/ **代码概要路径**: ./operators/pr-5704/code_summary.md **diff 行数**:2704 行 See merge request: cann/ops-transformer!57046 天前