GPU架构概览:核心组件与显存技术

做驱动开发这些年,我有个很深的体会——不了解GPU硬件架构,写出来的驱动就像蒙着眼睛开车。你调优了半天,可能连瓶颈在哪都没摸到。今天咱们就聊聊GPU的核心骨架,把SM/CU、显存控制器这些关键部件掰开揉碎了讲。

一、GPU的核心计算单元:SM与CU

先说说SM(Streaming Multiprocessor)和CU(Compute Unit)。这两个概念其实是一回事,NVIDIA叫SM,AMD叫CU。说白了,它们就是GPU里的“小处理器核心群”。

一个SM内部包含什么?我列一下关键部件:

  • CUDA核心(或流处理器):真正干活的算术单元
  • 共享内存:线程块内的高速缓存,延迟极低
  • 寄存器文件:每个线程的私有存储
  • 调度器:负责分发指令到各个执行单元
  • 加载/存储单元:处理内存访问请求

我记得有一次调试一个深度学习推理的驱动,发现性能死活上不去。后来一查,是线程块配置太大,共享内存不够用,导致数据频繁溢出到全局显存。嗯,这就是典型的SM资源没用好。

关键点:SM的并行能力取决于它有多少个CUDA核心,但更关键的是你怎么调度线程。一个SM能同时驻留的线程数有限,别一股脑全塞进去。

二、显存控制器:数据搬运的交通枢纽

显存控制器(Memory Controller)是GPU和显存之间的桥梁。你想想看,GPU计算再快,数据搬不进来也是白搭。

显存控制器的主要职责:

  • 管理显存通道的读写请求
  • 处理地址映射和页表查询
  • 协调多个SM对显存的并发访问
  • 执行ECC校验(如果有的话)

我曾经遇到过一个坑:某款显卡在跑高分辨率渲染时,显存带宽利用率只有60%。查了半天,发现是驱动里显存控制器配置的请求队列深度太小,导致大量请求被阻塞。调整之后,带宽利用率直接飙到92%。

个人经验:调试显存控制器时,多关注一下“请求合并”效率。连续地址的访问如果能合并成一个大的突发传输,带宽利用率会高很多。

三、显存类型:GDDR6 vs HBM

现在主流的显存就两种:GDDR6和HBM(高带宽内存)。它们各有各的脾气。

特性 GDDR6 HBM2/HBM2E
带宽 16-24 Gbps/pin 2-3.2 Gbps/pin(但位宽极大)
位宽 32-bit per chip 1024-bit per stack
总带宽 ~500-800 GB/s ~1-2 TB/s
容量 8-16 GB per chip 4-8 GB per stack
功耗 较高 较低
成本 较低 较高
典型应用 消费级显卡 数据中心、HPC

GDDR6的优势在于容量大、成本低。你买个RTX 4090,24GB GDDR6X,打游戏、跑模型都够用。但它的延迟相对高一些,而且功耗不低。

HBM就不一样了。它通过硅中介层(Interposer)把多个DRAM die堆叠在一起,位宽能做到1024位甚至更高。说白了,就是用更宽的“马路”来提升吞吐量。我调过HBM的驱动,那延迟确实低,但驱动配置也复杂得多——需要处理3D堆叠的地址映射、热管理、以及TSV(硅通孔)的可靠性问题。

注意:HBM的ECC是强制开启的,GDDR6的ECC是可选的。如果你做的是高可靠性场景(比如自动驾驶),选HBM会更稳妥。我曾经在GDDR6上遇到过比特翻转导致渲染错误,排查了三天才找到原因。

四、带宽与延迟:性能的双刃剑

带宽和延迟,是显存性能的两个核心指标。很多人只盯着带宽看,其实延迟同样关键。

带宽:单位时间内能传输的数据量。公式很简单:带宽 = 频率 × 位宽 / 8。比如GDDR6跑18Gbps,位宽384-bit,那带宽就是 18 × 384 / 8 = 864 GB/s。

延迟:从发出请求到拿到数据的时间。显存延迟通常在100-300纳秒之间。别小看这几百纳秒,在GPU这种高度并行的架构里,一次延迟可能阻塞成百上千个线程。

我个人的经验是:

  • 计算密集型任务(如矩阵乘法),带宽更重要
  • 访存密集型任务(如图遍历、稀疏计算),延迟更关键
  • 混合型任务,两者都要优化

举个例子,我在优化一个图神经网络推理驱动时,发现显存带宽利用率很高(85%),但性能还是差。后来用profiler一查,发现L2缓存命中率只有40%,大量请求直接穿透到HBM,延迟爆炸。优化了数据布局和缓存策略后,L2命中率提到75%,性能直接翻倍。

避坑指南:我曾经在调GDDR6的时序参数时,为了追求高带宽把频率拉得太高,结果导致数据错误。后来老老实实按照JEDEC标准来,虽然带宽低了5%,但稳定性好得多。记住,稳定压倒一切。

五、GPU架构核心逻辑图

下面这张图展示了GPU内部的核心组件和数据流向,我画得比较简洁,但关键路径都在了。

GPU核心架构概览 SM / CU CUDA核心 / 流处理器 共享内存 / 寄存器 调度器 / 加载存储单元 SM / CU CUDA核心 / 流处理器 共享内存 / 寄存器 调度器 / 加载存储单元 SM / CU CUDA核心 / 流处理器 共享内存 / 寄存器 调度器 / 加载存储单元 Crossbar / 交叉开关网络 L2 缓存 显存控制器 0 显存控制器 1 GDDR6 / HBM GDDR6 / HBM SM/CU Crossbar L2 Cache 显存控制器 显存

从图里能看出来,数据从显存出发,经过控制器、L2缓存、交叉开关,最后才到SM。每一层都有延迟和带宽的权衡。我调驱动时,最喜欢看的就是这个路径上的瓶颈在哪。

小技巧:如果你发现显存带宽利用率不高,先看看L2缓存的命中率。如果命中率低于60%,大概率是数据局部性不好,需要调整数据布局或者线程调度策略。

好了,GPU架构的核心组件和显存技术就聊到这儿。记住一句话:驱动优化的本质,就是让数据在正确的时间出现在正确的位置。理解了SM、显存控制器、显存类型和带宽延迟的关系,你写驱动时心里就有底了。

想要更多资料,联系可可