ascendc-algorithm-check
Tagline: AscendC 算法完整性与数学不变量检查
Triggers:
- 当
cake-code-review主 skill 进入 Phase 3(Algorithm Correctness Check)时自动调用 - User 明确说"检查算法是否写完整"、"检查数学不变量"时独立使用
1. Introduction
ascendc-algorithm-check 负责检查 AscendC 算子实现是否覆盖了算法级必需步骤,而不是只看 API 使用或结构安全。
本阶段负责:
- 归一化链是否完整
- 分母安全和关键数学不变量是否建立并被消费
- 迭代算法的状态更新是否完整
- 归约结果是否被后续逻辑一致消费
本阶段不负责:
- API 黑名单和最佳实践 dispatch(交给 API precheck)
- 红线/安全/结构问题扫描(交给
ascendc-review.md) - 编译、UT、ST 执行(交给
ascendc-verify.md) - 更深数值参考对比、精度分析、性能评估(交给
ascendc-evaluation)
2. Check Categories
2.1 Normalization-chain completeness
检查 max/sub -> exp -> reduce-sum -> divide/scale 或同类归一化链是否缺步骤、跳步骤、错消费。
常见信号:
- 已计算稳定化偏移,但后续未做归一化
- 已做
ReduceSum,但结果未参与 divide/scale - 只做了局部 tile 归一化,未完成全局合并
示例:
- Softmax:
ReduceMax和Exp存在,但ReduceSum结果没有被最终输出消费
2.2 Denominator safety and invariants
检查分母是否来自已建立的不变量,以及这些不变量是否在代码或文档中闭环。
常见信号:
- 分母来自归约结果,但看不到
> 0、finite、non-empty 等前提建立点 - 分母 guard 和算法前提相互矛盾
- 仅在 verify 阶段期待测试发现分母问题
示例:
- Softmax/SinkhornKnopp 中的 sum/norm 必须来自前序有效归约,而不是默认假设永远合法
2.3 Iterative update completeness
检查迭代算法是否遗漏状态刷新、双边更新、收敛变量维护、buffer 切换、残差回写。
常见信号:
- 循环里只更新一侧状态,另一侧更新缺失
- 迭代次数变量存在,但核心 update 没有落地
- 新旧状态比较、收敛判断、swap/copy 回写不完整
示例:
- SinkhornKnopp: row/col scaling 其中一条更新链缺失,导致迭代只执行半步
2.4 Reduction result consumption consistency
检查归约结果在所有使用路径上是否被一致读取、广播、回写和复用。
常见信号:
ReduceSum/ReduceMax写入临时 tensor 但后续未读取- 不同 branch 对同一归约结果消费方式不同
- 只消费 tile 局部结果,遗漏跨 tile 合并结果
2.5 End-to-end algorithm closure
检查输入假设、核心计算、输出约束是否形成完整闭环。
常见信号:
- 中间量已算出,但最终输出少一步恢复或投影
- 文档声明支持某种数学约束,代码路径未体现
- 重要中间变量存在但与最终结果断链
3. Review Procedure
- 识别算子属于单步归一化、迭代归一化、规约-广播、投影/校正中的哪一类
- 画出最小算法链: 输入 -> 中间不变量 -> 归约/更新 -> 输出
- 对照源码确认每个必要步骤都有实现和消费点
- 记录缺失步骤、断链点、被破坏的不变量
- 以 issue 列表输出给
ascendc-fix.md
4. Output Format
JSON issue format
{
"id": "ALG-01",
"rule": "Algorithm Correctness Check - normalization-chain completeness",
"severity": "P1",
"location": "op_kernel/example.h:210-248",
"code_snippet": "ReduceSum(sumBuf, expBuf, tmp, nt);",
"description": "已生成归一化分母,但结果未被最终 divide/scale 消费,算法链在输出前断开",
"fix_suggestion": "补齐 reduce result 的读取与 divide/scale 消费路径,保持归一化链闭环"
}
Markdown report fragment
### ALG-01: 归一化链不完整
**严重性**: P1 - 严重
**违反规范**: Algorithm Correctness Check - normalization-chain completeness
**代码位置**: `op_kernel/example.h:210-248`
#### 问题分析
- 已完成稳定化和指数变换
- 已生成分母归约结果
- 最终输出没有消费该分母,归一化链断开
#### 修复建议
- 补齐 reduce result 的读取和 divide/scale
- 若分母依赖前序不变量,在生成点或消费点显式说明约束
5. Common Findings
-
只做一半归一化链
- 例如只做到
Exp或只做到ReduceSum
- 例如只做到
-
把分母安全问题推迟到 verify
- verify 只能证明编译/UT/ST 结果,不能替代算法推理
-
迭代算法缺半步更新
- 常见于 row/col、left/right、old/new 双缓冲切换不完整
-
归约结果产生后无人消费
- 临时 tensor 正确生成,但算法结果仍走旧路径
6. Known Limitations
- 本阶段依赖源码和文档推理,无法替代完整数值评估
- 若算法定义本身不清晰,需要结合算子文档或设计说明判断
- 若需要 reference 数值比对或精度分析,转到
ascendc-evaluation