FlashAttention Forward Pass 流程演示

不再读写庞大的 O(N2) 注意力矩阵 S 和 P。将输入切分为 Block,
通过 Tiling (分块) 和 Algebraic Aggregation (代数聚合),完全在快速 SRAM 中计算后直接写回 HBM。

阶段 0: 初始状态
初始化...
HBM (High Bandwidth Memory - 慢速/大容量)
Q
Q1
Q2
Q3
Q4
K
K1
K2
K3
K4
V
V1
V2
V3
V4

↓ 输出与统计信息 (被初始化为 0 / -∞) ↓
O
0
0
0
0
m, l
-∞, 0
-∞, 0
-∞, 0
-∞, 0
SRAM (On-Chip Cache - 极速/小容量)
外层循环 (常驻)
Empty
内层循环 (流转)
Empty
ALU (算术逻辑单元) 实时计算
Sij = Qi KjT
rowmax/sum: m̃ij, l̃ij, P̃ij
mnewi = max(mi, m̃ij)
Oi ← diag(lnewi)-1 [ Oi + P̃ij Vj ]

阶段总结剖析:代数聚合 (Algebraic Aggregation) 的魔法

传统注意力痛点: 需要完整的 S = QKT 来计算 Softmax 的分母,因此必须把 O(N2) 的庞大矩阵暂存到慢速 HBM 中,导致 IO 瓶颈。
FlashAttention 的解法: Softmax 的分母本质是行的指数和 (rowsum)。我们在 HBM 中只维护 O(N) 级别的统计量:当前的最大值 mi 和指数和 li。
当内层计算出一个新的 Sij 块时:
1. 计算当前块的局部最大值 m̃ij 和局部和 l̃ij。
2. 通过公式 minew = max(mi, m̃ij) 获取全局新最大值。
3. 使用缩放因子 emi - minew 修正历史结果 Oi 和历史和 li。
结果: 算完一块就丢掉一块 Sij,绝不写回 HBM,完美融合了局部计算与全局 Softmax。