费曼比喻:教授 vs 工厂万名流水线工人
CPU(中央处理器) 就像一个 诺贝尔奖数学教授。他智商极高,任何复杂的逻辑跳转(逻辑分支)都能瞬间搞定,但他只有一双手,一次只能一题一题算。
GPU(图形处理器) 则是由 10,000 个小学流水线工人(CUDA 核心) 组成的超大型工厂。工人单独拆出来连微积分都不会,但他们被编成一个个严格对齐的小组(Warp 线程束),在统一命令(SIMT)下同时干简单的加减乘除!
追求单线程极速、分支预测与超大 L3 缓存,减少指令等待延迟。
追求极致并行吞吐(SIMT 架构),成千上万线程并发执行。
流多处理器 SM (Streaming Multiprocessor) 深度拆解
GPU 的核心引擎块。旗舰级 H100 GPU 内部包含约 132 个 SM。
SM 内部核心部件详解
-
FP32 / INT32 核心: 处理常规标量浮点与整数算术加减乘除。
-
Tensor Core(张量核心): 专为 AI 打造的专用硬件,一个时钟周期内直接完成矩阵乘加 $D = A \cdot B + C$。
-
Shared Memory(共享内存): 软件可调配的高速片上 SRAM。同一个 Block 块内的线程通过它极速共享数据,避免访问慢速显存。
Warp 线程束执行模型 (32 线程步调一致)
NVIDIA GPU 执行的基本硬件调度单位:32 个线程组成一个 Warp,同时执行同一条指令。
FMA R1, R2, R3 (融合乘加运算)
Clock Cycle #128
费曼提醒:注意“线程束分支分化 (Warp Divergence)”!
如果在 CUDA 代码里写了 if (threadIdx.x % 2 == 0) 这样的条件分支,16 个线程在做 IF 时,另外 16 个线程只能**傻傻干等待**!然后再交换。GPU 性能会直接砍半!因此 AI 算子代码必须极致规避逻辑分支。
Tensor Core: $16 \times 16$ 矩阵乘加 (MMA) 硬件引擎
底层指令 mma.sync 一口气对 $A$ 和 $B$ 矩阵进行乘法,并累加到 $C$ 矩阵中。
费曼比喻:CUDA 编程结构与“办公桌 vs 远处仓库”
• Grid (网格) = 整个大工厂 (GPU 全局)。
• Block (线程块) = 工厂里的某个工作小组 (分配给 1 个 SM)。
• Thread (线程) = 工人组里的某个工人 (CUDA 核心)。
• 寄存器与共享内存 = 你办公桌上的草稿纸(几纳秒拿取)。而 全局显存 (VRAM) = 距离你 50 公里外的大仓库(拿趟数据要耗费 100 倍的时间!)。
CUDA 编程模型层次 $\rightarrow$ 物理硬件映射表
一次内核调用启动的全局海量并发任务。
共享 SRAM,可通过 __syncthreads() 屏障同步。
由 SM 硬件 Warp Scheduler 调度器管理。
拥有专属私有寄存器与 threadIdx.x。
GPU 内存金字塔带宽与访问延迟光谱
当前选中内存层级说明
寄存器:存储线程本地变量。速度极快但容量极为宝贵。如果 Kernel 使用了太多寄存器,GPU 就会被迫减少并发 Warp 数量,导致占用率(Occupancy)下降。
共享内存 (SRAM):CUDA 高性能算法的灵魂!先将数据从慢速 VRAM 批量搬运到 Shared Memory 中,再在 SRAM 里重复利用几十次,是矩阵 Tiling 与 FlashAttention 的底层核心原理。
L2 Cache:硬件自动管理的缓存。跨 SM 共享,帮助缓存频繁被读取的权重与 KV Cache 块。
HBM 显存:虽然 3.35 TB/s 看起来很大,但相比计算核心速度依然极慢(需等待 400 个周期)。因此代码必须提升计算强度(Arithmetic Intensity)才能喂饱 GPU。
CUDA 共享内存分块算法 (Shared Memory Tiling) 模拟器
演示如何通过 SRAM 缓存切块,减少对慢速 VRAM 显存重复读取。
阶段 1: 线程块内的所有线程合作,将矩阵 A 和 B 的第一个 Tile 子块从慢速 VRAM 一起搬运到高带宽 SRAM 共享内存中。 阶段 2: 呼叫硬件核心,在 SRAM 内极速计算子块的点积,速度高达 15+ TB/s!完全不用访问慢速 VRAM。 阶段 3: 覆盖 SRAM 缓存,接着批量拉取下一个 Tile 块的数据进行计算。 阶段 4: 计算完成,将寄存器累加结果统一写回全局 VRAM 矩阵 C。
费曼比喻:LLM 计算的两大瓶颈——计算密集型 vs 内存带宽瓶颈
1. 计算吞吐瓶颈 (Compute-Bound): 比如巨型矩阵相乘 ($Q \times K^T$, FFN 线性层)。这种任务全是密集数学题,GPU Tensor Core 核心可以全力开火 100% 跑满。
2. 显存带宽瓶颈 (Memory-Bound): 比如 Softmax, LayerNorm, 旋转位置编码 (RoPE)。数学公式极简单,但需要把整个大矩阵从 VRAM 读一遍再写一遍!GPU 绝大多数时间在**傻等显存数据送达**。FlashAttention 算法就是为了消除这种等待而发明的!
Transformer 层前向传播 (Forward Pass) 算子流
分步查看单个 Attention & Feed-Forward 层内部的数据计算流程。
将输入的 Token 张量 [Batch=, Seq=, Dim=] 分别乘以 $W_q, W_k, W_v$ 权重矩阵,生成 Q, K, V 三个新张量。属于密集型矩阵乘法。 计算 Token 之间的两两相关性分数,生成 [Batch, Heads, Seq, Seq] 巨型矩阵。确定每个词对其他词的关注度。 对 Attention 矩阵按行进行指数归一化。计算强度极低(极少加减法),但需要读写整个注意力张量。FlashAttention 通过融合算子将其在 SRAM 里直接计算,性能飙升! 将加权注意力值投影回隐藏维度空间 [Batch, Seq, HiddenDim]。 将维度升维 3.5~4 倍(例如从 升至 ),通过 SwiGLU 激活函数提取深层特征后再降维返回。耗费大量 Tensor Core 算力!