【AI Infra小白入门⑨】GPU硬件概论:从SM到Memory Wall,搞懂优化的物理基础
本文是「AI Infra 小白入门」系列的第九篇。不懂硬件的优化是玄学——你连GPU长什么样都不知道,怎么知道优化有没有用?本文用最通俗的语言,带你从里到外认识GPU:CPU和GPU有啥不一样?SM是什么?Tensor Core是啥?存储层次有几级?Memory Wall又是什么?
一、写在前面:为什么要懂硬件?
很多人觉得,“我就是写代码的,懂硬件干嘛?”
但在AI Infra领域,这句话不成立。因为:
- 你做的所有性能优化,最终都要落到硬件上
- 不知道硬件的"脾气",优化就是瞎试——试对了是运气,试错了是常态
- 面试的时候,"这个优化为什么快"是必考题,答案最终都要落到硬件原理上
一句话:不懂硬件的优化,都是玄学。
先上一张GPU架构概览图:
二、GPU vs CPU:两种完全不同的设计哲学
先问一个问题:CPU和GPU都是处理器,为什么GPU做AI计算这么快?
答案是:它们的设计目标完全不一样。
| 维度 | CPU | GPU |
|---|---|---|
| 设计目标 | 低延迟、复杂控制 | 高吞吐、简单并行 |
| 核心数 | 几个到几十个 | 几千个(CUDA Core) |
| 控制逻辑 | 复杂(分支预测、乱序执行) | 简单(SIMT锁步执行) |
| 缓存占比 | 大(用来减少内存延迟) | 小 |
| 适用场景 | 串行/逻辑复杂任务 | 大规模数据并行任务 |
用人话讲:
- CPU是几个聪明的工人——每个都很能干,能处理复杂任务,但人少
- GPU是几千个听话的工人——每个都很简单,只能做简单计算,但人多力量大
深度学习的核心是什么?矩阵乘法——就是那种"数据量大、操作简单、高度并行"的任务。这种任务,交给几千个"听话的工人"一起干,自然比几个"聪明的工人"快得多。
三、GPU内部:SM是基本单元
GPU不是"一个"大处理器,而是由很多个**SM(Streaming Multiprocessor,流多处理器)**组成的。
3.1 GPU = N × SM
GPU = N × SM SM = 寄存器 + Shared Memory/L1 + CUDA Core + Tensor Core + 调度器可以这样理解:
- GPU是一个"大工厂"
- SM就是工厂里的一个个"车间"
- 每个车间里有很多"工人"(CUDA Core、Tensor Core)、“工作台”(寄存器、共享内存)、“工头”(调度器)
所有SM并行工作,这就是GPU算力的来源。
3.2 CUDA Core vs Tensor Core
SM里有两种主要的计算单元:
| 计算单元 | 作用 | 特点 |
|---|---|---|
| CUDA Core | 通用计算(FP32/INT等) | 灵活,但单算力不算高 |
| Tensor Core | 专用矩阵乘(MMA) | 专门做矩阵乘法,算力比CUDA Core高一个数量级 |
Tensor Core是GPU跑深度学习快的关键!
比如A100上,FP16 Tensor Core的算力是312 TFLOPS,而FP32 CUDA Core只有19.5 TFLOPS——差了16倍!
💡为什么现在都用FP16/BF16混合精度训练?一个重要原因就是——只有FP16/BF16/INT8这些精度才能用Tensor Core,算力才能上去。用FP32的话,只能用CUDA Core,慢很多。
3.3 SIMT执行模型
SIMT(Single Instruction, Multiple Threads)——单指令多线程。
简单说就是:同一个Warp(32个线程)里的线程,执行完全相同的指令,步调一致。
如果Warp里的线程走了不同的分支(比如if-else),会发生什么?
- 硬件会先执行A分支,走B分支的线程"摸鱼"
- 然后执行B分支,走A分支的线程"摸鱼"
- 结果就是:性能下降了
这叫分支发散(Branch Divergence),是CUDA编程中要避免的常见问题。
四、存储层次:越近越快,越快越小
GPU的存储是分层的,从近到远、从快到慢:
| 层级 | 容量(以A100为例) | 带宽 | 延迟 | 谁能访问 |
|---|---|---|---|---|
| 寄存器 | 256KB / SM | ~20+ TB/s | 1 cycle | 每个线程私有 |
| Shared Memory / L1 | 192KB / SM | ~19 TB/s | ~30 cycles | 同一个Block内的线程共享 |
| L2 Cache | 40MB | ~5+ TB/s | ~200 cycles | 所有SM共享 |
| HBM(显存) | 40/80GB | 1.5-2 TB/s | ~400+ cycles | 所有SM都能访问 |
| 主机内存(DDR) | TB级 | ~50 GB/s(PCIe) | ~微秒级 | CPU/GPU通过PCIe交换 |
几个数量级的感受:
- 寄存器比显存快几百倍
- 每往下一层,延迟大约涨一个数量级
- 带宽也是逐级下降
🎯优化第一性原理:让数据尽量停留在离计算近的地方。
几乎所有的性能优化,本质上都是在做这件事:
- GEMM tiling:把数据块搬到共享内存里算
- Kernel Fusion:把多个算子合成一个,避免中间结果写到显存再读回来
- FlashAttention:分块计算,不让完整的N²矩阵落到显存
- 寄存器复用:让数据尽量留在寄存器里,少去共享内存/显存读
五、Memory Wall:为什么带宽先成了瓶颈?
5.1 什么是Memory Wall?
有一个残酷的事实:算力的增长速度,远远快于显存带宽的增长速度。
比如A100:
- FP16 Tensor Core算力:312 TFLOPS
- HBM显存带宽:~1.5 TB/s
这意味着什么?如果一个kernel需要频繁读写显存,那么即使算力很强,也发挥不出来——显存带宽不够,喂不饱计算单元。
这就叫Memory Wall(显存墙)——算力再高,被带宽卡住了。
5.2 算术强度:判断你的kernel卡在哪
怎么判断一个kernel是被计算卡住了,还是被访存卡住了?
用算术强度(Arithmetic Intensity):
算术强度 = FLOPs / 访存字节数
意思是:每读1字节数据,能做多少次运算。
- 如果算术强度高→ 计算多、访存少 →compute-bound(计算瓶颈)
- 如果算术强度低→ 计算少、访存多 →memory-bound(访存瓶颈)
5.3 Roofline模型:一图看懂
Roofline模型是性能分析的经典工具,它画出来是这样的:
性能(FLOPS) ↑ │ ┌───────────── 算力上限(compute-bound) │ / │ / │ / ← 斜率 = 带宽 │ / │ / │ / │ / └────────────────────→ 算术强度(FLOPs/Byte) ↑ 拐点- 算术强度 < 拐点:memory-bound,性能由带宽决定
- 算术强度 > 拐点:compute-bound,性能由算力决定
A100的拐点大约是200 FLOP/byte。也就是说:
- 每读1字节数据,做不到200次运算 → 卡带宽
- 做到了 → 卡算力
5.4 LLM Decode:典型的Memory-Bound
大模型推理的decode阶段,就是典型的memory-bound:
- 每生成一个token,要把整个模型的权重都读一遍
- 但计算量只有2P FLOPs(P是参数量)
- 算术强度极低 → 完全被显存带宽卡住
这就是为什么量化对推理加速这么有效:
- INT4量化,权重变成原来的1/8
- 读得少了 → 带宽瓶颈缓解了 → 速度就上去了
- (虽然计算精度降低了,但因为本来就不是计算瓶颈,所以影响不大)
六、主流GPU规格速览
| 规格 | A100 | H100 | H200 | Orin AGX |
|---|---|---|---|---|
| 架构 | Ampere | Hopper | Hopper | Ampere |
| 显存 | 40/80GB HBM2e | 80GB HBM3 | 141GB HBM3e | 32/64GB(统一内存) |
| 带宽 | 1.6/2 TB/s | 3.35 TB/s | 4.8 TB/s | ~200 GB/s |
| FP16算力 | 312 TFLOPS | 989 TFLOPS | 989 TFLOPS | ~170 TOPS (INT8) |
| FP8支持 | 无 | 有 | 有 | 无 |
| NVLink | 600 GB/s | 900 GB/s | 900 GB/s | - |
| 功耗 | 250-400W | 700W | 700W | 15-60W |
给小白几个直观感受:
- H100比A100算力翻了3倍,带宽翻了1.7倍
- H200主要提升了显存容量和带宽(适合长上下文大模型)
- 端侧的Orin和数据中心的A100完全不在一个量级——功耗差10倍,算力和带宽差一个数量级
七、GPU互联:多卡之间怎么"传话"
多卡训练/推理时,卡和卡之间需要通信。通信的"通道"有哪些?
| 互联方式 | 带宽(双向) | 典型场景 |
|---|---|---|
| PCIe 4.0 x16 | 64 GB/s | 普通多卡、CPU↔GPU数据搬运 |
| NVLink 3(A100) | 600 GB/s | 节点内8卡全互联 |
| NVLink 4(H100) | 900 GB/s | 节点内8卡 |
| NVSwitch | 全互联交换 | 节点内任意两卡直连 |
| InfiniBand(NDR) | ~50 GB/s | 跨节点通信 |
对并行策略的影响
通信带宽的差异,直接决定了并行策略的设计:
- TP(张量并行):通信量很大(每层都要通信)→ 必须在NVLink域内(节点内)
- PP(流水线并行):通信量小(每阶段只传激活)→ 可以跨节点走IB
- DP(数据并行):每步通信一次梯度 → IB可承受,但也是瓶颈之一
💡 这就是"3D并行"的经典布局:TP放节点内,DP/PP跨节点——不是不想在节点间做TP,是IB带宽不够,扛不住TP的通信量。
八、总结一下
今天这篇文章,我们从里到外认识了GPU:
- GPU vs CPU:CPU是几个聪明的工人,GPU是几千个听话的工人——设计目标不同,适用场景不同
- SM架构:GPU由多个SM组成,SM里有CUDA Core(通用)和Tensor Core(矩阵乘专用)
- 存储层次:寄存器 > Shared Memory > L2 > HBM > 主机内存——逐级变慢,逐级变大。优化的核心就是让数据尽量靠近计算
- Memory Wall:算力增长比带宽快,导致很多kernel是memory-bound。用算术强度判断瓶颈类型
- GPU互联:NVLink比IB快一个数量级,决定了"TP节点内、PP/DP跨节点"的部署铁律
下一篇预告:我们来聊聊集合通信——分布式训练的基础。AllReduce、AllGather、ReduceScatter都是什么?Ring和Tree算法有什么区别?NCCL又是什么?
📚本系列导航:
- 第1篇:一文搞懂什么是AI基础设施:五大方向与不可能三角
- 第2篇:大厂AI Infra组织架构大揭秘
- 第3篇:AI Infra岗位路线图:级别、薪资与成长路径
- 第4篇:AI Infra学习路线图:从入门到精通的完整指南
- 第5篇:AI Infra必备编程基础:Python、C++与Linux速通指南
- 第6篇:AI Infra数学基础速成:线代、概率与微积分(工程向)
- 第7篇:Transformer架构工程拆解:从Attention到MLA的优化密码
- 第8篇:PyTorch框架Infra实战指南:Tensor、autograd与性能调试
- 第9篇:GPU硬件概论:从SM到Memory Wall,搞懂优化的物理基础(本文)
- 第10篇:集合通信基础:AllReduce、Ring算法与NCCL全解析
- 更多内容持续更新中……