GPU 微架构与 Roofline 模型:算力、带宽与干扰的物理根因
GPU 的“快”受两道互不相关的上限约束——算力上限与带宽上限,正是 Roofline 模型(屋顶线模型)刻画的两条屋顶线。不知道负载撞上的是哪一条,所有利用率数字、选型决策与共享策略都是在猜。
GPU 基础认知一章建立了“GPU 是吞吐设备”的心智模型。本章把模型落到数字上:芯片里有什么、每层有多快、以及如何用 Roofline 模型判断一个负载的瓶颈。这些数字是后续硬切分与软切分中“为什么 core 份额对某些负载无效”、可观测与计量中“为什么利用率会骗人”的物理根因。
SM、warp 与张量核:算力的三个层级
一块 H100 SXM 有 132 个 SM(Streaming Multiprocessor)。SM 是 GPU 的基本“工作间”,每个 SM 内部:
- 4 个 warp 调度器:每周期各发射一条指令。调度的最小单位是 warp,即 32 个线程绑在一起执行同一条指令。GPU 不会调度“单个线程”,正如 Kubernetes 不会调度“半个容器”。
- 普通算术单元(FP32):合计约 67 TFLOPS。
- 张量核(Tensor Core):专用矩阵乘加单元,稠密 BF16 约 989 TFLOPS,是普通算术单元的 15 倍。
GPU 隐藏内存延迟的方式不是 CPU 式的乱序执行与预测,而是用海量并行 warp 互相填补空转:一个 warp 等显存,调度器立刻切换到另一个就绪的 warp。这解释了为什么 GPU 程序“并发度不足”时性能塌方:不是慢,是没有足够的 warp 可切。
内存层级:一张必须记住的数字表
| 层级 | 容量 | 延迟 | 带宽 | 与 Kubernetes 世界类比 |
|---|---|---|---|---|
| 寄存器 | 256 KB/SM | ~0 | 极高 | CPU 寄存器 |
| 共享内存/L1 | 228 KB/SM | ~30 周期 | ~33 TB/s(聚合) | 本地 L1/L2 |
| L2 缓存 | 50 MB(全卡) | ~200 周期 | ~5 TB/s | 节点缓存层 |
| HBM 显存 | 80 GB | ~500 ns | 3.35 TB/s | 节点内存 |
| NVLink(卡间) | 无 | ~1–2 μs | 900 GB/s(双向) | 机柜内专线 |
| PCIe Gen5 x16 | 无 | ~1–2 μs | 64 GB/s | 节点内普通总线 |
| InfiniBand 400G | 无 | ~1–2 μs | ~50 GB/s | 跨节点网络 |
两个推论:
- 数据搬运常常比计算贵。主机到显存走 PCIe,比显存带宽慢 50 倍;跨节点再慢且再窄。这是 GPUDirect RDMA、NVLink 存在的原因,详见互连与集合通信。
- 要把 3.35 TB/s 吃满,同时在飞行中的数据必须约 1.7 MB(带宽 × 延迟)。没有足够的并发读请求,带宽就是纸面数字,这是 GPU 程序深流水线化的根本原因。
Roofline 模型:判断瓶颈的一行公式
一个负载每从显存读取 1 字节能做多少次浮点运算,称为算术强度(AI)。可达性能为:
可达性能 = min(峰值算力, 算术强度 × 显存带宽)这就是 Roofline 模型(屋顶线模型):峰值算力与“算术强度 × 显存带宽”各自画出一道上限,取较低者即负载的性能天花板。H100 的屋脊点(ridge point)约为 295 FLOP/字节:AI 高于此撞算力屋顶线,低于此受带宽屋顶线约束。三个典型负载的位置:
| 负载 | 算术强度 | 可达性能 | 受哪条屋顶线约束 |
|---|---|---|---|
| 大矩阵乘法(4096³) | ~1000+ | ~989 TFLOPS(100%) | 算力 |
| 中小矩阵(128³,分块后) | ~40 | ~140 TFLOPS(14%) | 带宽 |
| LLM 解码(逐 token 生成) | ~1 | ~3.4 TFLOPS(0.3%) | 带宽(灾难性) |
解码行是理解推理平台一切现象的钥匙:生成每个 token 都要把全部模型权重从显存读一遍,每读 2 字节只做 1 次乘加。单路解码的速度上限 ≈ 显存带宽 ÷ 权重量(H100 跑 70B BF16 ≈ 24 token/s),与买了多少 FLOPS 无关。批量推理之所以能把吞吐拉高几十倍,本质是把“读一遍权重”摊到多个请求上,把算术强度从 1 提到 B。展开见LLM 推理的物理层。
由此还能读出选型与优化语言:
- 换 H200(算力不变、带宽 1.43 倍)能让解码提速 43%:推理选型买的是带宽和容量,不是 FLOPS。
- 权重量化(FP8/INT4)直接成倍提升解码速度,因为它减少的是要读的字节数。
- “GPU 利用率只有 5% 算力”的推理集群可能是健康的,判定标准见GPU 指标语义。
功耗墙:共享场景的隐形干扰源
H100 满载 700W。多个租户共用一块卡时,总功耗可能触发功率墙,驱动随即降频,所有租户一起变慢 10–20%,而任何“利用率”指标都看不出原因。这是数据平面各共享机制共同的盲区:时间片、MPS、软切分都不管理功耗。
nvidia-smi --query-gpu=clocks.sm,clocks_throttle_reasons.active,power.draw --format=csv -l 1
# 看到 "SW Power Cap" 活跃且 SM 时钟下降,即触发功率墙常见误区
| 误区 | 真相 |
|---|---|
| 利用率 100% = 干满活了 | 利用率只表示“有 kernel 在跑”,与算力、带宽占用无关 |
| 算力高就是好卡(对推理) | 解码受带宽屋顶线约束;H200 只加带宽就能快 43% |
| 张量核是可选加速 | 不走张量核等效 1/15 算力的卡 |
| 显存 80GB 就能塞 75GB 负载 | 还有每进程 0.3–0.8GB 上下文、碎片与框架开销,见显存管理 |
| 共享卡上变慢一定是邻居抢算力 | 功耗墙降频与 L2 缓存冲刷同样常见且更隐蔽 |
总结
微架构层的三个事实贯穿全书:张量核贡献了几乎全部算力;显存带宽是与算力并列的第二条屋顶线,且是推理负载的真正瓶颈;功耗与缓存是共享场景的隐形干扰源。带着 Roofline 模型看后续章节:软切分的 core 份额只管时间、管不了带宽(硬切分与软切分),MIG 之所以隔离强是因为它连显存带宽都切了(MIG),而监控必须同时看算力与带宽两条管道(GPU 指标语义)。