已合并
feat: MulNoNan/FusedMulAdd/FusedMulAddAdd tiling新增输入维度数上限8校验及UT #4294
feat: MulNoNan/FusedMulAdd/FusedMulAddAdd tiling新增输入维度数上限8校验及UT #4294
已合并
TangPC创建于 7月28日
TangPC
TangPC成员
7月28日

描述

为 MulNoNan、FusedMulAdd、FusedMulAddAdd 三个 arch35 算子在 tiling 阶段补充输入维度数(rank)不超过 8 的校验,超限时提前返回 ge::GRAPH_FAILED 并打印带原因的错误日志;同步补充 UT 用例与 README 约束说明。

改动原因

三个算子的 tiling 此前在 DoOpTiling() 中只做了 dtype 一致性校验(CheckDtype),未对输入 shape 的维度数设任何约束,超过 8 维的非法输入会被直接透传给 Ops::Base::BroadcastBaseTiling,错误在更下游才暴露,且不带明确的 host 侧报错信息。

昇腾张量维度上限为 8,本仓库其他算子已普遍在 host 侧显式拦截,例如:

  • math/is_pos_inf/op_host/arch35/is_pos_inf_tiling_arch35.cpp:30 — constexpr int64_t MAX_DIM_NUM = 8;
  • math/is_neg_inf/op_host/arch35/is_neg_inf_tiling_arch35.cpp:29 — constexpr int64_t MAX_DIM_NUM = 8;
  • math/is_inf/op_host/is_inf_tiling.cpp:32 — constexpr uint32_t MAX_DIM = 8;

这三个算子缺失该校验,属于入参校验链路不完整,本 PR 对齐仓库既有实践补齐。

改动方法

1. tiling 头文件新增私有方法声明(3 个文件)

private:
    uint64_t tilingKey = 0;
    bool CheckDtype(...) const;
    bool CheckShape() const;          // 新增

2. tiling 实现新增 CheckShape() 并在 DoOpTiling() 入口调用(3 个文件)

每个算子新增三个文件级常量(上限、输入个数、输入名数组),遍历全部输入逐个校验 rank:

算子 常量 输入个数 输入名
MulNoNan MUL_NO_NAN_MAX_DIM_NUM = 8 2 x1, x2
FusedMulAdd FUSED_MUL_ADD_MAX_DIM_NUM = 8 3 x1, x2, x3
FusedMulAddAdd FUSED_MUL_ADD_ADD_MAX_DIM_NUM = 8 4 x1, x2, x3, x4

实现(以 MulNoNan 为例,另两个算子同构):

bool MulNoNanTiling::CheckShape() const
{
    for (size_t i = 0; i < MUL_NO_NAN_INPUT_NUM; i++) {
        auto inputShape = context_->GetInputShape(i);
        OP_CHECK_IF(inputShape == nullptr,
                    OP_LOGE(context_->GetNodeName(), "The shape of %s is nullptr.", MUL_NO_NAN_INPUT_NAMES[i]),
                    return false);
        size_t dimNum = inputShape->GetStorageShape().GetDimNum();
        if (dimNum > MUL_NO_NAN_MAX_DIM_NUM) {
            std::string reasonMsg = "The dim num must be no more than " + std::to_string(MUL_NO_NAN_MAX_DIM_NUM) + ".";
            OP_LOGE_FOR_INVALID_SHAPEDIM_WITH_REASON(context_->GetNodeName(), MUL_NO_NAN_INPUT_NAMES[i],
                                                     std::to_string(dimNum), reasonMsg);
            return false;
        }
    }
    return true;
}

调用点置于 DoOpTiling() 最前,先于 dtype 校验:

ge::graphStatus MulNoNanTiling::DoOpTiling()
{
    if (!CheckShape()) {
        return ge::GRAPH_FAILED;
    }
    ...
}

设计要点:

  • 遍历全部输入而非只校验 x1,避免 x1 合法但 x2/x3/x4 超维时漏检;
  • 复用仓库既有宏 OP_CHECK_IF / OP_LOGE / OP_LOGE_FOR_INVALID_SHAPEDIM_WITH_REASON,报错格式与 math/is_pos_inf、math/cast 等算子一致;
  • 顺带处理 GetInputShape() 返回 nullptr 的空指针分支。

3. 补充 UT 用例(3 个文件,共新增 9 个用例,用例总数 12→15 / 12→15 / 13→16)

算子 用例 场景 预期
MulNoNan max_dim_num_8d_fp32 全输入 8 维 {2,1,1,1,1,1,1,2} GRAPH_SUCCESS
MulNoNan x1_dim_num_over_8_failed 9 维输入 GRAPH_FAILED
MulNoNan x2_dim_num_over_8_failed x1 为 {2}、仅 x2 9 维 GRAPH_FAILED
FusedMulAdd max_dim_num_8d_fp32 全输入 8 维 GRAPH_SUCCESS
FusedMulAdd x1_dim_num_over_8_failed 9 维输入 GRAPH_FAILED
FusedMulAdd x3_dim_num_over_8_failed 仅末位输入 x3 9 维 GRAPH_FAILED
FusedMulAddAdd max_dim_num_8d_fp32 全输入 8 维 GRAPH_SUCCESS
FusedMulAddAdd x1_dim_num_over_8_failed 9 维输入 GRAPH_FAILED
FusedMulAddAdd x4_dim_num_over_8_failed 仅末位输入 x4 9 维 GRAPH_FAILED

用例覆盖三类边界:8 维恰好通过(上边界不误杀)、首个输入超维拦截、仅非首位输入超维也能拦截(验证遍历全部输入而非只看 x1)。

4. README 补充约束说明(3 个文件,各 +1 行)

  • math/mul_no_nan/README.md:x1、x2的维度数(rank)均不能超过8,超过时在tiling阶段校验失败。
  • math/fused_mul_add/README.md:x1、x2、x3的维度数(rank)均不能超过8,超过时在tiling阶段校验失败。
  • math/fused_mul_add_add/README.md:x1、x2、x3、x4的维度数(rank)均不能超过8,超过时在tiling阶段校验失败。

5. 代码格式化

三个 tiling .cpp/.h 与三个 UT 文件同时按 clang-format 做了行折叠(如 ge::graphStatus XxxTiling::GetShapeAttrsInfo() { return ge::GRAPH_SUCCESS; } 单行化、函数参数换行位置调整)。这部分无任何语义变更,是本 PR 行数统计偏大(+618/-502)的主要来源;以 git diff -w --ignore-blank-lines 复核,实际非空白变更约为 tiling 侧 67~73 行/文件、UT 侧 94~103 行/文件。

关联的Issue

测试

  • 新增 9 个 tiling UT 用例,覆盖 8 维边界通过、9 维拦截、非首位输入超维拦截三类场景,分别落在:
    • math/mul_no_nan/tests/ut/op_host/arch35/test_mul_no_nan_tiling.cpp
    • math/fused_mul_add/tests/ut/op_host/arch35/test_fused_mul_add_tiling.cpp
    • math/fused_mul_add_add/tests/ut/op_host/arch35/test_fused_mul_add_add_tiling.cpp
  • 原有 37 个 UT 用例(12 + 12 + 13)全部保留,未删除或修改任何既有用例的断言,仅随 clang-format 调整了排版。
  • 校验发生在 host 侧 tiling 阶段,kernel 侧无改动,不影响已有正常 shape 的执行路径与性能。

文档更新

更新了三个算子的 README「约束说明」章节,各新增一条维度数上限约束:

  • math/mul_no_nan/README.md
  • math/fused_mul_add/README.md
  • math/fused_mul_add_add/README.md

类型标签

likedislike
Pull Request已成功合入, 合并人@CANN-robot
(感谢 TangPC 的贡献)
TangPCTangPC成员
7月28日 创建了 pull request,commit 8c836280
atomgit-bot
atomgit-bot
7月28日 评论:

变更摘要

该 PR 为 MulNoNan、FusedMulAdd 和 FusedMulAddAdd 三个算子的 tiling 模块补充了输入维度不超过 8 的校验逻辑,并为每个算子新增了对应的单元测试用例。核心改动是在各自的 Tiling 类中新增 CheckShape() 方法,遍历所有输入张量,检查其维度数是否超出上限 8,超出则返回失败;同时在 DoOpTiling() 入口处调用该校验。此外,PR 还对代码进行了格式统一(如单行函数体、缩进整理),并在 UT 中增加了 8 维成功用例和 9 维失败用例以覆盖边界场景。

主要改动

  • 为三个算子新增 CheckShape() 维度上限校验:在 MulNoNanTiling、FusedMulAddTiling 和 FusedMulAddAddTiling 中分别添加 CheckShape() 方法,遍历各自的所有输入张量(分别为 2、3、4 个),通过 GetStorageShape().GetDimNum() 获取维度数并与常量 MAX_DIM_NUM = 8 比较,超限时输出 OP_LOGE_FOR_INVALID_SHAPEDIM_WITH_REASON 并返回 false。

  • 在 DoOpTiling() 入口调用维度校验:三个算子的 DoOpTiling() 方法开头均新增 if (!CheckShape()) { return ge::GRAPH_FAILED; },确保在执行 tiling 逻辑之前先拒绝非法的高维输入。

  • 为三个算子新增边界维度 UT 用例:test_mul_no_nan_tiling.cpp 新增 max_dim_num_8d_fp32(8 维成功)、x1_dim_num_over_8_failed 和 x2_dim_num_over_8_failed(9 维失败);test_fused_mul_add_tiling.cpp 与 test_fused_mul_add_add_tiling.cpp 同样新增对应的 8 维成功用例以及各输入超限失败用例,覆盖每个输入被单独检查的场景。

  • 代码格式统一与常量抽取:将原本多行的空函数体合并为单行(如 IsCapable()、GetShapeAttrsInfo() 等),同时为每个算子抽取 MAX_DIM_NUM、INPUT_NUM 和 INPUT_NAMES 静态常量,使维度校验逻辑参数化、可维护性提升。

likedislike
不准确?
atomgit-bot
atomgit-bot
7月28日 评论:

代码审查

经过对所有 12 个文件及其上下文的全面审查,此项变更未发现实质性问题。以下是逐文件的审查结论:


逐文件审查结果

文件 审查结论
math/fused_mul_add/README.md 无问题 — 新增一行约束说明,与实现一致
math/fused_mul_add/op_host/arch35/fused_mul_add_tiling_arch35.cpp 无问题 — CheckShape 实现正确,DoOpTiling 调用位置恰当
math/fused_mul_add/op_host/arch35/fused_mul_add_tiling_arch35.h 无问题 — CheckShape 声明正确,仅格式调整
math/fused_mul_add/tests/ut/op_host/arch35/test_fused_mul_add_tiling.cpp 无问题 — 3 个新用例覆盖边界,已有用例仅格式调整
math/fused_mul_add_add/README.md 无问题 — 新增一行约束说明,与实现一致
math/fused_mul_add_add/op_host/arch35/fused_mul_add_add_tiling_arch35.cpp 无问题 — CheckShape 实现正确,4 输入全部遍历
math/fused_mul_add_add/op_host/arch35/fused_mul_add_add_tiling_arch35.h 无问题 — CheckShape 声明正确,仅格式调整
math/fused_mul_add_add/tests/ut/op_host/arch35/test_fused_mul_add_add_tiling.cpp 无问题 — 3 个新用例覆盖边界,已有用例仅格式调整
math/mul_no_nan/README.md 无问题 — 新增一行约束说明,与实现一致
math/mul_no_nan/op_host/arch35/mul_no_nan_tiling_arch35.cpp 无问题 — CheckShape 实现正确,宏用法与仓库一致
math/mul_no_nan/op_host/arch35/mul_no_nan_tiling_arch35.h 无问题 — CheckShape 声明正确
math/mul_no_nan/tests/ut/op_host/arch35/test_mul_no_nan_tiling.cpp 无问题 — 3 个新用例覆盖边界,已有用例仅格式调整

审查要点确认

  1. CheckShape 逻辑正确:三个算子的 CheckShape() 均遍历全部输入(2/3/4 个),对每个输入先做 nullptr 检查,再取 GetStorageShape().GetDimNum() 与 MAX_DIM_NUM=8 做 > 比较——8 维放行、9 维拦截,与 PR 设计完全一致。
  2. 短路位置正确:CheckShape() 在 DoOpTiling() 最前调用,先于 dtype 校验与 BroadcastBaseTiling 分发,超限即返回 GRAPH_FAILED,不会产生副作用。
  3. 宏用法一致:OP_CHECK_IF / OP_LOGE_FOR_INVALID_SHAPEDIM_WITH_REASON 与仓库中 IsPosInf、IsInf、cdist 等算子完全一致,无自定义报错风格。
  4. 测试覆盖充分:每个算子新增 3 个 UT:8 维成功(上边界不误杀)、全部输入 9 维失败、仅末位输入 9 维失败(验证遍历),共 9 个用例。
  5. 格式变更无功能影响:大量单行化改写({ return ...; })和 TilingContextPara 构造参数缩进调整均为纯格式化。
  6. README 同步:三个 README 的约束说明章节均新增一行维度上限说明,措辞与约束内容一致。

总结

  • P0: 0
  • P1: 0
  • P2: 0
  • P3: 0

整体风险评估:低风险。此项变更为三个算子补齐了缺失的输入维度上限校验(rank ≤ 8),实现与仓库既有实践(IsPosInf、IsInf 等)完全对齐,逻辑正确、测试到位、文档同步,未引入任何正确性、安全性、可靠性或破坏性变更问题。

⚠️ 已识别出整体风险,但无法提取行内评论,请参考整体评估。

likedislike
不准确?
CANN-robotCANN-robot成员
7月28日 添加了label:cann-cla/yes
CANN-robot
CANN-robot成员
7月28日 评论:

CLA Signature Pass

pingchuantang, thanks for your pull request. All authors of the commits have signed the CLA. 👍

likedislike
CANN-robot
CANN-robot成员
7月28日 评论:

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
*/*/README.md ✅ 陈娇, 王林木 (2/2) ✅ 陈娇 (1/1)
repo-cann/ops-math ✅ 宋恺, 王林木 (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

pingchuantang, thanks for your pull request. All authors of the commits have signed the CLA. 👍

likedislike
CANN-robotCANN-robot成员
7月28日 将zhou-qilong,gitee-duhuiping,wangrui_,rxtfeng,loov1,zhangzijie,jia0liang,zl_hw,songkai111,gitcode-chenjiao,llimwang,zhouwenfang,gubaocheng,andong_hw,wuyao51511,xuejinghui,zhanw_coding,caiwenwen设为评审人
CANN-robotCANN-robot成员
7月28日 将zhou-qilong,gitee-duhuiping,wangrui_,rxtfeng,loov1,zhangzijie,jia0liang,zl_hw,songkai111,gitcode-chenjiao,llimwang,zhouwenfang,gubaocheng,andong_hw,wuyao51511,xuejinghui,zhanw_coding,caiwenwen设为审查人
TangPC
TangPC成员
7月28日 评论:

compile

likedislike
TangPCTangPC成员
7月28日 预合并成功(commit_id: ee6b620f1e97653b1616ae97df538433f1c968e3)
CANN-robotCANN-robot成员
7月28日 添加了label:ci-pipeline-running
CANN-robot
CANN-robot成员
7月28日 评论:

流水线任务触发成功
任务链接 [a9d98cb310c645dba1c950b443203d68][流水线指导]

任务名称状态日志下载链接
pre_comment ✅ SUCCESS >>>>>
Compile_Ascend_X86_ubuntu24 ✅ SUCCESS >>>>> >>>>>
Compile_Ascend_X86_mobile_station_ubuntu24 ✅ SUCCESS >>>>> >>>>>
Compile_Ascend_X86_experimental_ubuntu24 ✅ SUCCESS >>>>> >>>>>
Compile_harmony-infer ✅ SUCCESS >>>>>
Compile_Ascend_ARM_ubuntu24 ✅ SUCCESS >>>>> >>>>>
Compile_Ascend_ARM_experimental_ubuntu24 ✅ SUCCESS >>>>> >>>>>
Compile_Ascend_single_ubuntu24 ✅ SUCCESS >>>>> >>>>>
Compile_X86_monitor_910b ✅ SUCCESS >>>>> >>>>>
Compile_X86_monitor_910c ✅ SUCCESS >>>>> >>>>>
Compile_X86_monitor_950 ✅ SUCCESS >>>>> >>>>>
Compile_Ascend_X86_A5_ubuntu24 ✅ SUCCESS >>>>> >>>>>
Compile_Ascend_ARM_A5_ubuntu24 ✅ SUCCESS >>>>> >>>>>
Compile_Ascend_X86_mobile_station_9030_ubuntu24 ✅ SUCCESS >>>>> >>>>>
Compile_Ascend_single ✅ SUCCESS >>>>> >>>>>
UT_Test ✅ SUCCESS
UT_Test_experimental ✅ SUCCESS
UT_Test_kernel ✅ SUCCESS
PreSmoke_A900 ✅ SUCCESS >>>>>
API_Check ✅ SUCCESS >>>>>
PreSmoke_ATK_Test_A2 ✅ SUCCESS >>>>>
UT_Test_harmony-infer-chs-math ✅ SUCCESS

[2026-07-28 16:45:17]    CI执行结束

likedislike
CANN-robot
CANN-robot成员
7月28日 评论:

流水线任务触发成功
任务链接 [c916cbf9977e4a7fa8441dbfbc06f58c][流水线指导]

任务名称状态日志下载链接
SCA ✅ SUCCESS >>>>>
antipoison ✅ SUCCESS >>>>>
codecheck_Pr ✅ SUCCESS
StaticCheck_codespell ✅ SUCCESS
StaticCheck_link_validity ✅ SUCCESS
StaticCheck_resource_existence ✅ SUCCESS
StaticCheck_tag_closed ✅ SUCCESS
StaticCheck_markdownlint ✅ SUCCESS
codecheck_precommit ❌ FAILED >>>>> >>>>>
likedislike
CANN-robotCANN-robot成员
7月28日 添加了label:api-check-pass
此处折叠了9条事件消息 查看更多
CANN-robotCANN-robot成员
7月28日 删除了label:stat/needs-squash
CANN-robot
CANN-robot成员
7月28日 评论:

Notification

This pull request has been changed(code update) or closed, so removes the following label(s): stat/needs-squash.

likedislike
TangPC
TangPC成员
7月28日 评论:

compile

likedislike
TangPCTangPC成员
7月28日 预合并成功(commit_id: 9b3950db83aa8f17b85fde9d21e8d2d8aa577a00)
CANN-robotCANN-robot成员
7月28日 删除了label:ci-pipeline-failedapi-check-pass
CANN-robotCANN-robot成员
7月28日 添加了label:ci-pipeline-running
CANN-robot
CANN-robot成员
7月28日 评论:

流水线任务触发成功
任务链接 [6bb8c17c652d4f85916277c88a20d6db][流水线指导]

任务名称状态日志下载链接
pre_comment ✅ SUCCESS >>>>>
Compile_Ascend_X86_ubuntu24 ✅ SUCCESS >>>>> >>>>>
Compile_Ascend_X86_mobile_station_ubuntu24 ✅ SUCCESS >>>>> >>>>>
Compile_Ascend_X86_experimental_ubuntu24 ✅ SUCCESS >>>>> >>>>>
Compile_harmony-infer ✅ SUCCESS >>>>>
Compile_Ascend_ARM_ubuntu24 ✅ SUCCESS >>>>> >>>>>
Compile_Ascend_ARM_experimental_ubuntu24 ✅ SUCCESS >>>>> >>>>>
Compile_Ascend_single_ubuntu24 ✅ SUCCESS >>>>> >>>>>
Compile_X86_monitor_910b ✅ SUCCESS >>>>> >>>>>
Compile_X86_monitor_910c ✅ SUCCESS >>>>> >>>>>
Compile_X86_monitor_950 ✅ SUCCESS >>>>> >>>>>
Compile_Ascend_X86_A5_ubuntu24 ✅ SUCCESS >>>>> >>>>>
Compile_Ascend_ARM_A5_ubuntu24 ✅ SUCCESS >>>>> >>>>>
Compile_Ascend_X86_mobile_station_9030_ubuntu24 ✅ SUCCESS >>>>> >>>>>
Compile_Ascend_single ✅ SUCCESS >>>>> >>>>>
UT_Test ✅ SUCCESS
UT_Test_experimental ✅ SUCCESS
UT_Test_kernel ✅ SUCCESS
PreSmoke_A900 ✅ SUCCESS >>>>>
API_Check ✅ SUCCESS >>>>>
PreSmoke_ATK_Test_A2 ✅ SUCCESS >>>>>
UT_Test_harmony-infer-chs-math ✅ SUCCESS

[2026-07-28 17:05:06]    CI执行结束

likedislike
CANN-robot
CANN-robot成员
7月28日 评论:

流水线任务触发成功
任务链接 [489dce309dac4bfd8a6e50a22168ae36][流水线指导]

任务名称状态日志下载链接
SCA ✅ SUCCESS >>>>>
antipoison ✅ SUCCESS >>>>>
codecheck_Pr ✅ SUCCESS
StaticCheck_codespell ✅ SUCCESS
StaticCheck_link_validity ✅ SUCCESS
StaticCheck_resource_existence ✅ SUCCESS
StaticCheck_tag_closed ✅ SUCCESS
StaticCheck_markdownlint ✅ SUCCESS
codecheck_precommit ✅ SUCCESS >>>>>

[2026-07-28 16:56:46]    CI执行结束

likedislike
CANN-robotCANN-robot成员
7月28日 添加了label:api-check-pass
CANN-robotCANN-robot成员
7月28日 删除了label:ci-pipeline-running
CANN-robotCANN-robot成员
7月28日 添加了label:ci-pipeline-passed
TangPCTangPC成员
7月28日 修改标题为 “feat: MulNoNan/FusedMulAdd/FusedMulAddAdd tiling新增输入维度数上限8校验及UT”,原标题为“feat: MulNoNan、FusedMulAdd、FusedMulAddAdd tiling补充输入维度不超过8校验及UT用例”
TangPCTangPC成员
7月28日 修改了pull request 的描述
songkai111成员
7月28日 评论:

/approve

likedislike
llimwang成员
7月28日 评论:

/lgtm
/approve

likedislike
chenjiao成员
7月28日 评论:

/approve

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