Closed
[Bug-Report|缺陷反馈]: aclnnCat / aclnnChunkCat 空 TensorList 零退分支返回 ACLNN_SUCCESS 未写 *workspaceSize #3554
liuhanwen8Add on 28 days agoClosed at 27 days ago
28 days ago Added label: bug-report
陈思
28 days ago Comments:
28 days ago Comments:
您好,感谢反馈!
核查 cann/ops-math master 8f1aae7e1927 的 Cat 和 ChunkCat 实现,两处空列表成功分支确实仅释放 executor 所有权后返回,未写入 *workspaceSize;正常路径则会写入执行器计算出的大小。这可以解释您观察到的成功返回后哨兵值保持不变。
Cat 的触发范围还包括 EraseDim1EmptyTensor 将所有一维空 Tensor 过滤后得到空列表的情况,不仅是原始列表长度为 0。ChunkCat 的该分支位于 dim、numChunks 和列表指针检查之后,需要保留这些已有的非法参数返回行为。
一个直接的处理方向是在两处空列表成功返回前写入 *workspaceSize = 0,保留 executor 的交接,并以非零哨兵覆盖原始空列表及 Cat 过滤后为空两条路径。这项修改解决的是 workspace 出参未定义,与 #3555 的输出形状校验问题需分别处理。我们会持续跟踪。


tangkaidi
27 days ago Comments:
27 days ago Comments:
您好,感谢您的关注和反馈!
当前代码确实存在issue中存在的问题,aclnn_cat.cpp 与 aclnn_chunk_cat.cpp均无入参为空时对workspaceSize的赋值为0操作。
将会尽快合入代码,修复此问题。


27 days ago Close issue
26 days ago Added label: resolved
现象
aclnnCatGetWorkspaceSize/aclnnChunkCatGetWorkspaceSize在「入参为空 TensorList」的零退分支上,函数返回ACLNN_SUCCESS但没有写入出参*workspaceSize,导致该成功路径下调用方读到的是未初始化值。代码位置
conversion/concat_d/op_api/aclnn_cat.cpp(aclnnCatGetWorkspaceSize,当前 master):if (tensorList != nullptr && tensorList->Size() == 0) { uniqueExecutor.ReleaseTo(executor); return ACLNN_SUCCESS; // <- 未写 *workspaceSize } ... *workspaceSize = uniqueExecutor->GetWorkspaceSize(); // 其它成功路径均写入 uniqueExecutor.ReleaseTo(executor); return ACLNN_SUCCESS;conversion/chunk_cat/op_api/aclnn_chunk_cat.cpp(aclnnChunkCatGetWorkspaceSize,当前 master)同型:if (tensors->Size() == 0) { uniqueExecutor.ReleaseTo(executor); return ACLNN_SUCCESS; // <- 未写 *workspaceSize } ... *workspaceSize = uniqueExecutor->GetWorkspaceSize(); // 其它成功路径均写入两处零退分支在成功返回前缺少
*workspaceSize = 0;。同一目录下其余零退分支(正常路径及其它空 tensor 分支)均先写*workspaceSize再返回,此处属遗漏、并非有意让渡。影响
GetWorkspaceSize成功返回时应给出 workspace 大小。调用方若按常见写法uint64_t workspaceSize;(未初始化)声明,再if (workspaceSize > 0) aclrtMalloc(...),则命中空 TensorList 路径时会读取未初始化值:aclrtMalloc大概率失败,本应成功的空算子被误判为运行时错误;(workspace, workspaceSize),属未定义行为。ReleaseTo已执行)。复现(宿主机侧,无需设备执行空路径)
环境:CANN 9.2.0-beta.2,
libopapi_math.so内含aclnnCatGetWorkspaceSize/aclnnChunkCatGetWorkspaceSize符号。以
aclCreateTensorList(nullptr, 0)构造空列表,workspaceSize预置为哨兵值,直接调用:即两个接口都在成功返回(rc=0)的同时保持
workspaceSize原值不变,与源码漏写一致;dim!=0 → 161002的对照排除了「库未执行」的可能。期望行为
空 TensorList 零退成功路径也应写入
*workspaceSize = 0(与同仓其它零退路径对齐),保证任意成功返回后调用方都能读到确定的 workspace 大小。修复建议
aclnn_cat.cpp与aclnn_chunk_cat.cpp的两处零退分支,在ReleaseTo(executor)之前补*workspaceSize = 0;。环境