Closed
[Documentation|文档反馈]: aclnnUnfoldGrad 文档把 4 类几何入参违规归入 561002,但 aclnn 层实际先返回 161002 #3827
liuhanwen8Add on 20 days agoClosed at 15 days ago
20 days ago Added label: documentation
liuhanwen8
20 days ago Comments:
20 days ago Comments:
拆自 #3797(原 4 项汇总单已关闭)。本单为其拆分项之一,详见 #3797 的拆分说明。


陈思
19 days ago Comments:
19 days ago Comments:
您好,感谢反馈!
问题分析
核对 cann/ops-math 固定提交 b19eaee4f58e5e1e3cb3b2ecbfed2d02c11c820a 的 CheckParams 与主调用流程 后,确认 inputSizes 长度不符、size<=0、step<=0,以及未通过实际 dim 边界检查的参数,会在 API 前置校验中返回 ACLNN_ERR_PARAM_INVALID(161002)。GetWorkspaceSize 随即返回,尚未进入后面的 l0op::UnfoldGrad 调用。文档错误码表 将这些情形统一归入 561002,与当前控制流不一致。
其中 dim 需要保留一个区别:当前代码只检查 0 <= dim < gradOut维数-1,没有完整实施文档中的“最后两个轴”限制。因此,不能把所有违反该文档限制的 dim 都说成已返回 161002;这部分行为缺口仍由 #3795 跟踪。
处理方向
可以按实际拦截阶段修订错误码表:将上述已由 API 拦截的非法参数列入 161002;对仅由 tiling 形状检查 拦截的窗口尺寸关系,另行核对最终公开返回码后填写。size>inputSizes[dim] 在该基线也没有独立的显式判断,不能与 size<=0 的直接返回路径混为一项。这样能让调用方区分入参错误与后续 tiling 失败。我们会继续确认文档与实际校验边界。


19 days ago Assign chensi79 as responsible person
19 days ago Added label: pending-confirmation
19 days ago Removed label: pending-confirmation
19 days ago Assign yue-ma as responsible person, remove original responsible person: chensi79
19 days ago Added label: pending-confirmation
16 days ago Removed label: pending-confirmation
tangkaidi
15 days ago Comments:
15 days ago Comments:
你好,感谢你的关注和反馈。
当前issue内提及的问题已经确认,将会尽快合入代码。
修复PR:https://gitcode.com/cann/ops-math/pull/6717


15 days ago Close issue
14 days ago Added label: resolved
问题描述
aclnnUnfoldGrad文档错误码表把 5 类约束统一归到561002(ACLNN_ERR_INNER_TILING_ERROR),但其中至少 4 类在实际调用链上根本到不了 tiling——aclnnUnfoldGradGetWorkspaceSize的CheckParams会先将其拦截并返回161002(ACLNN_ERR_PARAM_INVALID)。文档承诺的错误码与代码路径不符。位置:
conversion/unfold_grad/docs/aclnnUnfoldGrad.md:214(561002,rowspan="5")conversion/unfold_grad/op_api/aclnn_unfold_grad.cpp:118-138(CheckParams)conversion/unfold_grad/op_host/unfold_grad_tiling.cpp:211-242逐项对照
文档在
561002下共列 5 项,逐项追踪实际返回路径:561002的约束gradOut第dim维 ≠(inputSizes[dim]-size)/step+1gradOut的 size ≠inputSizes的 size+1:84-88)161002size≤ 0:130的size > 0)161002size>inputSizes第dim维step≤ 0:132的step > 0)161002dim≠len(inputSizes)-1且 ≠len(inputSizes)-2:128)161002¹ 第 1 项确实只由 tiling 校验(
:230-235),但 tiling 返回ge::GRAPH_FAILED后,框架最终映射到哪个公开错误码,需沿调用链确认,不能仅凭 tiling 日志推断。² 全仓无
size > inputSizes[dim]的显式判断(grep无命中)。size偏大时只能由 tiling:230-236的公式gradOutSizeDim != (inputSizeArray[dim] - size) / step + 1间接拦下,故其返回路径与第 1 项相同。这一点另见第 2 单(末维约束)的同源核对。关键代码顺序
// op_api/aclnn_unfold_grad.cpp:118 先跑 CheckParams static aclnnStatus CheckParams(...) { CHECK_RET(CheckNotNull(gradOut, inputSizes, gradIn), ACLNN_ERR_INNER_NULLPTR); CHECK_RET(CheckDtypeValid(gradOut, gradIn), ACLNN_ERR_PARAM_INVALID); CHECK_RET(CheckShapeValid(gradOut, inputSizes, gradIn), ACLNN_ERR_PARAM_INVALID); // <- 第 2 项在此拦截 int64_t dimNum = gradOut->GetViewShape().GetDimNum(); CHECK_RET(dim >= 0 && dim < dimNum - 1, ACLNN_ERR_PARAM_INVALID); // <- 第 5 项 CHECK_RET(size > 0, ACLNN_ERR_PARAM_INVALID); // <- 第 3 项 CHECK_RET(step > 0, ACLNN_ERR_PARAM_INVALID); // <- 第 4 项 CHECK_RET(CheckFormat(gradOut), ACLNN_ERR_PARAM_INVALID); return ACLNN_SUCCESS; } // 主流程 :152 CheckParams 通过后才可能进入 tiling auto ret = CheckParams(gradOut, inputSizes, dim, size, step, gradIn); CHECK_RET(ret == ACLNN_SUCCESS, ret);CheckParams里的CHECK_RET一旦失败即刻return,tiling 不会被调用。因此文档把这几类归到561002(tiling 内部错误)与代码实际控制流直接矛盾。CheckShapeValid中对应第 2 项的实际校验// :84-88 OP_CHECK(inputSizes->Size() == gradOutDimNum - 1, OP_LOGE(ACLNN_ERR_PARAM_INVALID, "inputSizes length should be equal to Dim of gradOut - 1, but got %zu.", inputSizes->Size()), return false);OP_CHECK失败 → 返回false→CheckParams返回ACLNN_ERR_PARAM_INVALID(161002)。影响
调用方按文档错误码表做分类处理时,会走进错误分支:
561002内部 tiling 异常」,调用方据此判定为算子内部故障并上报/重试;size/step/dim/inputSizes长度,返回161002(参数错误),本应直接修正入参。同一族「几何参数非法」被文档归入内部错误码,会把用户侧入参错误误判为算子缺陷,误导排查方向。
环境信息
cann/ops-mathHEAD3e45432d(2026-10-21)aclnnUnfoldGrad(conversion/unfold_grad)重现步骤
静态核对,无需编译运行:
# 1. 文档把 5 项都归到 561002 sed -n '214,228p' conversion/unfold_grad/docs/aclnnUnfoldGrad.md # 2. aclnn 层在其之前就拦掉 4 项,返回 161002 sed -n '118,138p' conversion/unfold_grad/op_api/aclnn_unfold_grad.cpp # 3. tiling 只在 CheckParams 通过后才执行 sed -n '150,155p' conversion/unfold_grad/op_api/aclnn_unfold_grad.cpp真机验证(如需确认第 1 项的公开返回码):
// 构造 gradOut 第 dim 维与公式不符,其余参数全部合法 // 使 size/step/dim/inputSizes 长度均通过 aclnn 前置校验 // 只违反「gradOut 第 dim 维 == (inputSizes[dim]-size)/step+1」 aclnnStatus ret = aclnnUnfoldGradGetWorkspaceSize(gradOut, inputSizes, dim, size, step, gradIn, ...); // 记录 ret,对照文档承诺的 561002预期结果
二者择一:
方案 A(推荐,改文档):按实际控制流拆分错误码归属——
size ≤ 0、step ≤ 0、dim越界、inputSizes长度 ≠gradOut维数-1 → 移入161002;gradOut第dim维不等于(inputSizes[dim]-size)/step+1保留在561002(并核实实际公开返回码后填写准确值)。方案 B(改实现):若设计上确应统一为
561002,则需调整CheckParams中size/step/dim/ 形状校验的返回码,使其与文档一致。无论选哪个方向,都需在文档中说明「前置校验(161002)」与「tiling 校验」的分界。
备注
与 #3797 的关系
本单拆自
#3797。按维护者分类口径,本项对应「tiling 与 API 返回码口径」,是 4 项中唯一涉及实现在位差异的一项,单独跟踪。与 #3795 的边界
#3795已覆盖dim的上界校验缺失(len(inputSizes)=3时dim=0被放行)。本单不重复报告该校验缺失,只指出文档错误码归属与代码控制流不符;即使#3795修复了dim双轴校验,本单的「归属错误」依然成立(修复后dim越界仍返回161002,而非文档写的561002)。未纳入本单的推断
原始汇总单
#3797曾描述「形状类违规实测返回561103」。经复核:561103(ACLNN_ERR_INNER_NULLPTR)对应空指针路径,而本算子 aclnn 层CheckNotNull失败返回的正是ACLNN_ERR_INNER_NULLPTR(该行为已由#3795单列);561002在整个conversion/目录中无任何引用,综上该「实测」结论缺乏依据,本单不予采用,改为按代码控制流陈述,并把 tiling 映射结果列为待确认。涉及文件
conversion/unfold_grad/docs/aclnnUnfoldGrad.md(错误码表,:214-229)conversion/unfold_grad/op_api/aclnn_unfold_grad.cpp(CheckParams,:118-138)conversion/unfold_grad/op_host/unfold_grad_tiling.cpp(:211-242)