| 文件 | 最后提交记录 | 最后更新时间 |
|---|---|---|
docs: 统一三个 math 算子文档格式并补充 example 空张量用例与 shape 校验 Co-authored-by: tangpingchuan<tangpingchuan@huawei.com> # message auto-generated for no-merge-commit merge: !3050 merge master into master docs: 统一三个 math 算子文档格式并补充 example 空张量用例与 shape 校验 Created-by: pingchuantang Commit-by: tangpingchuan Merged-by: cann-robot Description: ## 描述 本 PR 对 math 下 fused_mul_add、fused_mul_add_add、mul_no_nan 三个算子的文档与 example 测试做规范化与增强,不涉及 kernel 计算逻辑变更。 主要改动: 1. README 文档规范化(三个算子统一) - 功能说明:精简描述,去除加粗噪声,统一行文。 - 参数说明:由 Markdown 表格统一改为标准 HTML <table> 格式(固定列宽、“输入/输出/属性”表头、dtype 用“同x1”表述)。 - 约束说明:整理措辞并补充语义说明。 2. example 测试增强(三个 test_geir_*.cpp) - 新增输出 shape 校验:依据 outShape 计算期望 numel,与实际输出 numel 比对,不一致打印 "SHAPE MISMATCH" 并计入失败。 - 新增空 tensor(numel==0)用例:fp32_empty、fp32_empty_bc。 3. fused_mul_add_add 约束澄清 - proto.h 接口注释 + README 约束说明明确:x1 必须为完整输出 shape,x2/x3/x4 向上广播到 x1;当前 runtime 不支持 x1 自身向上广播(如 x1=[1]、x3=[3,4]),该类用例在 RunGraph 阶段失败。 - example 移除依赖“x1 向上广播”的 4 个用例(fp32_bc_scalar / fp32_bc_rowcol / fp32_bc_3d / fp16_bc_mixed),它们暴露的是 runtime 限制。 ## 关联的Issue - #1752 ## 测试 - example 覆盖 fp32/fp16/int32/bf16 基础用例、广播用例、关键特殊值(0·inf、0·NaN、-0);本 PR 新增空 tensor 用例与输出 shape 校验。 ## 文档更新 - 更新 fused_mul_add/README.md、fused_mul_add_add/README.md、mul_no_nan/README.md。 - 更新 fused_mul_add_add/op_graph/fused_mul_add_add_proto.h 接口注释。 ## 类型标签 - [x] 文档更新 - [x] 其他:增强 example 测试覆盖(空 tensor 用例 + 输出 shape 校验) See merge request: cann/ops-math!3050 | 3 个月前 | |
迁移开源TF插件--math Co-authored-by: yaochen<yaochen15@huawei.com> # message auto-generated for no-merge-commit merge: !4308 merge transfer-math into master 迁移开源TF插件--math Created-by: nextyale Commit-by: yaochen Merged-by: cann-robot Description: ## 描述 <!--在这里详细描述你的改动,包括改动的原因和所采取的方法。--> ## 关联的Issue <!-- 如果这个PR是为了解决特定的Issue,请在这里提供Issue链接。--> <!-- 如果这个PR是为了解决特定的问题单,请在这里描述问题单单号。--> ## 测试 <!--描述进行了哪些测试来验证你的改动。包括但不限于二级冒烟、算子泛化等。--> ## 文档更新 <!--如果这个PR包含文档的更新,请在这里指出。例如:更新了README.md文件。--> ## 类型标签 <!-- [x] 表示选中 --> - [ ] Bug修复 - [ ] 新特性 - [ ] 性能优化 - [ ] 文档更新 - [x] 其他,请描述:迁移TF插件 See merge request: cann/ops-math!4308 | 1 个月前 | |
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 个月前 | |
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 个月前 | |
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 个月前 | |
docs: 更新 fused_mul_add/fused_mul_add_add/mul_no_nan 算子 README 产品支持表,标记 Atlas A2/A3 系列产品为支持 Co-authored-by: tangpingchuan<tangpingchuan@huawei.com> # message auto-generated for no-merge-commit merge: !4554 merge master into master docs: 更新 fused_mul_add/fused_mul_add_add/mul_no_nan 算子 README 产品支持表,标记 Atlas A2/A3 系列产品为支持 Created-by: pingchuantang Commit-by: tangpingchuan Merged-by: cann-robot Description: ## 描述 更新 fused_mul_add、fused_mul_add_add、mul_no_nan 三个算子的 README「产品支持情况」表,将 Atlas A2/A3 训练/推理系列产品由「不支持(×)」标记为「支持(√)」。 ## 关联的Issue - #2583 ## 测试 本次为纯文档变更(README 产品支持表更新),不涉及算子功能逻辑改动,无需算子功能测试。 ## 文档更新 - math/fused_mul_add/README.md:产品支持表标记 Atlas A2/A3 训练/推理系列产品为支持 - math/fused_mul_add_add/README.md:产品支持表标记 Atlas A2/A3 训练/推理系列产品为支持 - math/mul_no_nan/README.md:产品支持表标记 Atlas A2/A3 训练/推理系列产品为支持 ## 类型标签 - [ ] Bug修复 - [ ] 新特性 - [ ] 性能优化 - [x] 文档更新 - [ ] 其他,请描述: See merge request: cann/ops-math!4554 | 28 天前 |
MulNoNan
产品支持情况
| 产品 | 是否支持 |
|---|---|
| Ascend 950PR/Ascend 950DT | √ |
| Atlas A3 训练系列产品/Atlas A3 推理系列产品 | √ |
| Atlas A2 训练系列产品/Atlas A2 推理系列产品 | √ |
| Atlas 200I/500 A2 推理产品 | × |
| Atlas 推理系列产品 | × |
| Atlas 训练系列产品 | × |
功能说明
-
算子功能:完成安全乘法计算,当x2为0时返回0,从而屏蔽
0 * inf = NaN、0 * NaN = NaN两类异常。等价于TensorFlow的tf.math.multiply_no_nans。 -
计算公式:
y={0,if x2=0x1×x2,if x2≠0y = \begin{cases} 0, & \text{if } x2 = 0 \\ x1 \times x2, & \text{if } x2 \neq 0 \end{cases} y={0,x1×x2,if x2=0if x2=0
参数说明
| 参数名 | 输入/输出/属性 | 描述 | 数据类型 | 数据格式 |
|---|---|---|---|---|
| x1 | 输入 | 公式中的乘法输入张量x1。 | FLOAT16, FLOAT, INT32, BFLOAT16 | ND |
| x2 | 输入 | 公式中的乘法输入张量x2,作为判0主体,shape需与x1可广播。 | 同x1 | ND |
| y | 输出 | 公式中的输出张量y,shape为x1、x2广播后的统一形状。 | 同x1 | ND |
约束说明
- x1、x2、y必须为同一种数据类型,不支持混合数据类型。
- x1、x2的维度数(rank)均不能超过8,超过时在tiling阶段校验失败。
- 仅判x2一侧,
x2 = -0同样进入零臂(IEEE-754-0 == 0);x2 != 0时所有IEEE行为按普通乘法保留(NaN / Inf正常传播)。 - 支持任意NumPy广播形态(含标量、单维broadcast、跨rank broadcast),支持动态shape与动态rank。
实现方案
| 层 | 文件 | 说明 |
|---|---|---|
| 计算图原型 | op_graph/mul_no_nan_proto.h |
REG_OP(MulNoNan),二输入一输出 |
| 算子定义 | op_host/mul_no_nan_def.cpp |
OpDef::AddConfig("ascend950", ...) |
| InferShape | op_host/mul_no_nan_infershape.cpp |
复用Ops::Base::InferShape4Broadcast |
| Tiling | op_host/arch35/mul_no_nan_tiling_arch35.{h,cpp} |
按dtype分支调用Ops::Base::BroadcastBaseTiling<OpDag> |
| DAG | op_kernel/arch35/mul_no_nan_dag.h |
fp32/int32通路原生计算;fp16/bf16通路提升fp32中间精度 |
| Struct | op_kernel/arch35/mul_no_nan_struct.h |
BRC_TEMP_SCH_MODE_KEY_DECL/SEL |
| Kernel入口 | op_kernel/mul_no_nan_apt.cpp |
KERNEL_TASK_TYPE_DEFAULT(KERNEL_TYPE_AIV_ONLY) + BroadcastSch<schMode, OpDag> |
fp32 / int32通路
In0/In1 -- CopyInBrc --+
+-- Mul(x1,x2) --+
+-- Select(mask, MulRes, Zero) -- CopyOut -- Out0
Const(0) -- Duplicate -- Zero --+
|
+-- Compare(NE, x2, Zero) -- mask
Vec::Compare<u8, T, NE>输出位掩码,Vec::Select<u8, T, TENSOR_TENSOR>按
mask ? MulRes : Zero逐元素选择。x2 == 0时即使MulRes是NaN(0 · inf
/ 0 · NaN)也被Select丢弃,输出0。
fp16 / bf16通路
In0/In1 -- CopyInBrc -- Cast(->fp32) --+
+-- Mul --+
+-- Select -- Cast(->T,RINT) -- CopyOut -- Out0
Const(0,fp32) -- Duplicate -- Zero --+
|
+-- Compare(NE) -- mask
把fp16 / bf16整体提升到fp32做cmp/sel/mul,末端用CAST_MODE_RINT
(round-to-nearest-even)回退。原因:
- 与DSL
mul_no_nan.py在fp16vcmpsel不可用时fallback到fp32的行为一致; - 避免fp16中间溢出(如
3e4 · 3e4在fp16中先inf再被select处理会 引入额外的saturation不确定性),fp32中间有充足动态范围。
调用说明
| 调用方式 | 样例代码 | 说明 |
|---|---|---|
| 图模式 | test_geir_mul_no_nan | 通过算子IR构图方式调用MulNoNan算子。 |