CUDA Kernel 面试主线
17 课 GPU 底层算子与性能优化
CUDA Kernel 核心主线
从 GPU 线程映射出发,依次学习 Warp 归约、共享内存 Tiling、Bank Conflict、数值稳定算子(RMSNorm/LayerNorm/Online Softmax)和 Tiled GEMM;之后拆解 DeepSeek 的 DeepGEMM(Hopper TMA + WGMMA 的 FP8 GEMM)与 DeepEP(MoE 专家并行通信),最后覆盖具身与自动驾驶常用算子:Flow Matching 去噪求解器、3D 点云体素化和 QAT 伪量化。
学习目标
熟练掌握 Thread / Warp / Block / Grid 坐标系统与 Grid-Stride Loop;
掌握 Warp Shuffle 指令与 Block 级双阶段树状归约;
掌握 Shared Memory Tiling、Bank Conflict 避让(Padding 技巧)与合并访存(Coalesced Access);
掌握 Online Softmax 与 FlashAttention 前置算法的数学推导与数值稳定设计;
深入理解 Hopper (SM90) 硬件级 TMA、WGMMA 异步流水线与 DeepSeek 细粒度分块量化;
掌握 MoE 专家并行通信拓扑、SM 分区,以及 Mega-MoE 的计算-通信重叠;
掌握具身智能 Flow Matching 去噪积分步进、3D 点云体素化与 QAT 伪量化 STE 底层算子实现。
课程目录
| 课程名称 | 模块归属 |
|---|---|
| 第 1 课:线程映射与 grid-stride loop | CUDA Kernel 基础 |
| 第 2 课:Warp/Block 归约与两阶段求和 | CUDA Kernel 基础 |
| 第 3 课:GEMV 与行级并行 | 线性代数算子 |
| 第 4 课:RMSNorm:统计量与两遍访问 | 归一化算子 |
| 第 5 课:LayerNorm:均值、方差与数值稳定 | 归一化算子 |
| 第 6 课:稳定 Softmax 与朴素复杂度 | 注意力前置算子 |
| 第 7 课:Online Softmax 与可结合状态 | 注意力前置算子 |
| 第 8 课:朴素转置与合并访存 | 访存优化算子 |
| 第 9 课:共享内存转置与 bank conflict | 访存优化算子 |
| 第 10 课:共享内存 Tiled GEMM | 核心矩阵乘算子 |
| 第 11 课:SiLU 与算子融合 | 激活融合算子 |
| 第 12 课:ArgMax 对归约与确定性 | 极值归约算子 |
| 第 13 课:DeepSeek DeepGEMM 核心架构与 Hopper FP8 算子拆解 | 工业前沿进阶 |
| 第 14 课:DeepSeek DeepEP 核心架构与 MoE 专家并行通信算子拆解 | 工业前沿进阶 |
| 第 15 课:具身智能连续动作生成算子:Diffusion Policy 与 Flow Matching 去噪求解器 | 空间具身算子进阶 |
| 第 16 课:自动驾驶与具身感知:3D 点云体素化(Voxelization)与空间聚合算子 | 空间具身算子进阶 |
| 第 17 课:硬件感知量化:QAT 伪量化(FakeQuant)、STE 与对称/非对称算子实战 | 空间具身算子进阶 |
专题演进与架构图稿
1. S = Q K^T 写 HBM
2. softmax(S) 写 HBM
3. P V 再读 HBM
v1 改写为:
按 Q tile 和 K/V tile 流式扫描
只在 SRAM/register 中保留局部 S、P
每行维护 m、l、acc,最后 acc/l 得 O
代价:反向传播重算局部 S/P
收益:中间矩阵显存从 O(N^2) 降到 O(Nd)
Q, K, V, O
Qi, Kj, Vj tile
m, l, acc
v1 典型 sliced-K:不同 warp 分 K/V 切片,Q 对所有 warp 可见;每个 warp 产生局部 acc 后,需要写 SMEM、同步、再归并。
Qi = load Q[i] to SMEM/register
m = -inf; l = 0; acc = 0
for k_block j in 0..T:
Kj,Vj = load K[j],V[j] to SMEM
S = Qi @ Kj.T / sqrt(d)
if causal: S += mask(i,j)
m_new = max(m, rowmax(S))
alpha = exp(m - m_new)
P = exp(S - m_new)
acc = acc * alpha + P @ Vj
l = l * alpha + rowsum(P)
m = m_new
O[i] = acc / l
store O[i], m, l
QK 和 PV MMA
2. 画 HBM 到 SRAM 的 tile 搬运:K/V 一块一块进来,Q block 固定,输出累加。
3. 推 online softmax:m_new、alpha、l、acc 四个状态变量解释清楚。
4. 最后指出 v1 的短板:CTA/warp 划分还不够好,这就自然过渡到 v2。
FlashAttention v1 IO-Aware Tiling 原理 · Excalidraw 源文件
1. 非 matmul 操作占比高
2. 只按 batch/head 并行,长序列小 batch 时 SM 不满
3. sliced-K 需要 warp 间写 SMEM、同步、归并
v2 的三板斧:
减少 rescale/mask/bound check 等非 matmul
沿 sequence 维度增加 CTA 并行
从 sliced-K 改为 sliced-Q,减少 warp 间通信
warp0..3 分别拿 K/V 的不同切片
每个 warp 得到局部 O
写 SMEM -> sync -> reduce
痛点:共享内存读写和同步开销
warp0..3 分别拿 Q 的不同 row 切片
K/V 对所有 warp 共享
每个 warp 直接得到自己的 O 行
收益:基本不需要 warp 间归并
split Qi rows across warps
keep K/V tile visible to all warps
m,l,acc are per Q-row slice
for k_block j:
load Kj,Vj once to SMEM
each warp handles its Q slice:
S_w = Q_w @ Kj.T
apply mask only when needed
online_softmax_update
acc_w += P_w @ Vj
no cross-warp reduction for O slice
store each warp output slice
extra parallelism:
more CTAs cover sequence blocks
improves occupancy when B*H is small
v2 没有改变 exact attention 的数学,主要是让计算更像高效 GEMM。
三个关键词:
1. fewer non-matmul FLOPs
Tensor Core 做 matmul 很快,FP32 exp/max/mask 相对昂贵。
2. sequence parallelism
长序列、小 batch、少 head 时,不能只靠 B*H 个 CTA。
3. sliced-Q work partitioning
Q 行天然独立,按 Q 切能减少 shared memory 通信。
过渡到 v3:
A100 上 v2 已经不错,但 H100 有 TMA/WGMMA/FP8,新硬件能力没吃满。
FlashAttention v2 Work Partitioning 原理 · Excalidraw 源文件
| t0 | t1 | t2 | t3 | t4 | |
|---|---|---|---|---|---|
| Producer warpgroup | TMA load K/V0 | TMA load K/V1 | TMA load K/V2 | TMA load K/V3 | … |
| Consumer A(Q 块 0) | 等待 | GEMM S=QK0T | softmax0 | GEMM PV0 + QK1T | softmax1 |
| Consumer B(Q 块 1) | 等待 | 等待 | GEMM S=QK0T | softmax0 | GEMM PV0 + QK1T |
FlashAttention v3 Hopper 异步流水 · Excalidraw 源文件
Tensor Core BF16 吞吐大幅提升
但 shared memory 带宽、exp 单元等没有同幅提升
结果:
单纯把 v3 搬过来,matmul 更快了,softmax 和数据路径更显眼。
v4 的方向:
更深的 fully async MMA pipeline
更大的 tile,提高 Tensor Core 连续工作量
TMEM 存中间矩阵,减少 SMEM 往返
软件 exp + 条件 rescale,压低非 matmul 开销
反向用 2-CTA MMA 降低 dQ 原子累加和 SMEM 流量
Q/K/V/O
staging
MMA accum
fully async MMA
软 softmax 的意义:exp 和 rescale 变成瓶颈后,用近似/软件化分担特殊函数单元压力;条件 rescale 则跳过不必要的旧 acc/l 重缩放。
init m,l,acc in registers/TMEM
prefetch Q,K,V stages
for k_tile j in pipelined order:
launch async MMA: S_j = Q @ K_j.T
while MMA runs:
schedule softmax for previous S
maybe skip rescale if max change small
softmax stage:
m_new = max(m, rowmax(S_j))
if need_rescale(m, m_new):
acc *= exp_approx(m - m_new)
l *= exp_approx(m - m_new)
P = exp_approx(S_j - m_new)
launch async MMA: acc += P @ V_j
keep intermediates in TMEM when possible
final normalize O = acc / l
backward idea:
2-CTA MMA cooperates on larger tile
reduce SMEM traffic and dQ atomics
v4 的关键词是 Blackwell 非对称瓶颈:Tensor Core 太快后,softmax、SMEM、原子累加和调度成为主要问题,所以要 TMEM、更深 pipeline、软件 exp、条件 rescale、2-CTA MMA。
FlashAttention v4 Blackwell 架构演进 · Excalidraw 源文件
S = QK^T 生成 N x N 分数矩阵
P = softmax(S) 再乘 V
问题:S 和 P 写回 HBM,长序列显存和带宽都爆
不近似,不改变数学结果
把 K/V 分块搬进 SRAM
边算 QK,边做 online softmax,边累加 PV
避免物化完整 N x N 注意力矩阵
m:当前块最大值,用于数值稳定
l:exp 和的缩放累加
O:输出累加器
新块到来时重缩放旧 O 和 l,再加新块贡献
不是 sparse attention,也不是 low-rank 近似
时间复杂度仍是 O(N^2 d)
显存占用从存 N^2 中间矩阵转向 O(Nd)
优势来自 IO-aware kernel fusion 和 tiling
IO-aware tiling
HBM <-> SRAM 少搬数据
更好并行划分
减少非 matmul 和共享内存通信
Hopper 专用
TMA + WGMMA 异步流水
FP8
Blackwell 专用强化
全异步 MMA + TMEM
更激进 softmax
核心:Q 分块,K/V 分块,块内计算 S、P、O
不保存 S/P,反向只保存少量统计量再重算
面试句:用更多计算重算换少写显存,精确结果不变
核心:跨 thread block 并行单个 head
warp 内重新分工,减少 shared memory 往返
面试句:算法思想不变,主要优化 work partitioning
核心:TMA 搬运 + WGMMA 计算异步化
producer-consumer warp specialization
matmul 与 softmax 交错,FP8 低精度并控误差
核心:更深 fully async MMA pipeline,大 tile
TMEM 存中间结果,2-CTA MMA 优化反向
软件 exp 与条件 softmax rescale 降低非 matmul 开销
v1:少搬数据 -> v2:多开并行 -> v3:异步重叠 -> v4:面向 Blackwell 重排 pipeline,削掉非矩阵瓶颈
arXiv 2205.14135 FlashAttention v1
arXiv 2307.08691 FlashAttention-2
arXiv 2407.08608 FlashAttention-3
arXiv 2603.05451 FlashAttention-4
NVIDIA 2024 技术博客与 PyTorch 2026 FlexAttention/FA4 博客
FlashAttention v1→v4 面试讲解时间线 · Excalidraw 源文件