文件最后提交记录最后更新时间
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!30501 天前
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(二元安全乘法) - 功能:屏蔽 Mul0·inf=NaN0·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·inf0·NaN-0、广播等特殊值 - golden 对标:tests/assets/golden.py ## 文档更新 - 每个算子新增 README.md(功能说明、参数、约束、实现方案、调用样例) ## 类型标签 - [x] 新特性 See merge request: cann/ops-math!30223 天前
test: 丰富三个算子(fused_mul_add/fused_mul_add_add/mul_no_nan)的 broadcast 用例并完善 arch35 example Co-authored-by: tangpingchuan<tangpingchuan@huawei.com> # message auto-generated for no-merge-commit merge: !3043 merge fix/mul-no-nan-inf-compare into master test: 丰富三个算子(fused_mul_add/fused_mul_add_add/mul_no_nan)的 broadcast 用例并完善 arch35 example Created-by: pingchuantang Commit-by: tangpingchuan Merged-by: cann-robot Description: ## 描述 本 PR 完善 fused_mul_add、fused_mul_add_add、mul_no_nan 三个 element-wise 广播算子的 broadcast 测试覆盖与可维护性,主要改动如下: 1. infershape UT 丰富 broadcast 形状用例(三算子各自 tests/ut/op_host 下的 infershape UT): - fused_mul_add 新增 4 组、fused_mul_add_add 新增 5 组、mul_no_nan 新增 4 组; - 覆盖标量×2D、行×列互广播 {1,5}×{5,1}→{5,5}、3D 互广播 {2,1,4}×{1,3,4}→{2,3,4}、跨 rank、按轴广播 →[4,3,5]、尾列向量 {4,1}×{4,6}→{4,6} 等场景,含 fp32/fp16/int32 数据类型。 2. arch35 图模式 example 增补 broadcast 场景并修正 proto 头相对路径(三算子各自 examples/arch35 下的 test_geir 用例): - 将 proto 头的相对路径由 ../op_graph/<算子>_proto.h 修正为 ../../op_graph/<算子>_proto.h(多了一级 examples/arch35 目录); - 各 example 增加多组 broadcast 测试数据; - mul_no_nan example 修复 inf==inf / -inf==-inf 的结果比对逻辑(got == expected 直接判过,避免 inf-inf=NaN 误判)。 3. infershape 增加调试日志(三算子各自 op_host 下的 infershape 实现):引入 log/log.h,入口处增加 OP_LOGD;mul_no_nan 由直接绑定 Ops::Base::InferShape4Broadcast 改为包装函数 InferShape4MulNoNan 以承载日志。 4. README 维护(三算子各自 README.md):移除过时的『仅在 Ascend 950 架构上实现』限制说明;fused_mul_add / fused_mul_add_add 补充图模式『调用说明』表格。 说明:改动集中在三算子的 UT、arch35 example、infershape 入口与 README,未改动算子核心计算逻辑。 ## 关联的Issue - #1741 https://gitcode.com/cann/ops-math/issues/1741 ## 测试 - 三算子 infershape UT 新增 broadcast 形状用例(标量/行列互广播/3D/跨rank/按轴/列向量,fp32/fp16/int32),随 op_host UT 一并执行; - arch35 图模式 example 增补 broadcast 场景,验证修正头路径后可正确构图调用。 ## 文档更新 - 更新 math/fused_mul_add/README.md、math/fused_mul_add_add/README.md、math/mul_no_nan/README.md:移除过时架构限制说明,前两者补充图模式调用说明表格。 ## 类型标签 - [ ] Bug修复 - [ ] 新特性 - [ ] 性能优化 - [x] 文档更新 - [x] 其他,请描述:丰富三算子 broadcast 形状 UT 用例、完善 arch35 example 与 infershape 日志 See merge request: cann/ops-math!30432 天前
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(二元安全乘法) - 功能:屏蔽 Mul0·inf=NaN0·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·inf0·NaN-0、广播等特殊值 - golden 对标:tests/assets/golden.py ## 文档更新 - 每个算子新增 README.md(功能说明、参数、约束、实现方案、调用样例) ## 类型标签 - [x] 新特性 See merge request: cann/ops-math!30223 天前
test: 丰富三个算子(fused_mul_add/fused_mul_add_add/mul_no_nan)的 broadcast 用例并完善 arch35 example Co-authored-by: tangpingchuan<tangpingchuan@huawei.com> # message auto-generated for no-merge-commit merge: !3043 merge fix/mul-no-nan-inf-compare into master test: 丰富三个算子(fused_mul_add/fused_mul_add_add/mul_no_nan)的 broadcast 用例并完善 arch35 example Created-by: pingchuantang Commit-by: tangpingchuan Merged-by: cann-robot Description: ## 描述 本 PR 完善 fused_mul_add、fused_mul_add_add、mul_no_nan 三个 element-wise 广播算子的 broadcast 测试覆盖与可维护性,主要改动如下: 1. infershape UT 丰富 broadcast 形状用例(三算子各自 tests/ut/op_host 下的 infershape UT): - fused_mul_add 新增 4 组、fused_mul_add_add 新增 5 组、mul_no_nan 新增 4 组; - 覆盖标量×2D、行×列互广播 {1,5}×{5,1}→{5,5}、3D 互广播 {2,1,4}×{1,3,4}→{2,3,4}、跨 rank、按轴广播 →[4,3,5]、尾列向量 {4,1}×{4,6}→{4,6} 等场景,含 fp32/fp16/int32 数据类型。 2. arch35 图模式 example 增补 broadcast 场景并修正 proto 头相对路径(三算子各自 examples/arch35 下的 test_geir 用例): - 将 proto 头的相对路径由 ../op_graph/<算子>_proto.h 修正为 ../../op_graph/<算子>_proto.h(多了一级 examples/arch35 目录); - 各 example 增加多组 broadcast 测试数据; - mul_no_nan example 修复 inf==inf / -inf==-inf 的结果比对逻辑(got == expected 直接判过,避免 inf-inf=NaN 误判)。 3. infershape 增加调试日志(三算子各自 op_host 下的 infershape 实现):引入 log/log.h,入口处增加 OP_LOGD;mul_no_nan 由直接绑定 Ops::Base::InferShape4Broadcast 改为包装函数 InferShape4MulNoNan 以承载日志。 4. README 维护(三算子各自 README.md):移除过时的『仅在 Ascend 950 架构上实现』限制说明;fused_mul_add / fused_mul_add_add 补充图模式『调用说明』表格。 说明:改动集中在三算子的 UT、arch35 example、infershape 入口与 README,未改动算子核心计算逻辑。 ## 关联的Issue - #1741 https://gitcode.com/cann/ops-math/issues/1741 ## 测试 - 三算子 infershape UT 新增 broadcast 形状用例(标量/行列互广播/3D/跨rank/按轴/列向量,fp32/fp16/int32),随 op_host UT 一并执行; - arch35 图模式 example 增补 broadcast 场景,验证修正头路径后可正确构图调用。 ## 文档更新 - 更新 math/fused_mul_add/README.md、math/fused_mul_add_add/README.md、math/mul_no_nan/README.md:移除过时架构限制说明,前两者补充图模式调用说明表格。 ## 类型标签 - [ ] Bug修复 - [ ] 新特性 - [ ] 性能优化 - [x] 文档更新 - [x] 其他,请描述:丰富三算子 broadcast 形状 UT 用例、完善 arch35 example 与 infershape 日志 See merge request: cann/ops-math!30432 天前
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(二元安全乘法) - 功能:屏蔽 Mul0·inf=NaN0·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·inf0·NaN-0、广播等特殊值 - golden 对标:tests/assets/golden.py ## 文档更新 - 每个算子新增 README.md(功能说明、参数、约束、实现方案、调用样例) ## 类型标签 - [x] 新特性 See merge request: cann/ops-math!30223 天前
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!30501 天前
README.md

FusedMulAdd

产品支持情况

产品 是否支持
Ascend 950PR/Ascend 950DT
Atlas A3 训练系列产品/Atlas A3 推理系列产品 ×
Atlas A2 训练系列产品/Atlas A2 推理系列产品 ×
Atlas 200I/500 A2 推理产品 ×
Atlas 推理系列产品 ×
Atlas 训练系列产品 ×

功能说明

  • 算子功能:将 MulAdd 子图融合为单个算子,对三个输入按 NumPy 广播规则对齐后逐元素计算乘加。

  • 计算公式:

    y=x1×x2+x3y = x_1 \times x_2 + x_3

参数说明

参数名 输入/输出/属性 描述 数据类型 数据格式
x1 输入 公式中的乘法输入张量x1。 FLOAT16, FLOAT, INT32 ND
x2 输入 公式中的乘法输入张量x2,shape需与x1可广播。 同x1 ND
x3 输入 公式中的加法输入张量x3,shape需与x1*x2的结果可广播。 同x1 ND
y 输出 公式中的输出张量y,shape为x1、x2、x3广播后的统一形状。 同x1 ND

约束说明

  • x1、x2、x3、y 必须为同一种数据类型,不支持混合数据类型。
  • 支持任意 NumPy 广播形态(含标量、单维 broadcast、跨 rank broadcast),支持动态 shape 与动态 rank。

实现方案

文件 说明
计算图原型 op_graph/fused_mul_add_proto.h REG_OP(FusedMulAdd),三输入一输出
算子定义 op_host/fused_mul_add_def.cpp OpDef::AddConfig("ascend950", ...)
InferShape op_host/fused_mul_add_infershape.cpp 复用 Ops::Base::InferShape4Broadcast(ctx, 3)
Tiling op_host/arch35/fused_mul_add_tiling_arch35.{h,cpp} 按 dtype 分支调用 Ops::Base::BroadcastBaseTiling<OpDag>
DAG op_kernel/arch35/fused_mul_add_dag.h fp32/fp16 通路在 fp32 中间精度下用 Vec::Mul + Vec::Add;int32 通路用 Vec::Mul + Vec::Add
Struct op_kernel/arch35/fused_mul_add_struct.h BRC_TEMP_SCH_MODE_KEY_DECL/SEL
Kernel 入口 op_kernel/fused_mul_add_apt.cpp KERNEL_TASK_TYPE_DEFAULT(KERNEL_TYPE_AIV_ONLY) + BroadcastSch<schMode, OpDag>

fp16 / fp32 通路

In0/In1/In2 -- CopyInBrc -- Cast(->fp32) -- Vec::Mul(x1,x2) -- Vec::Add(+x3) -- Cast(->T,RINT) -- CopyOut -- Out0

全部输入先 Cast 到 fp32,再用 Vec::Mul + Vec::Add 两段式按公式 y = x1 * x2 + x3 顺序计算,最后 Cast 回 T 写出。

此处不使用 Vec::FusedMulAdd。该 API 底层实现会 in-place 写回 src2 buffer, 在 broadcast 大 tensor 跨 tile 复用输入 UB buffer 时会污染下一 tile 的输入, 导致 fp32/fp16 huge broadcast 场景精度错误。使用普通 Vec::Mul + Vec::Add 保证所有 placeholder 派生的 cast 结果只读。

int32 通路

In0/In1/In2 -- CopyInBrc -- Vec::Mul(x1,x2) -- Vec::Add(+x3) -- CopyOut -- Out0

调用说明

调用方式 样例代码 说明
图模式 test_geir_fused_mul_add 通过算子IR构图方式调用FusedMulAdd算子。