Closed
[Bug|算子缺陷][迭代加固]: aclnnSituMxQuant multithread 压测发现 是bug #582
Alice_zhouAdd on  1 day agoClosed at  1 day ago
Alice_zhouCollaborators
1 day ago Create

一、问题描述(必填)

  • 接口名:aclnnSituMxQuant;测试场景:multithread;压测日期:2026-11-13;执行卡号:0
  • 压测结果:总条数 100000 / 实际成功 97506 / 实际失败 2494
  • bug 判定:是bug(经 执行日志+plog+资料 三方交叉分析,详见判定依据)
  • 是否存在 aicore_error:是:kernel_name=SituMxQuant_fp16_e5m2_high_performance_0/1
  • 失败原因摘要:是bug:MT场景混合含BROADCAST(stride0)输入触发kernel SituMxQuant_fp16_e5m2 scalar地址越界aivec error(错误码271);md标注x/yOut/yScaleOut全部√支持非连续,broadcast构造合法;NC(2~5场景)干净仅MT新增场景复现

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

  1. 下载测试框架:https://gitcode.com/Alice_zhou/Vector_fuzz_cpp_testing/tree/main/turing_sec/aclnnAPI_fuzz/
  2. 环境准备(清除原有内容,将附件 cpp 放入对应目录下):
    rm -rf aclnnAPI_fuzz/src/op/*
    # 将附件 aclnnSituMxQuant_multithread.cpp 放入 aclnnAPI_fuzz/src/op_multithread/ 下
    
    (本场景 cpp 目录:aclnnAPI_fuzz/src/op_multithread/)
  3. 编译:
    cd aclnnAPI_fuzz/ ; make op_fuzz TARGET=multithread
    
  4. 执行:
    cd out ; ./aclnnAPI_fuzz_multithread 5 100000 0 5 0
    

三、附件与证据(必填)

💡 存在的问题(选填)
该问题由 fuzz 自动化压测平台发现(每日自动统计当天判定为 bug 的记录并提单);如需更多上下文(完整打屏日志/plog/覆盖度报告),请下载上方附件压缩件。

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

测试框架复核(F1~F7,aicore 前置门禁):通过

  • F4 kernel_name=SituMxQuant_fp16_e5m2_high_performance_0/1 归属本 API ✓
  • F5 基线:连续场景(normal 96.7%/non_contig 97.7%)无 aicore;仅 multithread 新增 BROADCAST(stride=0)场景触发 ✓
  • 构造合法性:md「非连续Tensor」列 x/yOut/yScaleOut 全√,broadcast-stride 属合法非连续布局

代码排查(ops-nn/quant/situ_mx_quant)

  1. aclnn 层(op_host/op_api/aclnn_situ_mx_quant.cpp GWS):未调用 l0op::Contiguous() 对非连续输入连续化(与 MoeFinalizeRoutingV3 全输入连续化形成对照)——非连续(含 broadcast stride=0)输入直接透传给 kernel
  2. kernel 入口(op_kernel/situ_mx_quant_apt.cpp:51):thin wrapper → arch35/situ_mx_quant_axis_last.h 模板内 GM→UB 搬运与量化计算
  3. 崩溃证据:errcode 271 "The address for scalar to access the internal buffer is out of bounds"(pc start 0x120052402b88),仅 broadcast(stride=0)布局触发

定位分析

  • broadcast 布局(某维 stride=0)输入直达 kernel,kernel 侧按 shape 推导的搬运/量化块参数与实际 stride 布局不匹配 → scalar 访问 UB 越界
  • 修复方向:① aclnn 层对 broadcast 布局输入调用 Contiguous() 物化;或 ② kernel/tiling 侧按 stride 语义处理 stride=0 维
  • 确切行需 core 现场(pc 0x120052402b88)比对 arch35 模板符号;已排查范围:aclnn GWS 无连续化调用、tiling 无非连续分支、kernel 入口与 arch35 模板结构

✅ 定性修正(2026-11-14,开发复核采纳 + 框架修复复测定谳)

结论修正:不是bug(测试框架 F1 索引有界性缺陷),本 issue 关闭。

开发复核(@guoqiuhao)确认的根因——测试框架缺陷而非算子缺陷:

  1. 框架 CreateAclTensorByScene(utils.h:290-304)按 storageShape 分配内存后仅将 hostData 连续拷贝到存储前部,未按 stride/offset 写入逻辑元素、未初始化剩余存储
  2. 实测附件佐证:case_4 expandedRowIdx viewShape=[128]/stride=[2]/storageShape=[256],hostData 大小=view 元素数(128),仅覆盖物理 0~127;视图读取 0、2、…、254,其中逻辑元素 64~127(物理 128~254)为未初始化存储——垃圾索引值进入 kernel 后形成与日志相符的 VEC UB 越界
  3. 原 F1~F7 复核遗漏点:仅核对了 hostData 值有界(全 1),未核对框架写入位置正确性与存储完整初始化

框架修复(已落地 turing_sec 与 turing_sec_card1 两实例 inc/utils/utils.h):

  • 按 stride/offset 将逻辑元素写入物理位置 + 全存储以 hostData[0] 初始化 + 标准连续布局快路径

修复后复测证据(Ascend 950 / CANN 9.3.0):

  • 本接口 non_contig 全量 10000 条:成功 9767 / 同步失败 0 / aicore_error 0(修复前:成功 1519、同步失败 8197 次 507035 vector core exception、全进程 aivec)
  • 1000 条快速复测:974/1000 成功、0 同步失败

同根因关联:#576(multithread 场景)与 #582(aclnnSituMxQuant multithread broadcast aicore)同为该框架缺陷所致,一并修正关闭;#582 复测(单接口目录 5000 条)4910/5000 成功、0 aivec、进程完整结束。

likedislike
AAlice_zhouCollaborators
1 day ago Modify description of issue
AAlice_zhouCollaborators
1 day ago Close issue
AAlice_zhouCollaborators
1 day ago Modify description of issue
AAlice_zhouCollaborators
9 hours ago Modify description of issue