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利用率死活上不去。后来一查,是他的模型里大量使用了 sigmoidtanh 这类非线性激活函数。这些函数在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虚拟化的主流方案,看看各家是怎么在硬件之上“切蛋糕”的。