1、GPU发展简史:从图形加速到通用计算

大家好,我是你们的老朋友。今天咱们聊聊GPU的“前世今生”。

很多人觉得GPU就是用来打游戏的,或者跑深度学习的。其实,它走过的路比你想的要曲折得多。我入行那会儿,GPU还只是个“画图工具”,谁能想到它后来能跟CPU平起平坐?

嗯,咱们从头捋一捋。

1.1 固定管线时代:GPU的“原始社会”

上世纪90年代末,GPU刚诞生。那时候的显卡,说白了就是个“硬连线”的图形加速器。

什么叫固定管线?就是芯片里把图形渲染的每一步都焊死了——顶点变换、光栅化、像素填充……你没法改,也没法跳。开发者只能通过调整参数来改变效果,比如换个纹理、改个光照颜色。

典型代表:NVIDIA RIVA TNT、3dfx Voodoo系列。

我记得当时做游戏开发,想实现一个“水面反射”效果,得用一堆trick(技巧)。因为管线是固定的,你没法写代码去控制像素怎么算。说白了,硬件给你什么,你就用什么。

关键节点:固定管线时代,GPU只是CPU的“绘图小弟”。所有逻辑控制、条件分支,都得CPU算好了再喂给GPU。

1.2 可编程着色器:GPU的“第一次觉醒”

2001年左右,事情开始变了。NVIDIA GeForce 3 和 ATI Radeon 8500 引入了可编程着色器(Shader)。

你想想看,以前你只能调参数,现在你能写一小段代码,让GPU去执行。这就像从“只能点菜”变成了“能自己写菜谱”。

着色器分两种:

  • 顶点着色器(Vertex Shader):控制每个顶点的位置、颜色。
  • 像素着色器(Pixel Shader):控制每个像素的最终颜色。

我在项目中遇到过一件事:当时想做一个“卡通渲染”效果,边缘描黑、内部平涂。固定管线根本做不了,但用像素着色器,几十行代码就搞定了。那一刻我真切感受到——GPU要变天了。

避坑指南:我曾经以为着色器越多越好,结果发现早期显卡的顶点和像素着色器数量不对称。比如有些卡有4个顶点着色器,但只有1个像素着色器。写代码时得小心,别让像素着色器成为瓶颈。

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 的编程模型是“单指令多线程”(SIMT)。说白了,就是所有线程执行同一段代码,但处理不同的数据。这跟CPU的“多指令多数据”完全不同。

我记得第一次用CUDA写矩阵乘法,CPU版本跑了2秒,GPU版本只用了0.02秒。当时我盯着屏幕愣了好几秒——这差距,太夸张了。

注意:CUDA核心不是“核心”的物理单元。它更像一个“执行单元”。一个流多处理器(SM)里包含多个CUDA核心。写代码时,你关心的是线程块(Block)和网格(Grid)的划分,而不是具体有几个核心。

1.5 架构演进的核心逻辑

咱们总结一下,GPU架构演进其实就一条主线:从专用走向通用,从固定走向可编程

为什么?因为市场需求变了。早期只需要画图,后来需要特效,再后来需要科学计算、AI训练。硬件必须越来越灵活。

我画了一张图,帮你理清这个脉络:

GPU架构演进关键节点 1 固定管线 1999年 硬件固定 不可编程 2 可编程着色器 2001年 VS/PS分离 可编程但受限 3 统一架构 2006年 通用流处理器 灵活分配 4 CUDA核心 2007年 通用计算 C语言编程 从专用图形加速 → 通用并行计算 固定 → 可编程 → 统一 → 通用

1.6 我的几点感悟

做了这么多年GPU相关的工作,我有几点体会想分享给你:

  1. 别把GPU当CPU用。 GPU擅长的是“大量简单任务并行”,不是“少量复杂任务串行”。我见过有人拿GPU跑单线程递归,那效率还不如十年前的老CPU。
  2. 理解架构才能写出好代码。 你知道为什么CUDA里要分Block和Grid吗?因为硬件上SM里的共享内存是有限的,线程同步也是以Block为单位的。不懂这些,你写的并行代码可能比串行还慢。
  3. 历史总是在重复。 从固定管线到可编程,从专用到通用,这个趋势不仅在GPU上发生。你看现在的DPU、NPU,是不是也在走同样的路?
个人建议:如果你想深入学习GPU,别急着调API。先花时间搞懂“统一架构”和“SIMT”这两个概念。这是GPU的“内功心法”。内功练好了,招式(CUDA、OpenCL、Vulkan)学起来就快了。

好了,这一章就聊到这儿。GPU从画图工具变成计算利器,走了将近20年。下一章咱们会深入CUDA编程模型,看看怎么真正让GPU跑起来。


专注资料整理