已关闭
[Requirement|需求建议]: 【社区任务】AcoshGrad算子AscendC实现贡献 #2317
GMOW创建于 7月25日关闭于 7月30日
7月25日 关联了pull request:add acosh_grad
陈思
7月26日 评论:
7月26日 评论:
/assign @gcw_8p1hhlB0


7月26日 将 gcw_8p1hhlB0 设为负责人
7月30日 关闭了 issue
7月30日 添加了label:resolved
/assign @gcw_8p1hhlB0


Thanks for sending an requirement! Please fill in the following template to help quickly solve your problem.
AcoshGrad 算子设计说明
需求背景(required)
需求来源
通过西工大CANN暑期训练营社区任务完成
AcoshGrad算子的 AscendC 改造与性能优化,保持与现有 TBE 算子语义一致。当前参考实现为
docs/AcoshGrad/acosh_grad.py中的 TBE DSL 动态算子,实现目标是在 AscendC 中复现 DSL 计算路径、动态 shape 行为和 dtype 处理策略,并通过手写 kernel 显式控制 UB 复用、分核和流水并行。背景介绍
算子功能
AcoshGrad是Acosh的反向算子。输入y为前向acosh输出,dy为上游梯度,输出z为前向输入的梯度。y、dyzz=sinh(y)dy
由于前向满足
y = acosh(x),有:dxdacosh(x)=sinh(acosh(x))1
因此反向梯度可表示为:
zi=sinh(yi)dyi
TBE 代码没有直接调用
sinh或exp,而是使用 Taylor 多项式和倍角公式近似计算sinh(y):s=8y
p(s)=s(1+s2(3!1+s2(5!1+s27!1)))
r(v)=2vv2+1
sinh(y)≈r(r(r(p(y/8))))
最终:
zi=r(r(r(p(yi/8))))dyi
AcoshGrad 算子实现优化
/usr/local/Ascend/ascend-toolkit/latest/opp/built-in/op_impl/ai_core/tbe/impl/dynamic/acosh_grad.py/usr/local/Ascend/ascend-toolkit/latest/opp/built-in/op_proto/inc//usr/local/Ascend/ascend-toolkit/latest/opp/built-in/op_impl/ai_core/tbe/config/ascend910b当前 AscendC 工程建议路径:
AcoshGrad 算子现状分析
基于
docs/AcoshGrad/acosh_grad.py可归纳:y支持float16/float32/bfloat16;dy支持float16/float32/bfloat16;y与dydtype 必须一致;y与dyshape 必须一致,shape size 上限为2147483648;zdtype 和 shape 与输入保持一致。@register_operator("AcoshGrad")注册的acosh_grad函数;classify([y, dy], OpPatternMode.ELEWISE)做动态 shape elementwise 分类;shape_util.variable_shape([_y, _dy])生成动态 shape placeholder;acosh_grad_compute()构造 DSL 计算图;tbe.auto_schedule(res)自动调度;tbe.build(schedules, config)完成编译。flowtabletiling,也没有多模式 TIK 分支。它本身就是 DSL elementwise 主路径,不存在类似SplitV那种“长 TIK 文件但最终绕到 DSL API”的情况。float16输入在平台支持te.lang.cce.vadd的float32实现时,会先cast_to(float32),最后再 cast 回float16;float32输入直接按float32计算;bfloat16由 DSL 的support_bfp16=True路径支持,代码未显式转float32,AscendC 中建议使用float32计算并按容差与 TBE 对齐。TBE DSL 计算图可归纳为:
cast_to(float32)float16且平台支持高精度路径时执行vmuls(y, 0.125)y/8vmul/vaddss * (1 + s^2 * (1/3! + s^2 * (1/5! + s^2/7!)))vsqrt(..., TBE_HIGH_PRECISION)sqrt(v^2 + 1)v = 2 * v * sqrt(v^2 + 1)vdiv(dy, sinh)z = dy / sinh(y)cast_to(float16)float16时执行TBE/AscendC 总体流程图:
TBE 路径与 AscendC 策略映射:
auto_schedulePIPE_DOUBLE_BUFFERCopyIn -> Compute -> CopyOutauto_scheduleSTATIC_SMALL_OR_LATENCYTPipe/TQue管理开销当前 AscendC tiling key 规划:
PIPE_DOUBLE_BUFFERTPipe/TQue和双缓冲STATIC_SMALL_OR_LATENCY需求分析
外部组件依赖
内部适配模块
float16/float32/bfloat16、非 32B 对齐尾块和特殊值场景。y/8 + Taylor + 3 次 sqrt 倍角 + Div的计算路径。需求模块设计
算子原型
acosh的输出y相同y相同y相同相关约束:
y与dydtype 必须一致。y与dyshape 必须一致。zshape 与y一致。zdtype 与y一致。NDformat;其他同 shape 同 format 的连续 elementwise format 可作为扩展。2147483648。需求详细设计
使能方式
需求总体设计
AscendC host 侧设计
代码位置:
AcoshGrad/op_host/Host 文件职责拆分:
acosh_grad_def.cppacosh_grad_infershape.cppz.shape = y.shape,z.dtype = y.dtypeacosh_grad_tiling.cppacosh_grad_tiling_data.hacosh_grad_tiling_key.hHost 核心执行链路:
y/dy/zshape、dtype、format。y与dyshape、dtype、format 一致。totalLength。dtypeMode:float32 -> 0float16 -> 1bfloat16 -> 2computeMode=0,表示内部使用float32计算。y、dy;z;sinhWork、dyWork、tmpWork三个float32tile。tileLength:float32元素向下对齐;min(AIVCoreNum, ceil(totalLength / 2048));1000;1001。AcoshGradTilingData,设置blockDim=coreNum。AcoshGradTilingData关键字段:totalLengthcoreNumblockLengthtailBlockLengthtileLengthtileNumlastTileLengthtailTileNumtailLastTileLengthdtypeModecomputeModetilingKey1000/1001AscendC host 流程图:
AscendC kernel 侧设计
代码位置:
AcoshGrad/op_kernel/入口分发文件:
op_kernel/acosh_grad.cpp。根据 tiling key 进入不同策略:
KernelAcoshGradPipe<T>KernelAcoshGradStatic<T>Kernel 共性策略:
Init -> Process生命周期。Init阶段绑定 GM 地址、读取 tiling 参数、初始化 queue/buffer。Process阶段按当前 core 的连续线性区间循环处理 tile。CopyIn -> Compute -> CopyOut。float32buffer,输出前 cast 回原 dtype。DataCopyPad或真实 count/mask 处理非 32B 对齐尾块。PIPE_DOUBLE_BUFFER 关键流程:
TPipe。inQueueYinQueueDyoutQueueZsinhWorkdyWorktmpWorky和dy;float32输入 cast 到float32;s = y * 0.125;sinh(s)近似;sinh = 2 * sinh * sqrt(sinh * sinh + 1);z = dy / sinh;z。Compute 关键路径:
Castfloat16/bfloat16转float32Mulss = y * 0.125Mul/Adds/Muls_taylor_sinh_computeMul/Adds/Sqrt/Mul/MulsSqrt使用高精度路径Divz = dy / sinh(y)Castfloat32转回原 dtypeAscendC kernel 分发流程图:
支持硬件
算子约束限制
float16/float32/bfloat16。NDformat。y/dy/zshape 必须一致。y/dy/zdtype 必须一致。sinh(y)==0时输出按硬件Div行为产生inf/nan,不额外 clamp。float32计算;低精度 native compute 只能作为验证后的性能分支。特性交叉分析、可维可测分析
精度标准 / 性能标准
acosh_grad.py的 DSL 计算路径保持一致测试 golden 建议优先使用 TBE 等价公式:
s = y * 0.125 x2 = s * s sinh = s * (1 + x2 * (1/6 + x2 * (1/120 + x2 * (1/5040)))) for _ in range(3): sinh = 2 * sinh * np.sqrt(sinh * sinh + 1) z = dy / sinh建议覆盖:
[1]、[7],验证尾块和低延迟[1024]、[16,1024],验证基本流水float16/float32/bfloat16y接近 0、常规值、较大值、inf/nan可测性分析
AcoshGrad/tests/ut/tests/ut/op_host/test_acosh_grad_tiling.cpptests/ut/op_kernel/test_acosh_grad.cpptests/ut/op_kernel/acosh_grad_data/gen_data.pytests/ut/op_kernel/acosh_grad_data/compare_data.pyAcoshGrad/examples/test_aclnn_acosh_grad.cpp重点验证项:
float16/bfloat16内部float32计算后回写STATIC_SMALL_OR_LATENCYSqrt/Div、MTE2/MTE3 和 Scalar 占比兼容性分析
AcoshGrad输入输出语义一致;exp公式;bfloat16内部float32计算可能与 DSL bf16 低位舍入略有差异,需按 TBE 输出和任务容差验收。