Closed
[Bug-Report|缺陷反馈]: Concat SIMT 模板 0 维 tensor tiling 除零,pure_copy 行批次超 uint16 致 blockCount 截断丢行 #4630
zhanglei842Add on  1 day agoClosed at  1 day ago
zhanglei842Collaborators
1 day ago Create

一、问题描述 (必填)

Concat 算子存在两处缺陷:

  1. SIMT 模板 tiling 除零崩溃:IsEnableUsedSimt(conversion/concat/op_host/arch35/concat_tiling_arch35.cpp)遍历 tensorListDim1 时直接执行 maxDim1 / minDim1。当输入列表中存在 dim1 为 0 的 tensor(0 维/空 tensor)时,host 侧整数除零,tiling 进程异常终止,算子无法正常编译下发。

  2. pure_copy 路径 blockCount 截断丢行:OneAxisConcatPureCopy::ProcessSingleTensor(conversion/concat/op_kernel/arch35/one_axis_concat_pure_copy.h)中 rowFactor = bufferSize / colFactor,bufferSize 为 UB 容量按 dtypeSize 折算的元素数(concat_tiling_arch35.cpp:1414)。当 totalCols 极小(如 dim1=1)时 rowFactor 可超过 65535,而 CopyInSingleTensor/CopyOutSingleTensor 下发 DataCopyPad 的 blockCount(copyInParam_/copyOutParam)为 uint16,超限的 copyRows 被截断(如 65536→0),实际拷贝行数不足,输出静默丢行、结果错误。

二、环境信息 (可选)

代码变更位于 arch35 专属代码路径(op_host/arch35、op_kernel/arch35),未指定特定硬件/CANN 版本。

三、重现步骤 (可选)

  1. 构造含 0 维 tensor(dim1=0)作为 Concat 输入且满足其余 SIMT 使能条件的计算图,触发 tiling,IsEnableUsedSimt 内 maxDim1 / minDim1 除零,host 进程异常;
  2. 构造 dim1 极小、行数极大的 one-axis Concat pure copy 场景(bufferSize / totalCols > 65535),blockCount(uint16)截断,DataCopyPad 实际拷贝行数不足,输出丢行。

四、预期结果 (可选)

  • 含 0 维 tensor 输入时 tiling 正常完成,不选择 SIMT 模板也能正确出结果;
  • pure_copy 各批次行数不超 uint16 范围,输出完整无丢行。

💡 备注:修复见关联 PR:

  • IsEnableUsedSimt 循环内新增 minDim1 == 0 时提前 return false,禁用 SIMT 模板规避除零;
  • ProcessSingleTensor 中新增 rowFactor > UINT16_MAX 时钳制为 UINT16_MAX(blockCount 为 uint16),保证批次行数不越界。
likedislike
Zzhanglei842Collaborators
1 day ago Added label: bug-report
Zzhanglei842Collaborators
1 day ago Associated pull request
Zzhanglei842Collaborators
1 day ago Modify description of issue
CANN-robotCANN-robotCollaborators
1 day ago Close issue
CANN-robotCANN-robotCollaborators
1 day ago changed custom state from 待办的 to 已完成
CANN-robotCANN-robotCollaborators
1 day ago Added label: resolved