已合并
fix: enable double path for remainder scalar tensor #4018
zhang-song-rui创建于 7月13日
fix: enable double path for remainder scalar tensor #4018
已合并
zhang-song-rui创建于 7月13日
已删除 :master合入到cann/ops-mathmaster
zhang-song-rui
zhang-song-rui成员
7月13日

描述

修复 Ascend 950(RegBase)上 aclnnRemainderScalarTensor 在类型提升结果为 DT_DOUBLE 时的计算路径不一致问题。

修改前,RegBase 分支显式排除了 DT_DOUBLE。当 PromoteTypeScalarV35(other.dtype, self.dtype) 推导为 DT_DOUBLE 时,接口会进入通用分支,并按 out 的数据类型提前转换输入后再执行取余;若 out 为较低精度类型,会导致计算在降精度后进行,与类型提升规则不一致,存在精度损失风险。

本次修改移除 RegBase 分支对 DT_DOUBLE 的排除,使 Scalar-Tensor 场景统一按以下流程执行:

  1. 使用 PromoteTypeScalarV35 推导计算类型;
  2. other 连续化并转换到推导类型,同时将 self 转换为同类型 Tensor;
  3. 调用 l0op::FloorMod 完成计算;
  4. 最后将结果转换到 out 的数据类型并写回。

对于 DT_DOUBLEl0op::FloorMod 会通过 AICPU_DTYPE_SUPPORT_LIST 分发到 FloorModAiCpu,不会进入 arch35 仅支持 FP16/BF16/FP32/INT32/INT64 的 AICORE tiling/kernel 路径。

影响范围仅限 RegBase、非空 Tensor 的 aclnnRemainderScalarTensor;非 RegBase 路径、空 Tensor 快速返回、其他 remainder 接口及接口签名均不受影响。

代码整改

  • 按仓库 .clang-format 规范,使用 pre-commit 固定的 clang-format 18.1.8 对涉及文件进行格式整改;
  • 统一 extern C 代码块缩进、函数声明参数换行以及宏和函数调用的换行格式;
  • 格式整改不改变代码语义,除上述 double 路径修复外未引入其他逻辑修改;
  • 完整 pre-commit 检查已通过,包括 clang-format、trailing whitespace、end-of-file、merge conflict、private key、codespell 和 OAT 合规检查。

关联的Issue

测试

Ascend 950 全量验证

  • 测试平台:Ascend950PR(RegBase),CANN 9.1.0。
  • 对比版本:
    • PRE:修改前 26972d8
    • POST:PR 修改后 87cdb6a
  • 测试方式:通过 C++ 直接调用 aclnn API,逐条执行 1000 个 Scalar-Tensor 用例,覆盖 double 类型提升、非 double 回归、0~8 维、连续/非连续 Tensor、空 Tensor、正负零、NaN/Inf、整数边界和非法参数。
用例集 数量 PRE/POST 一致 预期差异 验证结论
D1:double scalar + integral tensor 360 260 100 差异符合先 double 计算再 cast 的预期
D2:double tensor + 各类 scalar 240 214 26 差异符合先 double 计算再 cast 的预期
N1:非 double 回归 160 160 0 无回归
S1:零、NaN、Inf、精度边界 100 100 0 行为一致
V1:非法参数与错误处理 80 80 0 行为一致
P1:RegBase 路径控制 60 36 24 差异符合预期
合计 1000 850 150 通过

验证结果:

  • 1000 例全部执行完成,无 crash、hang 或非法内存访问;
  • 150 例差异全部集中在 promoted=DOUBLE && out!=DOUBLE 场景,符合本次修改的影响范围;
  • POST 保持 double 精度完成取余,仅在最后转换为 out 类型,修复了 PRE 版本提前降精度导致的结果偏差;
  • 差异用例中,PRE 与 PRE oracle 匹配 136/150,POST 与 POST oracle 匹配 138/150;
  • 非 double 160 例、边界值 100 例和非法参数 80 例均与 PRE 一致,未发现回归。

测试结论:通过。

新增 Ascend950 回归 UT

  • 新增 math/floor_mod/tests/ut/op_api/test_aclnn_remainder_scalar_tensor.cpp,文件名符合 test_aclnn_*.cpp 收集规则;
  • 用例显式设置 NpuArch::DAV_3510,覆盖 scalar double 2049.0、tensor int32 2、out float16 的关键场景;
  • 定向构建与执行命令:
    TMPDIR=/tmp TMP=/tmp TEMP=/tmp CCACHE_TEMPDIR=/tmp/ops-math-ccache bash build.sh -u --opapi --ops=floor_mod --gtest_filter='l2_remainder_scalar_tensor_ascend950_test.*' -j2
  • 本地执行结果:1 test from 1 test suite1 PASSED
  • 新增文件通过 clang-format 21.1.4 dry-run 和 git diff --check

静态检查

  • 静态核对 DT_DOUBLE 后端分发:确认由 l0op::FloorMod 进入 AICPU 路径,不依赖 arch35 AICORE double kernel。

文档更新

无接口或用户文档变更。

类型标签

  • Bug修复
  • 新特性
  • 性能优化
  • 文档更新
  • 其他,请描述:
likedislike
Pull Request已成功合入, 合并人@CANN-robot
(感谢 zhang-song-rui 的贡献)
zhang-song-ruizhang-song-rui成员
7月13日 创建了 pull request,commit 490f7ea3
atomgit-bot
atomgit-bot
7月13日 评论:

变更摘要

本次变更修复了 aclnnRemainderScalarTensorGetWorkspaceSize 函数中对标量-张量取余运算的一个条件限制:原先当 NPU 架构为 IsRegBase 且提升后的数据类型为 DT_DOUBLE 时,会跳过类型转换和连续化处理路径,导致 double 路径被错误排除。变更移除了对 DT_DOUBLE 的排除条件,使 double 类型也能正常进入该处理分支。

主要改动

  • 移除 double 类型排除条件:在 aclnnRemainderScalarTensorGetWorkspaceSize 中,将 if (IsRegBase(npuArch) && PromoteTypeScalarV35(...) != op::DataType::DT_DOUBLE) 简化为 if (IsRegBase(npuArch)),使 DT_DOUBLE 类型的输入也能进入类型提升和 Contiguous 的转换路径,不再被错误跳过。
likedislike
atomgit-bot
atomgit-bot
7月13日 评论:

代码审查

经过仔细审查,该 diff 仅从 aclnnRemainderScalarTensorGetWorkspaceSize 函数中移除了 PromoteTypeScalarV35(...) != op::DataType::DT_DOUBLE 的守卫条件,以启用 Scalar-Tensor 场景下的 double 路径。变更本身逻辑清晰、改动最小:

  • PromoteTypeScalarV35 是无副作用的纯函数,原有代码在条件判断和块内各调用一次(冗余),修改后仅调用一次,消除了冗余。
  • DT_DOUBLE 已在 ASCEND910B_DTYPE_DTYPE_SUPPORT_LIST 等支持列表中声明(第 38 行),参数校验层 CheckPromoteTypeScalarTensor 也未排除 double 类型,说明此路径的 double 支持已具备前置条件。
  • else 分支的行为不受影响,仅对非 RegBase 架构生效。

未发现由此 diff 引入的正确性、安全性、可靠性或破坏性变更问题。


审查总结:

  • 已审查文件:math/floor_mod/op_api/aclnn_remainder.cpp(无问题)
  • 发现数量:P0: 0, P1: 0, P2: 0, P3: 0
  • 整体风险判断:低风险,变更安全。
类型 数量
🔴 阻塞 1
🟡 建议 0

⛔ 需要修改

likedislike
CANN-robotCANN-robot成员
7月13日 添加了label:cann-cla/yes
CANN-robot
CANN-robot成员
7月13日 评论:

Thanks for your pull-request.
The full list of commands accepted by me can be found at here
You can get sig-info at here


PR Approval Progress

Congratulations! All modules have met the lgtm and approve requirements.

Module Approval Details

module lgtm status approve status
math/floor_mod 宋恺, 王林木 (2/2) 宋恺, 王林木 (2/1)

💡 Tip:

  • Committer can comment /approve or /lgtm
  • Commenting /approve implies both code review (lgtm) and intent to merge (approve)

CLA Signature Pass

zhang-song-rui, thanks for your pull request. All authors of the commits have signed the CLA. 👍

likedislike
此处折叠了106条消息 查看更多
zhang-song-rui
zhang-song-rui成员
7月18日 评论:
likedislike
llimwang成员
7月18日 评论:

/approve

likedislike
CANN-robotCANN-robot成员
7月18日 添加了label:lgtm
CANN-robotCANN-robot成员
7月18日 关闭了关联的issue
CANN-robotCANN-robot成员
7月18日 合入了pull request