Pull Request has been successfully merged by CANN-robot.
(Thank you for wangweidong's contribution.)变更摘要
本 PR 对 AccumulateNV2 算子进行验证整改,围绕功能缺陷修复、广播语义收回、死代码清理、性能优化与 golden 精度标准落位展开。核心是补齐 dtype/N 参数校验、将算子本体收敛为同 shape 强校验(广播对齐交由 aclnnSum 的 op_api 层 BroadcastTo 承担),并将 fp32 累加由 TwoSum 补偿改为与竞品同构的顺序求和,同时删除 tiling 中的广播死字段、将 fp16 非广播路径切换为 Vector 管线 half 累加,并新增 tests/assets/golden.py 落位 tolerance 标准。
主要改动
- 三层补齐 dtype 一致性校验:
aclnn_sum.cpp的CheckDtypeValid逐个校验tensors[i]与out的dtype;InferDataType4AccumulateNV2遍历输入校验与首个输入一致并处理输入数为 0;tiling 侧FillShapeInfo一并校验输入与输出 dtype,不一致即返回GRAPH_FAILED。 - 广播收回与同 shape 契约:
accumulate_nv2_infershape.cpp移除InferShape4Broadcast,改为校验N等于实际输入数并对每个输入逐维比对首输入 shape;accumulate_nv2_graph_infer.cpp删除MergeBroadcastShape/MergeBroadcastDim,FillShapeInfo删除广播 stride 计算并直接以首输入 shape 作为输出。 - fp32 极值求和改为 TF 同构顺序累加:
AccumulateNV2SimtKernel删除 TwoSum 补偿逻辑,改为N<=9左到右顺序累加、N>9余数优先 8 分块累加,复现 TFAddN舍入行为;kernel 收敛为 float 专用,删除GetBroadcastInputOffset与广播死分支。 - 死字段与死代码清理:
AccumulateNV2TilingData删除rank、needBroadcast、outputShape、inputStrides四个字段;accumulate_nv2.h中同步删除ACCUMULATE_NV2_SIMT_SHAPE_OFFSET/STRIDE_OFFSET及相关成员与初始化;删除测试test_accumulate_nv2_graph_infer_pass.cpp。 - fp16 路径与 golden 精度标准: fp16 非广播路径改为 Vector 管线 half 累加(UT 期望值由 2050 调整为 2048);新增
tests/assets/golden.py,分 kernel 直连(numpy 顺序 half 累加)与aclnnSum(fp32 promote)两条参考路径,并在TestSpec落位浮点cross_check/L1、整数binary_equal/L2 容差。
🧩 本次 Review 已使用自定义 Skill:


代码审查
审查结论
发现清单(4 项:P2 × 1,P3 × 3)
| # | 优先级 | 位置 | 问题 |
|---|---|---|---|
| 1 | P2 | op_host/accumulate_nv2_infershape.cpp:55-60 |
逐维 != 比较把未知维 -1 判为不一致,误拒动态 shape 图(原 InferShape4Broadcast 按通配合并) |
| 2 | P3 | op_graph/accumulate_nv2_graph_infer.cpp:59-62 |
V1 graph infer 同源缺陷:inputDims != outputDims 同样把 UNKNOWN_DIM(-1) 判为不一致 |
| 3 | P3 | op_graph/accumulate_nv2_graph_infer.cpp:80-100 |
新增的 dtype 一致性 / 同 shape / N 校验逻辑完全无 UT(原 op_graph UT 目录整体删除),错误闸门写反不会被任何用例拦住 |
| 4 | P3 | op_kernel/arch35/accumulate_nv2.h:143-145 |
fp16 空 tensor 由 SIMT 分支改落 vector 分支后,新可达路径下以 ubLength_==0 调用 InitBuffer |
逐文件审阅确认
math/accumulate_nv2/framework/CMakeLists.txt—— no issues(仅版权头与行尾换行)math/accumulate_nv2/op_api/aclnn_sum.cpp—— no issues(新增 dtype 一致性校验与docs/aclnnSum.md的「需与 out 数据类型相同」契约一致,循环与既有%lu用法一致)math/accumulate_nv2/op_graph/accumulate_nv2_graph_infer.cpp—— 见 finding 2、3math/accumulate_nv2/op_graph/accumulate_nv2_graph_infer.h—— no issues(删除不再需要的声明/头文件,仅被同目录 .cpp 引用)math/accumulate_nv2/op_host/accumulate_nv2_def.cpp—— no issues(opFile.value由accumulate_nv2_apt改为accumulate_nv2,与重命名后的op_kernel/accumulate_nv2.cpp及仓内其它算子的命名约定一致)math/accumulate_nv2/op_host/accumulate_nv2_infershape.cpp—— 见 finding 1math/accumulate_nv2/op_host/arch35/accumulate_nv2_tiling_arch35.cpp—— no issues(broadcast 收回后与算子本体同 shape 语义自洽,FillShapeInfo命名与调用同步更新;空 tensor 提前返回路径未在本次改动)math/accumulate_nv2/op_kernel/accumulate_nv2.cpp—— no issues(#ifndef UT_SOC_VERSION守护与 UT 自建 wrapper 的构建方式相符)math/accumulate_nv2/op_kernel/arch35/accumulate_nv2.h—— 见 finding 4(SIMT 分块(N≤9 顺序、r 优先 8 分块)覆盖区间完整、无重复/越界,逐条覆盖 N=10…40 均正确)math/accumulate_nv2/op_kernel/arch35/accumulate_nv2_tiling_data.h—— no issues(删字段后结构体 28→32B,全仓无残留引用)math/accumulate_nv2/tests/CMakeLists.txt—— no issues(仅头注释)math/accumulate_nv2/tests/assets/golden.py—— no issues(__golden__/__spec__/tolerance 结构符合仓内 mul_no_nan、sign 等既有约定;fp16 kernel 直连=numpy 顺序 half、aclnnSum=fp32 promote 与实现一致)math/accumulate_nv2/tests/ut/CMakeLists.txt—— no issuesmath/accumulate_nv2/tests/ut/op_api/CMakeLists.txt—— no issuesmath/accumulate_nv2/tests/ut/op_host/CMakeLists.txt—— no issuesmath/accumulate_nv2/tests/ut/op_host/arch35/CMakeLists.txt—— no issuesmath/accumulate_nv2/tests/ut/op_host/arch35/test_accumulate_nv2_tiling.cpp—— no issues(用例与「拒收 broadcast、同 shape 通过、N==输入数」的新语义一致)math/accumulate_nv2/tests/ut/op_host/test_accumulate_nv2_infershape.cpp—— no issues(期望值与新 infershape 一致)math/accumulate_nv2/tests/ut/op_kernel/CMakeLists.txt—— no issuesmath/accumulate_nv2/tests/ut/op_kernel/test_accumulate_nv2.cpp—— no issues(3.0/2048.0 等期望值与 SIMT 顺序求和、fp16 half 累加新语义一致)math/accumulate_nv2/tests/ut/op_graph/test_accumulate_nv2_graph_infer_pass.cpp(已删除)—— 覆盖缺口见 finding 3
总体风险判断
改动主体(broadcast 收回 + TF 同构 fp32 求和 + fp16 切 Vector 管线 + 三层 dtype/shape/N 校验 + golden 精度标准)在设计上自洽,算术语义与 TF accumulate_n… 竞品对齐,未发现 P0/P1 级构建或数据正确性问题。主要风险集中在形状校验对「未知维」的语义处理(动态 shape 图可能被误拒,finding 1/2,另有 tiling 与 infershape 对 rank-0 标量处理不一致但被 infershape 前置拦截,未单列)以及新增校验逻辑缺 UT 覆盖。建议合入前确认未知维(-1)的通配语义,并补齐 op_graph UT。
| 类型 | 数量 |
|---|---|
| 🔴 阻塞 | 0 |
| 🟡 建议 | 1 |
💬 仅评论
🧩 本次 Review 已使用自定义 Skill:


The MR can not be merged, because of CodeReview discussion not resolved
If you want to solve this problem, you can click here to do it in the FAQs.


概述
AccumulateNV2 算子验证整改全量提交(15 个 commit,基于 cann/ops-math master 干净分支,不含其他算子改动)。
修复内容
P1 功能缺陷
死代码清理(4e840cb20,-242 行)
性能优化(MTE bound 归一化后 NPU 优 A100 1.68x)
golden 精度标准(2b074c737、743c3606a)
文档(5c09ec3d0、4976fa638、fbd2dd9f2、72e543b8a)
验证(Ascend950PR / CANN 9.3.0)
关联的Issue
3870
测试
已通过对应算子的构建、UT 与 TTK 精度验证。
文档更新
包含相关 README / 接口文档更新。
类型标签