layernorm + residual + activation为例如何编写一个融合算子(fused op)?以layernorm + residual + activation为例
把多个小算子(如 LayerNorm + residual + activation)合成一个 kernel,减少 kernel launch 开销、中间结果写回 global memory,并提高 访存局部性(中间结果留在 register/shared),从而降延迟、提带宽利用率。
x_norm = LayerNorm(x)(减均值、除方差、仿射),再 out = act(x_norm + residual);若 residual 是 branch 的输入,即 Pre-LN 里「norm → 子层 → + residual」中的那一段。x[i]、residual[i],算 mean/var(可先一遍归约或 Welford),再 normed = (x - mean)/std * gamma + beta,然后 out = act(normed + residual) 写回。这样 norm、加 residual、激活 都在同一 kernel,无中间 global 读写。tl.reduce、tl.load/store 拼一块)、或 TVM/CUTLASS 模板;需处理 反向:若训练,要写融合的 backward(LN 梯度 + residual 直传 + act 梯度)。| 返回模块 | 返回总览 |