Pull Request已成功合入, 合并人@CANN-robot
(感谢 TangPC 的贡献)变更摘要
该 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静态常量,使维度校验逻辑参数化、可维护性提升。


代码审查
经过对所有 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 个新用例覆盖边界,已有用例仅格式调整 |
审查要点确认
- CheckShape 逻辑正确:三个算子的
CheckShape()均遍历全部输入(2/3/4 个),对每个输入先做nullptr检查,再取GetStorageShape().GetDimNum()与MAX_DIM_NUM=8做>比较——8 维放行、9 维拦截,与 PR 设计完全一致。 - 短路位置正确:
CheckShape()在DoOpTiling()最前调用,先于 dtype 校验与 BroadcastBaseTiling 分发,超限即返回GRAPH_FAILED,不会产生副作用。 - 宏用法一致:
OP_CHECK_IF/OP_LOGE_FOR_INVALID_SHAPEDIM_WITH_REASON与仓库中IsPosInf、IsInf、cdist等算子完全一致,无自定义报错风格。 - 测试覆盖充分:每个算子新增 3 个 UT:8 维成功(上边界不误杀)、全部输入 9 维失败、仅末位输入 9 维失败(验证遍历),共 9 个用例。
- 格式变更无功能影响:大量单行化改写(
{ return ...; })和TilingContextPara构造参数缩进调整均为纯格式化。 - README 同步:三个 README 的约束说明章节均新增一行维度上限说明,措辞与约束内容一致。
总结
- P0: 0
- P1: 0
- P2: 0
- P3: 0
整体风险评估:低风险。此项变更为三个算子补齐了缺失的输入维度上限校验(rank ≤ 8),实现与仓库既有实践(IsPosInf、IsInf 等)完全对齐,逻辑正确、测试到位、文档同步,未引入任何正确性、安全性、可靠性或破坏性变更问题。
⚠️ 已识别出整体风险,但无法提取行内评论,请参考整体评估。


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
/approveor/lgtm- Commenting
/approveimplies 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. 👍


compile


流水线任务触发成功
任务链接 [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执行结束


流水线任务触发成功
任务链接 [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 | >>>>> | >>>>> |


compile


流水线任务触发成功
任务链接 [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执行结束


流水线任务触发成功
任务链接 [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执行结束


/approve


描述
为
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:
MUL_NO_NAN_MAX_DIM_NUM = 8x1,x2FUSED_MUL_ADD_MAX_DIM_NUM = 8x1,x2,x3FUSED_MUL_ADD_ADD_MAX_DIM_NUM = 8x1,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)
max_dim_num_8d_fp32{2,1,1,1,1,1,1,2}GRAPH_SUCCESSx1_dim_num_over_8_failedGRAPH_FAILEDx2_dim_num_over_8_failedx1为{2}、仅x29 维GRAPH_FAILEDmax_dim_num_8d_fp32GRAPH_SUCCESSx1_dim_num_over_8_failedGRAPH_FAILEDx3_dim_num_over_8_failedx39 维GRAPH_FAILEDmax_dim_num_8d_fp32GRAPH_SUCCESSx1_dim_num_over_8_failedGRAPH_FAILEDx4_dim_num_over_8_failedx49 维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
测试
math/mul_no_nan/tests/ut/op_host/arch35/test_mul_no_nan_tiling.cppmath/fused_mul_add/tests/ut/op_host/arch35/test_fused_mul_add_tiling.cppmath/fused_mul_add_add/tests/ut/op_host/arch35/test_fused_mul_add_add_tiling.cpp文档更新
更新了三个算子的 README「约束说明」章节,各新增一条维度数上限约束:
math/mul_no_nan/README.mdmath/fused_mul_add/README.mdmath/fused_mul_add_add/README.md类型标签