序章:不只是显卡——被低估的“算力种子”
1993年,加利福尼亚州圣克拉拉的一间小车库里,三个年轻人——黄仁勋、克里斯·马拉科夫斯基和柯蒂斯·普里姆——正围在一台笨重的显示器前,屏幕上的像素点正在艰难地拼凑出一幅简单的3D图形。他们成立的公司名叫“NV”(Next Version),目标是为当时方兴未艾的PC游戏市场制造更好的图形加速卡。彼时,距离“人工智能”成为全球热词还有近20年,距离英伟达(NVIDIA)市值突破万亿美元更是遥不可及。这家公司的起点,与其说是高瞻远瞩的战略布局,不如说是一场在像素与帧率间的血腥厮杀:他们想做的,不过是让《毁灭战士》和《古墓丽影》的画面更流畅一点、更逼真一点。然而,正是这群为“画面效果”着迷的工程师,在无意中埋下了一颗被严重低估的“算力种子”。这颗种子,在随后二十余年的时光里,悄然吸收着游戏世界催生的并行计算养分,最终在AI革命的暴风雨中破土而出,长成了今天撼动全球科技格局的参天巨树。本章将带你回到那个显卡决定游戏体验的蛮荒时代,探究英伟达如何从一家濒临破产的“游戏配件商”,一步步将通用并行计算的基因刻入芯片核心,为那场即将到来的惊天转型,埋下最初、也最关键的伏笔。
---
一、蛮荒时代:显卡战争的“血与火”(1993-1999)
在20世纪90年代初,PC游戏还处于2D图形的黄金末期。玩家们沉浸在《沙丘2》、《命令与征服》的像素战场上,3D图形尚属实验室里的前沿技术。当时的PC图形处理,主要依赖CPU“硬算”,效率低下,更别提实时渲染复杂的3D场景。市场急需一种专门的硬件来解放CPU,让它专注于游戏逻辑和物理运算,而将繁重的图形生成任务交给“专业选手”。这块“专业选手”的领域,就是图形加速卡。
1.1 NV的诞生与“NV1”的试错
1993年9月,黄仁勋(Jensen Huang)等三人创立NV。他们的第一个产品是NV1,于1995年发布。这款芯片非常独特,它并非纯粹的2D/3D加速卡,而是一个集成了2D图形、3D图形、甚至声音处理功能的“多媒体超级芯片”。NV1支持一种名为“二次曲面表面”(Quadratic Surface)的3D建模技术,这是一种由SGI(Silicon Graphics)倡导、理论上能更高效描述平滑曲面的工业标准。然而,NV1生不逢时:微软在1995年发布的Windows 95,其图形接口DirectX 1.0并未支持二次曲面;同时,业界主流3D游戏引擎(如id Software的《毁灭战士》所采用的)基于的是更简单、更易实现的“多边形”模型。NV1的技术路线成了“孤岛”,加之成本高昂、驱动不稳定,市场反响惨淡。这次试错代价巨大,几乎耗尽了初创公司的资源,但也让团队深刻认识到:在快速变化的PC生态中,拥抱开放标准、而非自建孤岛,是生存的第一法则。NV1那颗试图“大包大揽”的芯片,第一次为英伟达上了昂贵的一课。
1.2 救赎之作:RIVA 128与“拥抱开放”
1997年,濒临绝境的英伟达推出了RIVA 128(Realtime Interactive Video and Animation accelerator)。这款芯片是公司的“救命稻草”,其核心设计思想与NV1截然相反:专注、开放、性能优先。
- **专注**:放弃不切实际的多媒体集成,All in 3D图形加速。
- **开放**:全力支持微软刚发布的**Direct3D**(DirectX的一部分)和后来兴起的**OpenGL**。这意味着游戏开发者无需为NV1那样的特殊硬件适配,代码能直接运行。
- **性能**:RIVA 128是当时首批支持**硬件纹理映射**(Hardware Texture Mapping)的消费级显卡之一。纹理映射是让3D物体表面呈现木纹、石质等真实质感的关键技术,此前多由CPU软件模拟,极耗资源。RIVA 128将此任务交给专用硬件,瞬间让游戏画面质感产生质的飞跃。
RIVA 128的成功,让英伟达在1999年上市,并确立了其在3D图形芯片市场的一席之地。但真正的战争,才刚刚开始。此时,市场的绝对王者是3dfx Interactive,其Voodoo系列显卡凭借纯粹的3D性能和革命性的SLI(Scan-Line Interleave,扫描线交错) 多卡并联技术,统治着高端游戏市场。另一强劲对手是ATI(Array Technology Inc.),其Rage系列在2D和兼容性上颇有优势。英伟达作为挑战者,必须用更激进的技术和更聪明的策略,在这片红海中杀出一条血路。
1.3 定义GPU:GeForce 256的“野心”
1999年8月,英伟达发布了划时代的GeForce 256。这场发布会的主题只有一个:我们重新定义了图形芯片。黄仁勋在台上宣布,GeForce 256不仅是“图形加速卡”(Graphics Accelerator),而是世界上第一款图形处理器(Graphics Processing Unit, GPU)。这不仅仅是一个营销术语的变更,背后是架构理念的根本性跃迁。
GPU与之前图形加速卡的核心区别在于“可编程性”与“集成度”:
- **硬件T&L(Transform & Lighting,变换与光照)**:这是GeForce 256最核心的卖点。在此之前,3D物体的顶点坐标变换(从3D空间映射到2D屏幕)和光照计算,通常由CPU完成,再传递给显卡进行像素填充。GeForce 256将这两项最耗时的固定功能(Fixed-Function)步骤集成到芯片内部,并实现了**硬件级加速**。这意味着CPU被彻底解放,可以处理更多游戏逻辑和AI(游戏内AI),而GPU则专职负责图形流水线的核心数学运算。
- **更高的集成度**:集成了更多像素管线、纹理单元,提供了前所未有的填充率。
从技术演进树来看,GeForce 256是承上启下的关键节点: ``` CPU(通用计算) → 早期图形加速卡(固定功能,如NV1) → 可编程像素/顶点着色器(GeForce 3/4,2001) → 统一着色器架构(GeForce 8系列,2006) → 通用并行计算平台(CUDA,2006) ``` GeForce 256的“硬件T&L”看似只为提升游戏画质,但它实际上将大量原本属于CPU的、可并行化的几何与线性代数运算,第一次大规模、固定地转移到了显卡芯片内部。这些运算单元(尤其是处理顶点变换的矩阵乘法单元)在形态上已经非常接近后来CUDA核心的雏形。它们每天处理着海量的、结构相似的向量与矩阵计算——这正是通用并行计算(GPGPU) 最典型的 workload。只是当时,没有人(包括英伟达自己)意识到,这些为《古墓丽影》里劳拉·克劳馥的头发丝光影而设计的电路,未来将用来模拟宇宙的起源、预测蛋白质的折叠、以及训练改变世界的神经网络。
---
二、暗流涌动:可编程着色器与“意外”的并行计算萌芽(2000-2005)
GeForce 256的成功让英伟达坐稳了高端市场,但真正的技术革命,隐藏在随后几年更“低调”的架构演进中。竞争对手3dfx因战略失误(过度依赖SLI,忽视DirectX标准)于2000年被英伟达收购,ATI则凭借Radeon系列紧追不舍。这场军备竞赛的核心,从单纯的“像素填充率”比拼,悄然转向了可编程性的竞争。
2.1 可编程着色器:从“固定管线”到“自由编程”
GeForce 256的硬件T&L虽然是革命性的,但仍是“固定功能管线”——即图形渲染的步骤(顶点变换、光照、纹理、像素混合)由硬件硬连线定义,开发者无法改变流程。而游戏开发者渴望更自由的视觉效果:动态水波、真实皮肤质感、复杂的光影效果……这要求显卡能运行自定义的小程序。
2001年,英伟达发布的GeForce 3和ATI发布的Radeon 8500,几乎同时引入了可编程顶点着色器(Programmable Vertex Shader) 和可编程像素着色器(Programmable Pixel Shader)。这相当于在GPU内部开放了“编程接口”。开发者现在可以用高级着色语言(如微软的HLSL、OpenGL的GLSL)编写小程序,直接运行在GPU的流处理器(Stream Processor)上,来控制每个顶点或每个像素的渲染逻辑。
技术影响: 1. GPU彻底“软硬化”:GPU从一个“黑盒”加速器,变成了一个可编程的并行计算平台。虽然其编程模型仍高度图形化(输入是顶点/像素属性,输出是颜色/位置),但底层的计算单元已经可以被开发者直接调度。 2. 并行性暴露无遗:一个屏幕有数百万个像素,一个3D模型有数百万个顶点。对这些像素/顶点执行的着色器程序,是数据并行(Data Parallel) 的绝佳范例——同样的程序(着色器代码),在不同的数据(每个像素/顶点的坐标、法线、纹理坐标)上同时运行。GPU的架构,天生就是为这种“单指令多数据”(SIMD)模式设计的。
2.2 游戏需求:最苛刻的“并行计算客户”
游戏产业,这个当时看似“不正经”的领域,实际上成为了并行计算最严苛、最持续的“压力测试场”和“需求孵化器”。
- **物理模拟**:为了真实的爆炸、布料、流体效果,游戏需要实时计算大量粒子系统和刚体动力学。这些计算本质上是大量独立物体的运动方程求解,天然适合并行。
- **人工智能(游戏内AI)**:大规模战场中的NPC决策、寻路算法,需要处理海量实体的状态更新。
- **光线追踪(早期探索)**:虽然实时光线追踪在十几年后才普及,但早在2000年代初,研究者就尝试用GPU的并行能力来加速光线与场景的求交计算。每一次“光线-三角形”的相交测试都是独立的,是完美的并行任务。
案例:2004年的《毁灭战士3》 id Software的《毁灭战士3》是当时图形技术的标杆。其引擎大量使用了法线贴图(Normal Mapping) 和延迟着色(Deferred Shading) 等高级技术。这些技术需要在像素着色器阶段进行复杂的数学运算(如从法线贴图采样、转换到世界空间、计算光照)。这迫使GPU的像素着色器单元必须拥有强大的浮点运算能力。为了跑动《毁灭战士3》这样的“显卡杀手”,玩家必须购买当时最新、最强的GPU。而英伟达和ATI的竞争,实质上是谁能在同一芯片面积下,塞进更多、更快的可编程浮点运算单元的竞争。这场由游戏驱动的“军备竞赛”,无意中为GPU的通用计算能力打下了坚实的硬件基础:海量的、高吞吐量的、专为图形浮点运算优化的核心。
2.3 “误入歧途”的GPGPU先驱:GPU第一次“跨界”尝试
在CUDA诞生前,学术界和工业界已有一些“黑客式”的尝试,试图让GPU执行图形任务以外的计算,这就是GPGPU(通用GPU计算)。由于当时GPU没有直接的通用计算接口,先驱们必须“绕弯路”,将非图形数据伪装成图形数据(如纹理、顶点),通过图形API(OpenGL/DirectX)发送到GPU,运行自定义的片段着色器程序,再将结果读回。
典型应用与挑战:
- **科学计算**:如天体物理中的N体模拟(计算星体间引力)、分子动力学模拟(计算原子间作用力)。这些任务可以映射为“每个粒子/原子对应一个像素,其受力作为颜色值”。
- **信号处理**:如快速傅里叶变换(FFT),被拆解为一系列可并行化的蝶形运算,在像素着色器中实现。
- **数据库查询**:将数据表视为纹理,查询条件映射为着色器程序。
核心痛点:这种“图形黑客”方式极其繁琐、低效。程序员必须精通图形API和着色器编程,将复杂问题强行映射到“渲染一个四边形”的模型里。数据在GPU显存与系统内存之间的来回拷贝(因为GPU无法直接访问系统内存)也造成了巨大开销。这就像让一位米其林大厨(GPU)只能通过一个特制的、只接受“红烧肉”指令的传菜窗口(图形API)来工作,哪怕你想让他煮个面,也得先把面条伪装成“红烧肉”的形状送进去。
英伟达的观察:英伟达的架构师们,尤其是后来CUDA项目的核心人物大卫·柯克(David Kirk),敏锐地观察到了这一趋势。他们意识到,游戏市场对并行浮点算力的疯狂追求,已经意外地打造出了一款世界上最普及、性价比最高的大规模并行处理器。但现有的编程模型(图形API)是巨大的枷锁。问题来了:如果直接为GPU设计一套全新的、面向通用计算的编程模型和硬件架构,会怎样? 这个想法,在当时看来近乎疯狂——毕竟,99%的GPU用户只想玩游戏。但正是这种“疯狂”,孕育了CUDA。
---
三、关键伏笔:从“图形核心”到“统一着色器架构”(2006)
2006年,英伟达发布了GeForce 8系列,其旗舰产品GeForce 8800 GTX搭载了革命性的Tesla(统一着色器)架构。这一架构 change,是“算力种子”从“图形专用”向“通用并行”转变的最关键硬件基础。
3.1 统一着色器:打破顶点与像素的“围墙”
在GeForce 8系列之前,GPU内部有独立的顶点着色器单元和像素着色器单元。这导致资源分配不均:有些3D场景顶点计算多(如高模),像素计算少;有些场景(如复杂光影)则相反。固定数量的独立单元,常出现一种单元忙死、另一种单元空闲的浪费。
Tesla架构的核心创新:取消了顶点和像素着色器的区分,代之以大量的、功能相同的流处理器(Stream Processor, SP),统称为统一着色器(Unified Shader)。这些SP是完全相同的、可编程的标量处理器,可以执行任何类型的着色器程序(顶点、几何、像素)。GPU内部的线程调度器会根据当前渲染负载,动态地将顶点或像素任务分配给这些SP。
深远影响: 1. 硬件资源利用率最大化:无论负载是顶点密集型还是像素密集型,所有SP都能被充分利用,并行效率大幅提升。 2. 架构本质趋同于通用并行处理器:这些SP不再是“顶点处理器”或“像素处理器”,而是一堆通用的、并行的、浮点运算能力强的计算核心。它们执行的指令,从“计算顶点位置”到“计算像素颜色”,在硬件层面已无本质区别,区别只在软件(运行的着色器程序)。 3. 为CUDA铺平道路:当英伟达团队设计CUDA时,他们面对的不是一块需要从零改造的“图形芯片”,而是一个已经拥有大量统一、可编程、高吞吐浮点核心的现成并行平台。CUDA要做的,是赋予这些核心“通用计算的身份”,并设计一套让程序员能轻松使用的软件栈。GeForce 8800 GTX的硬件,正是为CUDA准备的“理想温床”。
3.2 G80芯片:隐形的“并行计算怪兽”
GeForce 8800 GTX搭载的G80芯片,拥有惊人的128个流处理器(在当时的消费级芯片中)。这些SP运行在1.35 GHz的高频下,提供超过 345 GFLOPS 的峰值浮点算力(单精度)。作为对比,同时期英特尔旗舰CPU Core 2 Extreme X6800,双核心四线程,峰值算力约 46 GFLOPS。这意味着,一块游戏显卡的理论浮点算力,已经是顶级CPU的7倍以上。
然而,在2006年,几乎没人关心这个数字。媒体评测的焦点是:《孤岛危机》在最高画质下能否流畅运行?SLI双卡效率如何?G80的恐怖算力,在游戏需求的“包装”下,成了沉默的“特工”。它日复一日地执行着顶点变换、光照计算、像素着色,将海量数据转化为屏幕上绚丽的画面。但它的“潜力”——那远超CPU的并行算力,以及那套刚刚在内部统一、灵活的流处理器架构——正静静等待被“唤醒”。
---
四、觉醒时刻:CUDA——给“算力种子”浇灌的“第一桶水”(2006)
2006年,英伟达做出了一个可能改变公司命运,甚至科技史的决定:发布CUDA(Compute Unified Device Architecture,计算统一设备架构)。这是一套完整的软硬件技术组合,旨在让GPU不仅能渲染图形,还能高效执行通用的、非图形的计算任务。
4.1 为什么是英伟达?为什么是2006年?
做出这一决策,基于几个关键判断: 1. 硬件已就绪:统一着色器架构(Tesla)提供了必要的、同构的、可编程的并行核心池。 2. 市场已验证:GPGPU社区用“图形黑客”方式证明,GPU在特定科学计算任务上比CPU快数十倍,存在真实需求。 3. 战略卡位:英伟达看到,如果自己不站出来定义标准,这个市场可能会碎片化,或者被其他架构(如IBM的Cell、Intel的MIC)占据。率先开放平台,能建立生态壁垒。 4. 游戏市场的“内卷”:游戏图形技术的进步速度开始放缓(“照片级真实感”难以短期突破),而游戏对算力的需求仍在增长(更高分辨率、刷新率、物理效果)。英伟达需要为过剩的算力寻找“第二增长曲线”。
风险巨大:当时,99.9%的GPU销售来自游戏市场。CUDA需要额外的芯片面积(如更复杂的调度器、更灵活的存储器接口)、额外的软件研发投入,却看不到短期回报。董事会和投资者是否会接受?黄仁勋力排众议,将CUDA定位为“公司的未来”,甚至要求所有新芯片设计都必须为CUDA优化。这是一场豪赌。
4.2 CUDA的核心思想:让GPU“像CPU一样编程”
CUDA的革命性在于,它试图隐藏GPU的图形本质,向程序员暴露一个更熟悉的并行计算模型。
- **关键抽象**:在CUDA中,程序员不再思考“顶点”和“像素”,而是思考**线程(Thread)** 和**线程块(Block)**。一个典型的CUDA程序会启动成千上万个线程,每个线程处理数据的一个小部分(如矩阵的一个元素),这些线程被组织成线程块,块内线程可以协作(共享内存、同步),所有块组成网格(Grid)在GPU上执行。
- **编程语言**:基于C/C++的扩展(`.cu`文件),学习曲线远低于直接写汇编或图形着色器。
- **内存模型**:提供了多级内存(全局、共享、常量、纹理),程序员可以手动优化数据搬运,这是性能的关键。
一个简单的对比:矩阵加法 假设有两个 $N \times N$ 矩阵 A 和 B,求和得到 C。在CPU上,我们写一个双重循环: ```c for (int i = 0; i < N; i++) for (int j = 0; j < N; j++) C[i][j] = A[i][j] + B[i][j]; ``` 在CUDA中,我们为每个矩阵元素启动一个线程: ```cuda __global__ void matrixAdd(float* A, f