| 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] < 0 → sendCounts[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] > A 和 recvCounts[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!5704 | 6 天前 |