Thanks for sending an requirement! Please fill in the following template to help quickly solve your problem.
一、背景信息 (必填)
MulNoNan 算子实现 y = (x2 == 0) ? 0 : x1 * x2(逐元素乘,支持 ND 广播),用于在 x2 为 0 时输出 0 而不是 Inf*0 = NaN,避免 NaN 在计算图中传播。
y = (x2 == 0) ? 0 : x1 * x2
Inf*0 = NaN
当前 MulNoNan 仅支持 Ascend 950(A5 架构,arch35 tiling)。本需求为其新增 Ascend 910B(A2/A3,升腾 910b,arch22)的独立实现:新增 arch22 tiling(简化 key 配置)、vectorized 通用 kernel 入口,并补齐 op_api 平台判断、算子定义注册、README/CMake 与 arch22 tiling 单测;A5 路径保持不变(其 tiling 迁移至 arch35 目录,行为不变),同时移除调试用的 test.sh。
Inf*0=NaN
总体思路:沿用 A5(arch35)的 DAG 语义 mask = (x2 != 0); y = mask ? (x1 * x2) : 0,在 910B(arch22)上分别实现 host 侧 tiling 与 kernel 侧 vectorized 计算;host 侧按输出 word count 选择多核 block dim 并推导 ND 广播 strides,kernel 侧按 32B/整 tile 对齐做多核分块,未对齐头尾与小广播段走标量兜底。
mask = (x2 != 0); y = mask ? (x1 * x2) : 0
Aclnn 直调:通过 aclnnMulNoNan 接口使能;op_api 侧 IsAiCoreSupport 平台判断由仅 DAV_3510 扩展为 DAV_3510 || DAV_2201(A2/A3),同时注册 MulNoNan 的 op 定义(ge REG_OP)与 AICore ascend910b 配置。
aclnnMulNoNan
IsAiCoreSupport
DAV_3510
DAV_3510 || DAV_2201
MulNoNan
ascend910b
DT_FLOAT16
DT_FLOAT
DT_BF16
op_api/mul_no_nan.cpp
BroadcastInferShape
op_host/arch22/mul_no_nan_tiling.cpp/h
MulNoNanTilingData
SetTilingKey(MUL_NO_NAN_TILING_KEY)
op_host/config/ascend910b/mul_no_nan_simplified_key.ini
[MulNoNan] default=0
op_host/mul_no_nan_def.cpp
AddConfig("ascend910b")
SUPPORT_COMPUTE_UNIT
SUPPORT_TILING_DIR
arch22
tests/ut/op_host/arch22/test_mul_no_nan_tiling.cpp
op_kernel/mul_no_nan.cpp/h
mask = Compares(x2, NE, 0)
mul = x1 * x2
y = Select(mask, mul, 0)
VSEL_TENSOR_SCALAR_MODE
GetBlockIdx/GetBlockNum
[0,total)
Thanks for sending an requirement! Please fill in the following template to help quickly solve your problem.
一、背景信息 (必填)
MulNoNan 算子实现
y = (x2 == 0) ? 0 : x1 * x2(逐元素乘,支持 ND 广播),用于在 x2 为 0 时输出 0 而不是Inf*0 = NaN,避免 NaN 在计算图中传播。当前 MulNoNan 仅支持 Ascend 950(A5 架构,arch35 tiling)。本需求为其新增 Ascend 910B(A2/A3,升腾 910b,arch22)的独立实现:新增 arch22 tiling(简化 key 配置)、vectorized 通用 kernel 入口,并补齐 op_api 平台判断、算子定义注册、README/CMake 与 arch22 tiling 单测;A5 路径保持不变(其 tiling 迁移至 arch35 目录,行为不变),同时移除调试用的 test.sh。
二、价值/作用 (必填)
Inf*0=NaN导致的精度/数值异常问题;三、设计方案 (必填)
总体思路:沿用 A5(arch35)的 DAG 语义
mask = (x2 != 0); y = mask ? (x1 * x2) : 0,在 910B(arch22)上分别实现 host 侧 tiling 与 kernel 侧 vectorized 计算;host 侧按输出 word count 选择多核 block dim 并推导 ND 广播 strides,kernel 侧按 32B/整 tile 对齐做多核分块,未对齐头尾与小广播段走标量兜底。3.1 使能方式(涉及哪些框架:如Aclnn直调、Pytorch训练等)
Aclnn 直调:通过
aclnnMulNoNan接口使能;op_api 侧IsAiCoreSupport平台判断由仅DAV_3510扩展为DAV_3510 || DAV_2201(A2/A3),同时注册MulNoNan的 op 定义(ge REG_OP)与 AICoreascend910b配置。3.2 总体设计
3.2.1 算子支持的数据类型
DT_FLOAT16(fp16)、DT_FLOAT(fp32)、DT_BF16(bf16);3.2.2 host侧设计
op_api/mul_no_nan.cpp):扩展平台支持判断(DAV_3510 / DAV_2201);BroadcastInferShape推导输出 shape;op_host/arch22/mul_no_nan_tiling.cpp/h):MulNoNanTilingData(rank / outputDims / x1、x2 strides);SetTilingKey(MUL_NO_NAN_TILING_KEY),配套op_host/config/ascend910b/mul_no_nan_simplified_key.ini([MulNoNan] default=0);op_host/mul_no_nan_def.cpp增加AddConfig("ascend910b");CMakeSUPPORT_COMPUTE_UNIT增加ascend910b、SUPPORT_TILING_DIR增加arch22;tests/ut/op_host/arch22/test_mul_no_nan_tiling.cpp(fp16/fp32/bf16 同 shape、大 tensor 多核、dtype 不一致拒绝、int32 拒绝等用例)。3.2.3 kernel侧设计
op_kernel/mul_no_nan.cpp/h):mask = Compares(x2, NE, 0)→mul = x1 * x2→y = Select(mask, mul, 0);VSEL_TENSOR_SCALAR_MODE(第二源为标量 0):910B AIV 上 tensor-tensor select 的 bitmap mask 链不可靠,标量模式是 Equal 算子已验证的可靠模式;相比早期 Abs+Muls+Mins 技巧,Select 在零分支不会产生Inf*0=NaN;GetBlockIdx/GetBlockNum划分[0,total),每个 core 的范围按 32B(对齐元素数)及整 tile(2048 元素)对齐,末核收尾保证全覆盖;3.3 支持硬件
3.4 算子约束限制