已关闭
[Bug-Report|缺陷反馈]: MapIndex Host tiling 未拒绝空 x 维度并生成负 CopyInDim0 #5068
KaranocaVe创建于 8月24日关闭于 9月14日
8月24日 添加了label:bug-report
8月24日 关联了pull request:[Fix] 拒绝 MapIndex 的空 x 维度
8月24日 将 KaranocaVe 设为负责人
9月14日 关闭了 issue
9月21日 修改了issue 的描述
11 天前 添加了label:resolved
问题描述
在
cann/ops-nn的bcf8c094ca51b5659c7c21ac5abecec5fa9ef2be中,MapIndexArch35 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,说明问题不仅是返回值判断遗漏,也会执行未定义的算术路径。
环境信息
cann/ops-nn/bcf8c094ca51b5659c7c21ac5abecec5fa9ef2be重现步骤
int32输入x=[0]、data_seq=[0]、level_index=[0],输出y=[1],属性transpose=false。MapIndexArch35 Host tiling 回调。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 字段为:其中第 7 个字段对应
CopyInDim0,值为-1。x=[64]、data_seq=[640]的成功对照返回成功;
x=[0]、data_seq=[64]返回失败。仓库现有 10 个 MapIndex HostUT 全部通过,但没有覆盖空维度。
日志/最小复现
使用真实
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