FusedMulAdd【免费下载链接】ops-math本项目是CANN提供的数学类基础计算算子库实现网络在NPU上加速计算。项目地址: https://gitcode.com/cann/ops-math产品支持情况产品是否支持Ascend 950PR/Ascend 950DT√Atlas A3 训练系列产品/Atlas A3 推理系列产品×Atlas A2 训练系列产品/Atlas A2 推理系列产品×Atlas 200I/500 A2 推理产品×Atlas 推理系列产品×Atlas 训练系列产品×本算子目前仅在 Ascend 950 (dav-3510 / Atlas 350 加速卡) 架构上实现功能说明算子功能三元 element-wise 融合算子把Mul → Add子图融合为单次 kernel 启动减少一次 GM 中间数据搬运。计算公式$$y x_1 \cdot x_2 x_3$$三个输入按 NumPy 广播规则两两对齐后逐元素计算。参数说明参数名输入/输出描述数据类型数据格式x1输入乘法第一个输入张量。FLOAT16, FLOAT, INT32NDx2输入乘法第二个输入张量与x1须可广播。FLOAT16, FLOAT, INT32NDx3输入加法侧输入张量与x1 * x2结果须可广播。FLOAT16, FLOAT, INT32NDy输出x1 * x2 x3的结果shape 为三者广播后的统一形状。FLOAT16, FLOAT, INT32ND约束说明x1、x2、x3、y必须为同一种 dtype不支持 mix-dtype。支持任意 NumPy 广播形态含标量[1]、单维 broadcast、跨 rank broadcast。支持动态 shape 与动态 rank。实现方案层文件说明计算图原型op_graph/fused_mul_add_proto.hREG_OP(FusedMulAdd)三输入一输出算子定义op_host/fused_mul_add_def.cppOpDef::AddConfig(ascend950, ...)InferShapeop_host/fused_mul_add_infershape.cpp复用Ops::Base::InferShape4Broadcast(ctx, 3)Tilingop_host/arch35/fused_mul_add_tiling_arch35.{h,cpp}按 dtype 分支调用Ops::Base::BroadcastBaseTilingOpDagDAGop_kernel/arch35/fused_mul_add_dag.hfp32/fp16 通路在 fp32 中间精度下用Vec::Mul Vec::Addint32 通路用Vec::Mul Vec::AddStructop_kernel/arch35/fused_mul_add_struct.hBRC_TEMP_SCH_MODE_KEY_DECL/SELKernel 入口op_kernel/fused_mul_add_apt.cppKERNEL_TASK_TYPE_DEFAULT(KERNEL_TYPE_AIV_ONLY)BroadcastSchschMode, OpDagfp16 / 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【免费下载链接】ops-math本项目是CANN提供的数学类基础计算算子库实现网络在NPU上加速计算。项目地址: https://gitcode.com/cann/ops-math创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
CANN/ops-math 融合乘加算子
FusedMulAdd【免费下载链接】ops-math本项目是CANN提供的数学类基础计算算子库实现网络在NPU上加速计算。项目地址: https://gitcode.com/cann/ops-math产品支持情况产品是否支持Ascend 950PR/Ascend 950DT√Atlas A3 训练系列产品/Atlas A3 推理系列产品×Atlas A2 训练系列产品/Atlas A2 推理系列产品×Atlas 200I/500 A2 推理产品×Atlas 推理系列产品×Atlas 训练系列产品×本算子目前仅在 Ascend 950 (dav-3510 / Atlas 350 加速卡) 架构上实现功能说明算子功能三元 element-wise 融合算子把Mul → Add子图融合为单次 kernel 启动减少一次 GM 中间数据搬运。计算公式$$y x_1 \cdot x_2 x_3$$三个输入按 NumPy 广播规则两两对齐后逐元素计算。参数说明参数名输入/输出描述数据类型数据格式x1输入乘法第一个输入张量。FLOAT16, FLOAT, INT32NDx2输入乘法第二个输入张量与x1须可广播。FLOAT16, FLOAT, INT32NDx3输入加法侧输入张量与x1 * x2结果须可广播。FLOAT16, FLOAT, INT32NDy输出x1 * x2 x3的结果shape 为三者广播后的统一形状。FLOAT16, FLOAT, INT32ND约束说明x1、x2、x3、y必须为同一种 dtype不支持 mix-dtype。支持任意 NumPy 广播形态含标量[1]、单维 broadcast、跨 rank broadcast。支持动态 shape 与动态 rank。实现方案层文件说明计算图原型op_graph/fused_mul_add_proto.hREG_OP(FusedMulAdd)三输入一输出算子定义op_host/fused_mul_add_def.cppOpDef::AddConfig(ascend950, ...)InferShapeop_host/fused_mul_add_infershape.cpp复用Ops::Base::InferShape4Broadcast(ctx, 3)Tilingop_host/arch35/fused_mul_add_tiling_arch35.{h,cpp}按 dtype 分支调用Ops::Base::BroadcastBaseTilingOpDagDAGop_kernel/arch35/fused_mul_add_dag.hfp32/fp16 通路在 fp32 中间精度下用Vec::Mul Vec::Addint32 通路用Vec::Mul Vec::AddStructop_kernel/arch35/fused_mul_add_struct.hBRC_TEMP_SCH_MODE_KEY_DECL/SELKernel 入口op_kernel/fused_mul_add_apt.cppKERNEL_TASK_TYPE_DEFAULT(KERNEL_TYPE_AIV_ONLY)BroadcastSchschMode, OpDagfp16 / 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【免费下载链接】ops-math本项目是CANN提供的数学类基础计算算子库实现网络在NPU上加速计算。项目地址: https://gitcode.com/cann/ops-math创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考