2、GPU架构基础:GPU计算单元、显存层次结构、PCIe与NVLink互联
好,咱们直接进入正题。GPU虚拟化这事儿,说白了就是怎么把一块强大的GPU切开来分给多个人用。但你要想切得好,首先得知道这块“肉”到底长什么样。这一章,我就带你从硬件层面把GPU的底裤看穿。
2.1 GPU计算单元:CUDA Core与Tensor Core
很多人一上来就问我:“CUDA Core是不是就是GPU的CPU核心?” 嗯,这么理解也不算全错,但不够准确。我习惯把GPU看作一个超级大的“算术工厂”,而CUDA Core就是工厂里最基础的流水线工人。
CUDA Core 负责的是最基础的标量运算,比如整数加减、浮点乘加(FMA)。每个CUDA Core在一个时钟周期内能执行一条指令。但注意,它不像CPU那样有复杂的乱序执行和分支预测逻辑。说白了,它就是个“傻大个”,只会埋头干活。
我在项目中遇到过一个问题:某个客户跑深度学习推理,发现GPU利用率死活上不去。后来一查,是他的模型里大量使用了 sigmoid 和 tanh 这类非线性激活函数。这些函数在CUDA Core上需要多个指令周期才能算完,效率极低。这时候就该 Tensor Core 出场了。
核心区别:
- CUDA Core:标量单元,适合通用计算、控制流密集的任务。
- Tensor Core:矩阵乘累加单元,专为深度学习设计。一次能算一个4x4矩阵的乘法并累加,吞吐量是CUDA Core的几十倍。
你想想看,一个卷积层里全是矩阵乘法。如果用CUDA Core去算,相当于让一个工人搬一箱砖;而Tensor Core直接开了一台起重机。所以,现在做AI训练和推理,Tensor Core几乎是必选项。
避坑指南: 我曾经在调优一个推理服务时,发现Tensor Core根本没被用上。原因是我的矩阵维度不是8的倍数(Volta架构要求)。后来我手动做了padding,性能直接翻倍。记住:Tensor Core对数据对齐有严格要求,不是随便什么矩阵都能加速的。
2.2 显存层次结构:从HBM到L2 Cache
显存,就是GPU的“工作台”。数据得先搬到显存里,GPU才能算。但显存也有快慢之分,这就引出了层次结构。
我习惯把显存体系比作一个图书馆:
- HBM(高带宽显存):图书馆的总书库,容量大(几十GB),带宽极高(TB/s级别)。但延迟也高,访问一次要几百个时钟周期。
- L2 Cache:图书馆的常用书架,容量小(几MB到几十MB),但速度快得多。
- 寄存器/Shared Memory:你手边的笔记本,容量极小(几十KB),但几乎零延迟。
为什么要有这么多层?说白了就是“成本”和“速度”的妥协。HBM贵啊,而且离计算单元远。所以GPU架构师们就在中间加了一层L2 Cache,把频繁访问的数据缓存起来。
| 层级 | 容量 | 带宽 | 延迟 | 典型用途 |
|---|---|---|---|---|
| HBM | 16-80 GB | ~2 TB/s | ~200 cycles | 存储模型参数、数据集 |
| L2 Cache | 6-40 MB | ~4 TB/s | ~50 cycles | 缓存中间激活值、权重 |
| Shared Memory | 48-164 KB | ~20 TB/s | ~5 cycles | 线程块内数据共享 |
| 寄存器 | 256 KB/SM | 极高 | 1 cycle | 线程私有变量 |
嗯,这里要注意:Shared Memory 是程序员可以手动控制的缓存。我在做矩阵乘法优化时,经常把输入矩阵的子块先加载到Shared Memory里,然后让线程们反复读取。这样能大幅减少对HBM的访问,性能提升非常明显。
警告: 别以为显存大就万事大吉。我曾经遇到一个案例,模型刚好能塞进显存,但训练时频繁报“out of memory”。后来发现是中间激活值占用了大量临时空间。记住:显存不仅要装模型,还要装中间结果。预留20%的余量是基本操作。
2.3 PCIe与NVLink互联:GPU之间的“高速公路”
单卡再强,也有极限。多卡互联才是现代数据中心和超算的常态。那卡和卡之间怎么通信?目前主流就两条路:PCIe 和 NVLink。
PCIe 是通用接口,所有主板都有。但它的带宽有限,PCIe 4.0 x16的单向带宽也就约16 GB/s。而且延迟高,因为要走CPU和系统内存绕一圈。我做个比喻:PCIe就像国道,虽然能走,但车多路窄,还经常要等红绿灯(CPU调度)。
NVLink 是NVIDIA自家的高速互联技术。它直接连接GPU到GPU,不经过CPU。带宽是PCIe的5-10倍,延迟也低得多。NVLink就像一条专属高速公路,GPU之间可以直接“飙车”。
关键差异:
- PCIe:通用、兼容性好、带宽有限、延迟高。适合小规模数据传输或控制指令。
- NVLink:专用、高带宽、低延迟、支持GPU间直接内存访问(GPU Direct RDMA)。适合大规模并行计算,比如多卡训练。
我在搭建一个8卡A100集群时,就深刻体会到了NVLink的重要性。当时跑一个千亿参数的大模型训练,如果只用PCIe互联,通信开销能占到总时间的40%以上。换成NVLink后,通信时间直接降到了10%以内。说白了,没有NVLink,多卡训练就是纸上谈兵。
实战技巧: 如果你用的是NVLink,记得开启 NCCL_P2P_DISABLE=0 环境变量。我曾经因为默认配置没改,导致GPU之间走的是PCIe回环,性能惨不忍睹。另外,NVLink的拓扑结构也很重要——尽量让通信频繁的GPU在同一个NVSwitch域内,避免跨域通信。
最后,我想强调一点:虚拟化技术必须感知这些硬件细节。比如,当你把一张物理GPU切分成多个vGPU时,每个vGPU的显存分配、计算单元隔离、以及跨卡通信路径,都需要基于这些底层架构来设计。否则,你切出来的vGPU性能可能还不如一张低端卡。
好,这一章就到这里。下一章我们聊聊GPU虚拟化的主流方案,看看各家是怎么在硬件之上“切蛋糕”的。