Pull Request has been successfully merged by CANN-robot.
(Thank you for wangweidong's contribution.)变更摘要
本次变更针对 Cumsum 整数 Tiling 路径在空 Tensor(任一维度为 0)场景下出现除零、非法分核与非法 tiling 的问题,在算子侧补充了兜底处理:在 GetInputDims() 之后由 Cumsum4IntTiling::CalcTilingData() 检测轴向切分长度是否为 0,并提前下发新的整数空 Tensor tilingKey CUM_EMPTY(11003)、blockDim=1 与 workspace=0;kernel 侧新增该 key 的立即返回分支,并将整数 tiling 成员统一初始化为 0,以保证空分支序列化数据的确定性。同时补充了覆盖多数据类型与多个 axis 位置的空 Tensor UT。
主要改动
- 新增空 Tensor tilingKey
11003: 在 host 侧常量区新增CUM_EMPTY = 11003,并注册Cumsum_11003对应的Cum4IntTilingData,kernel 侧同步定义同名宏CUM_EMPTY。 - 空 Tensor 提前返回:
Cumsum4IntTiling::CalcTilingData()在获取输入维度信息后判断leftAxisLen、midAxisLen、rightAxisLen任一为 0,即设置tilingKey_ = CUM_EMPTY、usedCoreCnt_ = 1并直接返回成功,跳过GetAxisLpUnit()、GetMCTilingInfo()等后续切分计算。 - kernel 空分支:
cumsumSimdInt()中新增TILING_KEY_IS(CUM_EMPTY)判断,通过GET_TILING_DATA_WITH_STRUCT读取Cum4IntTilingData后立即返回,不做任何 GM 访问或计算,同时保证 opc 可推导该 key 的 tiling 数据大小。 - tiling 成员确定性初始化: 将
Cumsum4IntTiling中tilingKey_、isExclusive_、usedCoreCnt_、laLpUnit_、rLpUnit_、raLpUnit_等全部整型成员改为{0}默认初始化,避免空分支序列化未定义值。 - 新增空 Tensor UT: 在
test_cumsum_tiling.cpp中新增用例,覆盖int32/int64/uint8与 axis 为 0/3/5(对应 0 维位于前、中、后)的组合,校验tilingKey=11003、blockNum=1、workspaceSizes[0]=0。
🧩 本次 Review 已使用自定义 Skill:


代码审查
审查结论
逐文件审查结果
math/cumsum/op_host/arch35/cumsum_tiling_ascendc_int_arch35.cpp:已审查。CalcTilingData中在GetInputDims()之后新增的leftAxisLen/midAxisLen/rightAxisLen == 0早返回位置正确,位于所有除 0 / 非法分核点(GetAxisLpUnit、GetMCTilingInfo、CalcTilingKey)之前;三条轴通路(axis 在前/中/后)均能被该条件覆盖,usedCoreCnt_=1与WriteTilingData的SetBlockDim/SetTilingKey/workspace=0 语义自洽 — no issues。math/cumsum/op_host/arch35/cumsum_tiling_ascendc_int_arch35.h:已审查。新增CUM_EMPTY=11003、REGISTER_TILING_DATA_CLASS(Cumsum_11003, ...)与 tiling data 结构字段一一对应;成员改为{0}初始化后逐项核对,非空路径仍会赋值全部 18 个成员,不改变原有序列化语义,仅使空 Tensor 分支数据确定 — no issues。math/cumsum/op_kernel/cumsum_apt.cpp:已审查。CUM_EMPTYkey 与 host 一致,空分支不做任何 GM 访问,放于cumsumSimdInt分派链首正确;发现 2 项问题(P2 修复单侧化未覆盖浮点通路、P3 未使用变量告警风险)。math/cumsum/tests/ut/op_host/arch35/test_cumsum_tiling.cpp:已审查。新增用例的{1,2,3,0,4,5}× axis {0,3,5} 确实分别命中rightAxisLen=0、midAxisLen=0、leftAxisLen=0三条分支,断言 tilingKey=11003 / blockDim=1 / workspace=0 与实现一致,SCOPED_TRACE亦能区分失败组合 — no issues。
问题统计:P0 0 项,P1 0 项,P2 1 项,P3 1 项。
整体风险判断:整数通路的除零兜底本身实现正确、放置合理、UT 覆盖到位,不会引入回归;主要风险是本修复对空 Tensor 的处理呈现“单侧化”——仅整数 kernel 分支获得 empty key,浮点/半精度 AICore 通路(cumsumSimd 及浮点 tiling)未同步,在 TTK/GE direct 直调下可能残留同类除零风险,建议确认后补齐或明确说明已由其他机制覆盖。
| 类型 | 数量 |
|---|---|
| 🔴 阻塞 | 0 |
| 🟡 建议 | 1 |
💬 仅评论
🧩 本次 Review 已使用自定义 Skill:


Thanks for your pull-request.
The full list of commands accepted by me can be found at here.
You can get sig-info at here.
You can self-configure the PR merge rules for this repository. For more details, please refer to Here.
For more, you also can visit HICANN.
PR Approval Progress
✅ Congratulations! All modules have met the lgtm and approve requirements.
Module Approval Details
| module | lgtm status | approve status |
|---|---|---|
| math/cumsum | ✅ 顾宝成, 周奇龙 (2/2) | ✅ 周奇龙, 顾宝成 (2/1) |
💡 Tip:
- Committer can comment
/approveor/lgtm- Commenting
/approveimplies both code review (lgtm) and intent to merge (approve)
CLA Signature Pass
gcw_YBIAEfqJ, thanks for your pull request. All authors of the commits have signed the CLA. 👍


🟡 Medium Priority
变更点:cumsum_apt.cpp 在 cumsumSimdInt 中新增 TILING_KEY_IS(CUM_EMPTY) 空 Tensor 分支(186-189 行),配套的 tiling 兜底只加在 Cumsum4IntTiling::CalcTilingData(host 331 行)。
问题链条:本 PR 的背景说明中确认“ACLNN 通路已有 self->IsEmpty() 早返回,但 TTK kernel/GE direct 会直接进入 tiling”,因此空 Tensor 的兜底必须由算子自身在 所有 AICore 通路上完成。然而同文件的兄弟函数 cumsumSimd(half/float/bfloat16,处理 1001/1002/1011/1012/1101/1102/1111/1112/3011/3012/3112 等 key)完全没有 CUM_EMPTY 分支,host 侧的浮点 tiling 也不在本 diff 的改动范围内(只改了 cumsum_tiling_ascendc_int_arch35.*)。
失效模式:当 half/float/bfloat16 的空 Tensor 走 TTK direct(tests/st/arch35/ttk_kernel_cumsum_st.csv 这类直调)或 GE direct(不经过 ACLNN 的 IsEmpty 早返回)时,浮点 tiling 仍按原始逻辑计算,rightAxisLen/leftAxisLen/midAxisLen 为 0 会重演本 PR 描述的除 0(SIGFPE)或非法分核,kernel 侧也没有 any key 可退化为空实现 —— 即整数通路已修、浮点通路保持旧形态,两条路径的处理约定出现分歧。
建议:先确认浮点 tiling(cumsum_tiling_ascendc_arch35.cpp)是否已有空 Tensor 早返回;若没有,则在浮点/半精度 tiling 中同样下发 empty tilingKey,并在 cumsumSimd 中增加对应的空分支早返回,保持两条通路的约定一致,同时补 float 空 Tensor 的 UT/ST 用例。


compile


| 🚀 CI 流水线已启动 |
|---|
| 📋 执行详情: 点击查看流水线 |


/lgtm
/approve
by agent


您好,PR已满足合入指标,请尽快联系Committer进行合入。如暂时不需要合入,请在PR标题前加[WIP]


The following label is not ready.
ci-pipeline-passed: The ci-pipeline-passed label is expired as added over 72 hours. Please use /compile to recompile.


compile


| 🚀 CI 流水线已启动 |
|---|
| 📋 执行详情: 点击查看流水线 |


问题描述
Cumsum 整数 tiling 未处理空 Tensor。当任一维度为 0 时,根据 0 维位于 axis 的前/中/后位置,
leftAxisLen、midAxisLen或rightAxisLen会变为 0,后续进入如下路径:rightAxisLen=0:vlSize_ / (raLpUnit_ * dtypeSize)触发除 0(SIGFPE);midAxisLen=0:rLpUnit_=0,后续产生非法分核;leftAxisLen=0:laLpCnt=0,CeilDiv(0, CeilDiv(0, coreNum))产生非法 tiling。ACLNN 通路已有
self->IsEmpty()早返回,但 TTK kernel/GE direct 会直接进入整数 tiling,因此仍需算子侧兜底。修改内容
11003;GetInputDims()后检测leftAxisLen/midAxisLen/rightAxisLen == 0,下发blockDim=1/key=11003/workspace=0;GET_TILING_DATA_WITH_STRUCT注册 tiling struct size 后立即返回,不访问 GM;关联的Issue
https://gitcode.com/cann/ops-math/issues/4634
验证结果
perf_status=PASS;[105,2239]:axis0 key=11000/blockDim=35、axis1 key=11001/blockDim=53,precision 2/2 PASS;git diff --check通过。