1、GPU发展简史:从图形加速到通用计算
大家好,我是你们的老朋友。今天咱们聊聊GPU的“前世今生”。
很多人觉得GPU就是用来打游戏的,或者跑深度学习的。其实,它走过的路比你想的要曲折得多。我入行那会儿,GPU还只是个“画图工具”,谁能想到它后来能跟CPU平起平坐?
嗯,咱们从头捋一捋。
1.1 固定管线时代:GPU的“原始社会”
上世纪90年代末,GPU刚诞生。那时候的显卡,说白了就是个“硬连线”的图形加速器。
什么叫固定管线?就是芯片里把图形渲染的每一步都焊死了——顶点变换、光栅化、像素填充……你没法改,也没法跳。开发者只能通过调整参数来改变效果,比如换个纹理、改个光照颜色。
典型代表:NVIDIA RIVA TNT、3dfx Voodoo系列。
我记得当时做游戏开发,想实现一个“水面反射”效果,得用一堆trick(技巧)。因为管线是固定的,你没法写代码去控制像素怎么算。说白了,硬件给你什么,你就用什么。
1.2 可编程着色器:GPU的“第一次觉醒”
2001年左右,事情开始变了。NVIDIA GeForce 3 和 ATI Radeon 8500 引入了可编程着色器(Shader)。
你想想看,以前你只能调参数,现在你能写一小段代码,让GPU去执行。这就像从“只能点菜”变成了“能自己写菜谱”。
着色器分两种:
- 顶点着色器(Vertex Shader):控制每个顶点的位置、颜色。
- 像素着色器(Pixel Shader):控制每个像素的最终颜色。
我在项目中遇到过一件事:当时想做一个“卡通渲染”效果,边缘描黑、内部平涂。固定管线根本做不了,但用像素着色器,几十行代码就搞定了。那一刻我真切感受到——GPU要变天了。
1.3 统一架构:GPU的“大一统”
2006年,NVIDIA GeForce 8800 GTX 发布,带来了统一架构(Unified Shader Architecture)。
为什么说这是关键节点?因为之前顶点着色器和像素着色器是分开的硬件单元。你顶点算得多,像素闲着;像素忙死,顶点闲着。资源浪费严重。
统一架构把所有着色器都变成了通用的“流处理器”(Stream Processor)。它们可以灵活分配:今天跑顶点,明天跑像素,后天跑计算。说白了,就是“哪里需要哪里搬”。
我建议你记住这个时间点:2006年。这是GPU从“专用图形芯片”走向“通用并行处理器”的转折点。
| 架构 | 特点 | 代表产品 |
|---|---|---|
| 固定管线 | 硬件固定,不可编程 | RIVA TNT |
| 可编程着色器 | 分离的VS/PS单元 | GeForce 3 |
| 统一架构 | 通用流处理器 | GeForce 8800 GTX |
1.4 CUDA核心:GPU的“通用计算时代”
2007年,NVIDIA 发布了 CUDA(Compute Unified Device Architecture)。
这才是真正炸裂的东西。以前你想用GPU做通用计算,得把问题伪装成图形渲染——比如用像素着色器算物理模拟,那代码写得叫一个痛苦。
CUDA 直接让你用C语言写GPU程序。你不需要懂图形学,不需要管顶点还是像素。你只需要把数据扔给GPU,告诉它“并行地算这个函数”。
我个人习惯把CUDA核心理解为“极度简化的CPU核心”。它没有复杂的分支预测、乱序执行,但胜在数量多——一个GPU里有几千个CUDA核心,同时跑几千个线程。
我记得第一次用CUDA写矩阵乘法,CPU版本跑了2秒,GPU版本只用了0.02秒。当时我盯着屏幕愣了好几秒——这差距,太夸张了。
1.5 架构演进的核心逻辑
咱们总结一下,GPU架构演进其实就一条主线:从专用走向通用,从固定走向可编程。
为什么?因为市场需求变了。早期只需要画图,后来需要特效,再后来需要科学计算、AI训练。硬件必须越来越灵活。
我画了一张图,帮你理清这个脉络:
1.6 我的几点感悟
做了这么多年GPU相关的工作,我有几点体会想分享给你:
- 别把GPU当CPU用。 GPU擅长的是“大量简单任务并行”,不是“少量复杂任务串行”。我见过有人拿GPU跑单线程递归,那效率还不如十年前的老CPU。
- 理解架构才能写出好代码。 你知道为什么CUDA里要分Block和Grid吗?因为硬件上SM里的共享内存是有限的,线程同步也是以Block为单位的。不懂这些,你写的并行代码可能比串行还慢。
- 历史总是在重复。 从固定管线到可编程,从专用到通用,这个趋势不仅在GPU上发生。你看现在的DPU、NPU,是不是也在走同样的路?
好了,这一章就聊到这儿。GPU从画图工具变成计算利器,走了将近20年。下一章咱们会深入CUDA编程模型,看看怎么真正让GPU跑起来。