Open
[Bug|算子缺陷][迭代加固]: aclnnGatherV3 GetWorkspaceSize宿主侧死循环(8D self+2D index构造9D out时100%CPU挂起,应报161002拒绝) #589
Alice_zhouAdd on  1 day ago
Alice_zhouCollaborators
1 day ago Create

一、问题描述(必填)

  • 接口名:aclnnGatherV3;测试场景:normal;压测日期:2026-11-13;执行卡号:1(Ascend 950 / CANN 9.3.0)
  • 压测结果:DT 空间穷尽 168 条 / 成功 167 / 挂起 1(case_168)
  • bug 判定:是bug(GWS 宿主侧死循环——超限维度组合应被 161002 快速拒绝,实际 100% CPU 挂起 39+ 分钟无返回)
  • 复现参数:self=FLOAT16 shape=[2,2,2,2,46,2,112,2](8D);index=INT64 shape=[2,2](2D);out=FLOAT16 shape=[2,2,2,2,2,46,2,112,2](9D);dim=0;batchDims=0;mode=1
  • 现象:aclnnGatherV3GetWorkspaceSize 调用后进程 100% CPU 持续 39 分钟以上,无返回码、无内核下发、无报错日志
  • 预期:out 维度数 9 超过 acl 维度上限 8,应立即返回 161002(ACLNN_ERR_PARAM_INVALID)拒绝

二、问题复现步骤(必填)

  1. 下载测试框架:https://gitcode.com/Alice_zhou/Vector_fuzz_cpp_testing/tree/main/turing_sec/aclnnAPI_fuzz/
  2. 环境准备:rm -rf aclnnAPI_fuzz/src/op/* ;将附件 aclnnGatherV3.cpp 放入 aclnnAPI_fuzz/src/op/ 下
  3. 编译:cd aclnnAPI_fuzz/ ; make op_fuzz
  4. 执行:cd out ; export LD_LIBRARY_PATH=/usr/local/Ascend/ascend-toolkit/latest/x86_64-linux/lib64:$LD_LIBRARY_PATH ; ./aclnnAPI_fuzz aclnnGatherV3_fuzz 1000
    (DT 序列确定性:第 168 条用例为上述参数组合,观察进程 100% CPU 挂起;可用 gdb attach 观察宿主栈)

三、附件与证据(必填)

💡 该问题由 fuzz 自动化压测平台发现;如需更多上下文请下载上方附件压缩件。

🔍 代码bug点定位(2026-11-13,结合 ops-* git 仓源码复核)

测试框架复核(F1~F7):通过(构造参数为 md 记载的合法类型;self 8D/index 2D 均在 rank≤8 上限内)

代码排查(ops-nn/index/gather_v2/op_api/aclnn_gather_v3.cpp)

  1. CheckShape(:133-163)首行即有 OP_CHECK_MAX_DIM(self, MAX_DIM_LEN) 与 OP_CHECK_MAX_DIM(index, MAX_DIM_LEN, ...) —— HEAD 源码对 self/index rank>8 有显式拦截,预期返回 161002
  2. CheckOutShape(:89-131)按 dim/batchDims 推导 out.shape(8D self+2D index → 9D out),尾部 OP_CHECK_SHAPE_NOT_EQUAL_WITH_EXPECTED_SIZE 校验
  3. GWS(:226-244):L2_DFX_PHASE_1 → CREATE_EXECUTOR → CheckParams → Contiguous 链

定位分析

  • 复现参数(self 8D + index 2D + dim=0/batchDims=0 → out 9D)通过 fuzz 传入后,GWS 在 HEAD 源码路径应被 CheckShape 的 MAX_DIM 拦截快速拒绝;实际压测二进制(CANN 9.3.0)表现为 100% CPU 宿主死循环 39+ 分钟无返回
  • 版本差异结论:压测环境二进制的维度校验早于/区别于仓内 HEAD 实现(或 out rank 推导路径存在无界循环)——当前源码 HEAD 已含 MAX_DIM 拦截(与预期拒绝行为一致),压测二进制为旧版/差异版实现
  • 建议:① 升级到含 HEAD 修复的二进制后复测闭环;② 若复现于新版本,gdb attach 挂起进程取宿主栈(疑点:CheckOutShape 的 Shape AppendDim 循环或闭源 l0 shape 推导),核对 aclnn_gather_v3.cpp:133-163 与二进制行为差异
  • 已排查范围:op_api CheckShape/CheckOutShape/CheckDimAndBatchdims/CheckParams/GWS 全链;未排查:闭源 l0op Contiguous/executor 内部(需挂起栈)
likedislike
AAlice_zhouCollaborators
10 hours ago Modify description of issue