已关闭
[Bug-Report|缺陷反馈]: MapIndex Host tiling 未拒绝空 x 维度并生成负 CopyInDim0 #5068
KaranocaVe创建于  8月24日关闭于  9月14日
KaranocaVe
KaranocaVe
8月24日 创建

问题描述

在 cann/ops-nn 的 bcf8c094ca51b5659c7c21ac5abecec5fa9ef2be 中,
MapIndex Arch35 Host tiling 对一维输入 x 只检查 x[0] > 24000,没有检查
x[0] <= 0。同一段错误提示明确写出 x 的范围应为 [1, 24000]。

当 x=[0]、data_seq=[0] 时,回调没有返回参数错误,而是继续执行取模、除法和
DoTiling,最终返回 GRAPH_SUCCESS 并生成 CopyInDim0=-1 的 tiling 数据。该
结果不是一个可供 kernel 使用的有效参数。

在保留目标 MapIndex 源码 UBSan 检查的构建中,同一输入在
map_index_tiling_arch35.cpp:131 报告 runtime error: division by zero,说明问题
不仅是返回值判断遗漏,也会执行未定义的算术路径。

环境信息

  • 仓库/commit:cann/ops-nn / bcf8c094ca51b5659c7c21ac5abecec5fa9ef2be
  • OS/架构:Linux 5.10/aarch64
  • Ascend 硬件:Ascend 910B3(本次为 Host tiling 验证)
  • Driver/Toolkit/OPP:验证环境 CANN Toolkit/OPP 9.1.0;目标源码为 9.2 开发线
  • 编译器和 Python:G++ 11.4.0、Python 3.12.13、CMake 3.22.1

重现步骤

  1. 构建该 commit 的 MapIndex Host UT。
  2. 构造一维 int32 输入 x=[0]、data_seq=[0]、level_index=[0],输出
    y=[1],属性 transpose=false。
  3. 调用注册的 MapIndex Arch35 Host tiling 回调。
  4. 使用 x=[64]、data_seq=[640]、level_index=[10] 作为合法成功对照;使用
    x=[0]、data_seq=[64] 作为非整除失败对照。

预期结果

对于 x[0] <= 0,应在 Host 参数检查阶段返回 GRAPH_FAILED(或其他明确的参数
错误状态),不应执行依赖 x[0] 为正数的取模、除法和 tiling 计算,也不应生成负的
拷入行数。

实际结果

x=[0]、data_seq=[0] 的回调返回 GRAPH_SUCCESS。最小复现打印的 tiling 字段为:

status=0 block_dim=64 data_size=80 fields=64,0,0,0,0,0,-1,2,2,1

其中第 7 个字段对应 CopyInDim0,值为 -1。x=[64]、data_seq=[640] 的成功
对照返回成功;x=[0]、data_seq=[64] 返回失败。仓库现有 10 个 MapIndex Host
UT 全部通过,但没有覆盖空维度。

日志/最小复现

使用真实 gert::TilingContext 调用注册的 Arch35 Host tiling 回调即可复现。边界
测试命令 MapIndexBoundary.* 退出码为 0,并验证了上述成功/失败对照;完整输出
应以 status=0 和 CopyInDim0=-1 为关键检查项。UBSan 空维度用例退出码为 1,
报告 map_index_tiling_arch35.cpp:131:5: runtime error: division by zero;正数
UBSan 对照退出码为 0。源码锚点为
index/map_index/op_host/map_index_tiling_arch35.cpp:121-124,130-137。

影响与规避方式

影响是非法空维度不会被 Host tiling 拦截,调用方收到成功状态后可能继续使用包含
负拷入行数的 tiling 数据。临时规避是保证 x 长度为正数,并在调用前检查
data_seq 长度可以被 x 长度整除;实现侧应补充 x[0] <= 0 的参数检查,并在
空输入策略确定后增加对应回归测试。

建议的回归测试

增加 x=[0], data_seq=[0]、x=[0], data_seq=[64] 和正常正数输入的 Host tiling
回归用例,分别断言明确失败、明确失败和成功;同时断言失败用例不会写出 tiling
数据。建议在普通构建和 UBSan/ASan Host 构建中运行,并覆盖 level_index 对照。

关联 PR

likedislike
KaranocaVeKaranocaVe
8月24日 添加了label:bug-report
KaranocaVeKaranocaVe
8月24日 关联了pull request:[Fix] 拒绝 MapIndex 的空 x 维度
yuning_chenyuning_chen成员
8月24日 将 KaranocaVe 设为负责人
KaranocaVeKaranocaVe
9月14日 关闭了 issue
KaranocaVeKaranocaVe
9月21日 修改了issue 的描述
CANN-robotCANN-robot成员
11 天前 添加了label:resolved