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内部的核心组件和数据流向,我画得比较简洁,但关键路径都在了。
从图里能看出来,数据从显存出发,经过控制器、L2缓存、交叉开关,最后才到SM。每一层都有延迟和带宽的权衡。我调驱动时,最喜欢看的就是这个路径上的瓶颈在哪。
小技巧:如果你发现显存带宽利用率不高,先看看L2缓存的命中率。如果命中率低于60%,大概率是数据局部性不好,需要调整数据布局或者线程调度策略。
好了,GPU架构的核心组件和显存技术就聊到这儿。记住一句话:驱动优化的本质,就是让数据在正确的时间出现在正确的位置。理解了SM、显存控制器、显存类型和带宽延迟的关系,你写驱动时心里就有底了。
想要更多资料,联系可可