已关闭
[Bug-Report|缺陷反馈]: aclnnQuantBatchMatmulInplaceAdd 空 Tensor 行为与文档不一致,m=0/n=0 快速返回分支不可达 #4145
chenjiayi_创建于  7月17日关闭于  8月14日
chenjiayi_
chenjiayi_成员
7月17日 创建

Thanks for sending an issue! Please fill in the following template to help quickly solve your problem.

Describe the current behavior / 问题描述 (Mandatory / 必填)

aclnnQuantBatchMatmulInplaceAddm=0n=0 空 Tensor 的接口行为与文档不一致,并且代码中已有的空 Tensor 快速返回分支实际不可达。

接口文档在 docs/aclnnQuantBatchMatmulInplaceAdd.md 中说明:

当输入 x1 为 m=0 的空 tensor 或 x2 为 n=0 的空 tensor 时,输出为空 tensor。

但当前实现的调用顺序为:

  1. aclnnQuantBatchMatmulInplaceAddGetWorkspaceSizeCommon() 先调用 InferGroupSize()
  2. 随后调用 CheckParams()
  3. CheckParams() 调用 CheckShape()
  4. CheckShape() 调用 CheckMKN()
  5. CheckMKN()m <= 0n <= 0 直接返回失败;
  6. 直到上述校验全部通过后,代码才检查 inputSizeM == 0 || inputSizeN == 0 并返回 ACLNN_SUCCESS

因此:

  • HIFLOAT8 场景会在 CheckMKN() 中返回 ACLNN_ERR_PARAM_INVALID
  • MX 场景还可能更早在 InferGroupSize()ReCalcGroupSize() 中,因为空维对应的 scaleSize 为 0 而返回失败;
  • aclnnQuantBatchMatmulInplaceAddGetWorkspaceSizeCommon() 中现有的空 Tensor 成功分支无法处理文档描述的输入。

另外,文档错误码表又将 x1、x2、x2Scale、yRef 为空 Tensor 列为 ACLNN_ERR_PARAM_INVALID,与同一文档前文的空 Tensor 支持说明也存在矛盾。

相关位置:

  • 文档空 Tensor 支持说明:docs/aclnnQuantBatchMatmulInplaceAdd.md:139
  • CheckMKN() 拒绝 m/n 为 0:op_api/aclnn_quant_batch_matmul_inplace_add.cpp:186-203
  • CheckShape() 调用 CheckMKN()op_api/aclnn_quant_batch_matmul_inplace_add.cpp:381-400
  • CheckParams() 调用 CheckShape()op_api/aclnn_quant_batch_matmul_inplace_add.cpp:561-569
  • 空 Tensor 分支位于参数校验之后:op_api/aclnn_quant_batch_matmul_inplace_add.cpp:691-733

Environment / 环境信息 (Mandatory / 必填)

  • 目标仓库:cann/ops-nn
  • 分支:master
  • 上游提交:cac808cda9259bef337d9c2aca93f017d6251f8b
  • 检查日期:2026-07-17
  • 目标硬件:Ascend 950PR / Ascend 950DT(DAV_3510)
  • 本问题通过源码调用链静态分析确认,暂未提供上板运行日志。

Steps to reproduce the issue / 重现步骤 (Mandatory / 必填)

以文档支持的 HIFLOAT8 T-T 场景为例:

  1. 构造以下输入:
    • x1:HIFLOAT8、ND、shape [512, 0]
    • x2:HIFLOAT8、ND、shape [512, 256]
    • x1Scale:FLOAT32、ND、shape [1]
    • x2Scale:FLOAT32、ND、shape [1]
    • yRef:FLOAT32、ND、shape [0, 256]
    • transposeX1:true
    • transposeX2:false
    • groupSize:0
  2. 调用 aclnnQuantBatchMatmulInplaceAddGetWorkspaceSize()
  3. 当前实现进入 CheckParams()CheckShape()CheckMKN()
  4. CheckMKN()m <= 0 返回失败,第一段接口最终返回 ACLNN_ERR_PARAM_INVALID(161002)。

n=0 可使用以下输入验证:

  • x1 shape [512, 128]
  • x2 shape [512, 0]
  • yRef shape [128, 0]
  • 其余参数不变。

MX 场景也存在相同问题,并可能在 InferGroupSize() 阶段更早失败。

Describe the expected behavior / 预期结果 (Mandatory / 必填)

应统一文档和实现对空 Tensor 的行为定义。

按照当前文档描述以及代码中已经存在的空 Tensor 快速返回分支,建议:

  1. 在完成必选指针和输入维度数量校验后,尽早识别 m=0n=0
  2. 在执行 InferGroupSize()CheckMKN() 等会拒绝零维的校验之前返回 ACLNN_SUCCESS
  3. 保持 k=0 为非法输入;
  4. 补充 HIFLOAT8 和 MX 场景的 m=0n=0 API 单元测试。

如果接口设计实际上不支持空 Tensor,则应删除不可达的快速返回代码,并修正文档第 139 行的支持说明。

源码调用链:

aclnnQuantBatchMatmulInplaceAddGetWorkspaceSizeCommon
  -> InferGroupSize
  -> CheckGroupSize
  -> CheckParams
       -> CheckShape
            -> CheckMKN
                 -> m <= 0 / n <= 0
                 -> ACLNN_ERR_PARAM_INVALID
  -> 空 Tensor 快速返回分支(当前不可达)

Special notes for this issue/备注 (Optional / 选填)

likedislike
chenjiayi_chenjiayi_成员
7月17日 issue类型由 任务 改变为 缺陷
yuning_chenyuning_chen成员
7月17日 将 chen-shuai 设为负责人
yuning_chen
yuning_chen成员
7月17日 评论:

您好,感谢反馈,问题已收到,当前 @chen-shuai 正在跟踪处理。

likedislike
chen-shuai成员
7月20日 评论:

您好,正在了解问题

likedislike
chen-shuai成员
8月6日 评论:

正在分析问题

likedislike
chen-shuai成员
8月13日 评论:

编码完成,正在测试验证

likedislike
CANN-robotCANN-robot成员
8月14日 关闭了 issue
CANN-robotCANN-robot成员
8月14日 添加了label:resolved