| 文件 | 最后提交记录 | 最后更新时间 |
|---|---|---|
feat: 新增 MulNoNan/FusedMulAdd/FusedMulAddAdd 三个 element-wise 算子(Ascend 950) Co-authored-by: tangpingchuan<tangpingchuan@huawei.com> # message auto-generated for no-merge-commit merge: !3022 merge feat/mul-fused-ops into master feat: 新增 MulNoNan/FusedMulAdd/FusedMulAddAdd 三个 element-wise 算子(Ascend 950) Created-by: pingchuantang Commit-by: tangpingchuan Merged-by: cann-robot Description: ## 描述 本 PR 在 math/ 下新增三个面向 Ascend 950(dav-3510 / Atlas 350 加速卡)的 element-wise 算子,均为纯新增(42 个文件,+4198),不修改任何既有算子。 ### MulNoNan(二元安全乘法) - 功能:屏蔽 Mul 中 0·inf=NaN、0·NaN=NaN 两类异常为 0,仅判 x2 一侧(x2==0 输出 0,-0 同样进零臂);等价 TensorFlow tf.math.multiply_no_nans。 - dtype:FLOAT16 / FLOAT / INT32 / BFLOAT16;fp16/bf16 提升 fp32 中间精度做 Compare(NE)+Select,末端 CAST_MODE_RINT 回退。 ### FusedMulAdd(三元融合 y = x1*x2 + x3) - 功能:将 Mul→Add 子图融合为单次 kernel 启动,减少一次 GM 中间数据搬运。 - dtype:FLOAT16 / FLOAT / INT32;浮点通路在 fp32 中间精度下用 Vec::Mul + Vec::Add(刻意不使用 Vec::FusedMulAdd,因其底层 in-place 写回 src2 buffer,在 broadcast 大 tensor 跨 tile 复用输入 UB 时会污染下一 tile 输入导致精度错误)。 ### FusedMulAddAdd(四元融合 y = x1*x2 + x3 + x4) - 功能:将 Mul→Add→Add 子图融合为单次 kernel 启动,减少两次 GM 中间数据搬运,常用于 BatchMatmul + bias + residual 模式。 - dtype:FLOAT16 / FLOAT / INT32(不支持 bf16);浮点通路 fp32 中间精度 Vec::Mul + Vec::Add + Vec::Add,计算顺序 ((x1*x2)+x3)+x4 固定不可交换。 三者共性:仅 Ascend 950 实现,kernel 为 AIV_ONLY;InferShape 复用 Ops::Base::InferShape4Broadcast,Tiling 复用 Ops::Base::BroadcastBaseTiling;支持任意 NumPy 广播、动态 shape / 动态 rank;各输入与输出须为同一 dtype(不支持 mix-dtype)。 ## 关联的Issue - #1733 https://gitcode.com/cann/ops-math/issues/1733 ## 测试 - InferShape UT:tests/ut/op_host/test_*_infershape.cpp(每算子一份) - Tiling UT:tests/ut/op_host/arch35/test_*_tiling.cpp(每算子一份) - 图模式样例:examples/test_geir_*.cpp,覆盖 fp32/fp16/bf16/int32 基础用例;MulNoNan 另覆盖 0·inf、0·NaN、-0、广播等特殊值 - golden 对标:tests/assets/golden.py ## 文档更新 - 每个算子新增 README.md(功能说明、参数、约束、实现方案、调用样例) ## 类型标签 - [x] 新特性 See merge request: cann/ops-math!3022 | 3 个月前 | |
feat: MulNoNan/FusedMulAdd/FusedMulAddAdd tiling新增输入维度数上限8校验及UT Co-authored-by: tangpingchuan<tangpingchuan@huawei.com> # message auto-generated for no-merge-commit merge: !4294 merge feat/mulnonan-fusedmuladd-dim-check into master feat: MulNoNan/FusedMulAdd/FusedMulAddAdd tiling新增输入维度数上限8校验及UT Created-by: pingchuantang Commit-by: tangpingchuan Merged-by: cann-robot Description: ## 描述 为 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 个文件) cpp 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 为例,另两个算子同构): cpp 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 校验: cpp 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 - #2413 https://gitcode.com/cann/ops-math/issues/2413 ## 测试 - 新增 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 ## 类型标签 - [ ] Bug修复 - [x] 新特性 - [ ] 性能优化 - [x] 文档更新 - [ ] 其他,请描述: See merge request: cann/ops-math!4294 | 1 个月前 |