| 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 | 4 天前 |