1、GPU的前世今生:从图形卡到通用计算处理器
大家好,我是你们的GPU架构讲师。今天咱们聊聊GPU是怎么从一块“画图卡”,变成今天能跑AI、做科学计算的“通用计算处理器”的。
说实话,我刚开始接触GPU的时候,它还是个纯粹的图形加速器。那时候我还在做游戏引擎开发,每天跟顶点着色器、像素着色器打交道。谁能想到,十几年后,我会用同样的硬件去训练神经网络?
GPU架构的演进,有三个关键里程碑。理解了这三个点,你就抓住了GPU发展的主线。
里程碑一:固定功能管线时代(1990s - 2006)
早期的GPU,说白了就是一块“专用芯片”。它只做一件事:把3D场景变成2D画面。
这个阶段的架构是这样的:
- 顶点处理:固定单元,处理三角形顶点变换
- 光栅化:把三角形变成像素点
- 像素处理:给每个像素上色、贴纹理
- 输出合并:把结果写到帧缓冲区
每个阶段都是固定的硬件单元。程序员只能通过API(比如DirectX、OpenGL)去配置参数,没法改变计算逻辑。
关键特征:硬件功能固定,程序员只能“调参数”,不能“写程序”。
我记得那时候做游戏特效,想实现一个自定义的光照模型,得用各种“奇技淫巧”去骗过固定管线。比如用多重纹理混合来模拟复杂光照,效率低得让人抓狂。
里程碑二:可编程着色器时代(2006 - 2010)
2006年,NVIDIA发布了GeForce 8800 GTX。这块卡带来了一个革命性的变化:统一着色器架构。
什么意思呢?以前顶点处理单元和像素处理单元是分开的,各自有各自的硬件。现在,它们被统一成一组通用的计算单元。这些单元既能处理顶点,也能处理像素,还能做几何计算。
这个变化的影响有多大?
- 程序员可以写自己的着色器程序(Shader),不再受固定管线限制
- 硬件利用率大幅提升——顶点任务少的时候,空闲单元可以去做像素计算
- 为后来的通用计算铺平了道路
个人经验:我曾在项目中用着色器实现过一个简单的物理模拟。当时只是为了做粒子特效,但后来发现,这些计算单元其实可以做任何并行计算。嗯,这就是CUDA的雏形。
这个阶段,GPU从“专用硬件”变成了“可编程硬件”。但编程模型还是面向图形的——你得用HLSL或GLSL,还得假装自己在处理三角形和像素。
里程碑三:通用计算处理器时代(2010 - 至今)
2010年,Fermi架构发布。这是NVIDIA第一个专门为通用计算设计的GPU架构。
为什么说它是里程碑?因为从Fermi开始,GPU不再只是“图形卡”,而是真正的并行计算处理器。
关键变化包括:
- 完整的缓存层次结构:L1/L2缓存,支持全局内存、共享内存、常量内存
- 真正的线程调度:硬件支持数千个并发线程,零开销上下文切换
- CUDA编程模型成熟:用C语言扩展就能写GPU程序,不再需要图形API
- 双精度浮点支持:科学计算成为可能
核心突破:GPU从“图形加速器”变成了“数据并行处理器”。你不再需要懂图形学,也能用GPU做计算。
为什么会这样?说白了,GPU架构师们发现了一个事实:图形计算和通用并行计算,底层需求是高度相似的。
- 图形需要处理大量独立的顶点和像素 → 通用计算需要处理大量独立的数据元素
- 图形需要高吞吐量 → 通用计算也需要高吞吐量
- 图形对延迟不敏感 → 通用计算同样可以容忍延迟
所以,与其造两个不同的芯片,不如造一个通用的并行处理器。这就是今天GPU的哲学。
三个里程碑的对比
| 时代 | 代表架构 | 编程模型 | 核心能力 |
|---|---|---|---|
| 固定功能管线 | GeForce 2/4 | 配置参数 | 专用图形加速 |
| 可编程着色器 | GeForce 8/9 | HLSL/GLSL | 可编程图形管线 |
| 通用计算 | Fermi/Kepler/... | CUDA/OpenCL | 通用并行计算 |
避坑指南:我曾经见过有人把GPU通用计算想得太简单,以为“把CPU代码扔到GPU上就能加速”。结果呢?数据拷贝开销比计算还大,性能反而更差。记住:GPU擅长的是大规模数据并行,不是所有任务都适合。
总结
GPU从图形卡到通用计算处理器,本质上是从专用走向通用的过程。三个里程碑对应着三个关键转变:
- 从固定功能到可编程
- 从分离单元到统一架构
- 从图形专用到通用并行
你想想看,如果没有这些演进,今天的大模型训练、科学模拟、视频渲染,可能还在用CPU慢慢跑。嗯,这就是架构创新的力量。
下一章,我们会深入GPU的线程调度机制,看看它到底是怎么同时管理成千上万个线程的。到时候我会分享一些实际项目中的调度优化经验,敬请期待。