Closed
[Bug-Report|缺陷反馈]: LinSpace legacy tiling loses INT64 num precision #3347
KaranocaVeAdd on  Sep 29Closed at  7 days ago
KaranocaVe
KaranocaVe
Sep 29 Create

[Bug-Report|缺陷反馈]: LinSpace legacy tiling loses INT64 num precision

问题

LinSpace 接受 DT_INT64 num,但 legacy Host tiling 将该值经 float 转换。输入 num=16777219 时,tiling 写入 16777220,InferShape 返回的输出 shape 则为 [16777219]。

最小复现

调用注册的 legacy Host tiling 与 InferShape callback,输入 start=0、stop=1、num=16777219(DT_INT64)。num=17 可作为小计数对照。

预期 / 实际

  • 预期:tiling 计数和输出维度都保留 16777219。
  • 实际:tiling 计数变成 16777220,InferShape 仍返回 [16777219]。

影响

Host tiling 元素数与输出 shape 不一致,可能导致设备端处理范围与输出尺寸不符;本次未验证设备端具体表现。

修复

legacy tiling 直接读取 int64_t,并新增注册 tiling 与 InferShape 回归用例。独立的 Arch35 tiling 路径不在本次修改范围内。

Validation

验证

  • 修复版本运行 cmake --build build --target math_op_host_ut -j8,定向 Host UT 2/2 通过,覆盖 tiling 的 num=17、num=16777219 以及 InferShape 输出维度。
  • 基线同一命令由回归断言失败(退出码 2):tiling 写入 16777220,InferShape 返回 [16777219]。
  • 新增代码范围的 clang-format --dry-run --Werror 检查通过;补丁 git diff --check 通过。
  • 修复补丁已应用到当前上游 master,git apply --check 和 git diff --check 通过。设备执行未验证。
likedislike
陈思
陈思Collaborators
Sep 29 Comments:

您好,感谢反馈和提供 Host UT 对照结果!

核对 ops-math 的 77f7e4c2286 版本,legacy tiling 的 LinSpaceGetConstValue 在 DT_INT64 分支中确实先把值转为 float,再转回 int64_t num。FP32 超过 2^24 后无法精确表示所有整数,16777219 会舍入为 16777220;而 InferShape 的 GetNumValue 直接读取 int64_t,输出维度保留原值。因此,代码路径与您报告的 tiling 计数、输出 shape 不一致相符。该计数还会参与后续分核和尾块计算,设备端具体影响仍需实际执行确认。

您提出的修复方向是合理的:让 legacy 的 DT_INT64 num 读取保持整数精度,去掉中间的 FP32 转换,同时保留空指针检查及其他类型分支的行为。通过注册的 tiling 与 InferShape 回调共同校验计数,能够覆盖这两个入口的一致性;您提供的 num=17、num=16777219 对照及修复后 2/2 Host UT 结果也与这一方向一致。独立 Arch35 路径不属于本次确认的故障范围。

我们会继续跟踪这一计数一致性问题。

likedislike
陈思陈思Collaborators
Sep 29 Assign sunchun as responsible person
CchenyifengCollaborators
9 days ago Assign gcw_SUaZx3UQ as responsible person
CchenyifengCollaborators
9 days ago Removed responsible person gcw_SUaZx3UQ
CchenyifengCollaborators
9 days ago Assign sakuraqqz as responsible person
CchenyifengCollaborators
9 days ago Removed responsible person sunchun
sakuraqqzCollaborators
9 days ago Comments:

您好,已完成修复,改动已随 PR !6812 提交。

根因:legacy Host tiling 的 LinSpaceGetConstValue 在 DT_INT64 分支先将 int64_t 经 float 转换再转回目标类型,num=16777219 超过 FP32 精确表示范围(2^24),被舍入为 16777220;而 InferShape 的 GetNumValue 直接读取 int64_t,导致 tiling 计数与输出 shape 不一致。

修复(math/lin_space/op_host/lin_space_tiling.cpp):DT_INT64 分支直接读取 int64_t 数值,经 double 中间转换(16777219 < 2^53,double 可精确表示),避免经 float 丢失精度;num=17 小计数对照不受影响。

验证(910B3 / CANN 9.3.0,2026-10-29):

  • 定向 Host UT 6/6 PASS:3 个 tiling 用例 + 3 个 infershape 用例;其中 lin_space_tiling_int64_big_num 断言 tiling data 中 num 字段 = 16777219,Linspace_infershape_int64_big_num_case 断言输出维度 = [16777219]。
  • 基线回归:临时还原修复后 lin_space_tiling_int64_big_num 失败(tiling data num=16777220),证实该用例能捕获此缺陷。
  • git diff --check 通过;生产代码 lin_space_tiling.cpp 经 clang-format(仓内 .clang-format 配置)检查 0 违规;两个测试文件存在历史遗留的全文件格式偏差(非本次引入),新增用例沿用文件既有风格以保证 diff 最小。

改动文件:

  • math/lin_space/op_host/lin_space_tiling.cpp
  • math/lin_space/tests/ut/op_host/test_lin_space_tiling.cpp
  • math/lin_space/tests/ut/op_host/test_lin_space_infershape.cpp

PR:https://gitcode.com/cann/ops-math/pulls/6812

likedislike
CANN-robotCANN-robotCollaborators
7 days ago Close issue
CANN-robotCANN-robotCollaborators
7 days ago Added label: resolved