当前位置: 首页 > news >正文

GPU/CUDA 发展编年史:从 3D 渲染到 AI 大模型时代

目录

文章目录

  • 目录
  • 1960s~1999:GPU 的诞生:光栅化(Rasterization)3D 渲染算法的硬件化实现之路
    • 学术界算法研究历程
    • 工业界产品研发历程
    • 光栅化技术原理
    • 光栅化技术的软件实现:OpenGL 3D 渲染管线设计
      • 1. 顶点处理(Vertex Processing)
      • 2. 三角处理(Triangle Processing)
      • 3. 光栅化(Rasterization)
      • 4. 片段处理(Fragment Processing)
      • 5. 帧缓存(Frame Buffer)输出
    • 光栅化技术的硬件实现:GPU 芯片架构设计
  • 2000~2006:CUDA 的诞生:从 GPU 专用计算走向 GPGPU 通用计算
    • 应用场景的复杂性驱动硬件芯片的可编程性
    • 性能需求的广泛性驱动硬件芯片的通用性
    • CUDA 统一计算编程平台打通软硬界面
    • GPU 为并发计算而生
  • 2007~2016:走向 HPC 和 DL/AI 智能
  • 2017~Now:引爆 AI 大模型时代
  • 参考资料

1960s~1999:GPU 的诞生:光栅化(Rasterization)3D 渲染算法的硬件化实现之路

学术界算法研究历程

1960s:光栅化技术理论研究的核心思想起源于计算机图形学的初步探索,研究者的目标是解决几何投影与像素覆盖的问题,即:如何将 3D 几何体(如正方体)投影到 2D 屏幕空间上。

1970s:**扫描线算法(Scanline Algorithm)**被提出,通过逐行填充多边形边界内的像素,显著提升了光栅化效率。同时,几何投影理论(如透视投影与正交投影)逐渐形成,奠定了光栅化流程的数学基础。

1980s:随着图形化桌面操作系统的研究发展,计算机图形学进入实用化阶段。此时光栅化技术和光线追踪(Ray Tracing)技术形成了路线竞争,并最终胜出。因为光线追踪技术的实时渲染需要依靠大量算力,当时硬件条件并不具备,直到 2018 年 Turing GPU 才将光线追踪技术带进了市场。

1980s 后期:**深度缓冲(Z-Buffer)**技术概念的雏形出现,可应用于解决多个几何物体前后遮挡的问题,成为光栅化的标准配置。

1990s 前期:纹理映射(Texture Mapping)技术成熟,光栅化算法开始支持复杂表面细节的渲染,同时抗锯齿(Anti-Aliasing)技术也通过多重采样的方式优化了边缘锯齿的问题。

2000s:可编程着色器(Shader)技术成熟,使光栅化管线(Pipeline)从固化的 GPU 硬件功能走向灵活可编程的趋势,支持逐像素光照计算(如 Phong 着色、法线贴图),这极大提升了渲染效果。

在这里插入图片描述

工业界产品研发历程

1981 年,现代显卡的雏形:IBM 推出的 5150 PC 搭载了 MDA(Monochrome Display Adapter,单色显示适配器)和 CGA(Color Graphics Adapter,彩色图形适配器)这 2 款显示适配器,奠定了计算机图形显示的基础。

1989 年,第一代 VGA Card(显卡)设备:随着 Microsoft Windows 图形化操作系统的发展而诞生的 VGA Card 只提供 2D 图像显示功能,支持在屏幕上输出 640×480 分辨率、256 彩色的图像。另外,除了显示之外的图形运算依旧由 CPU 完成。

1991 年,第二代 Graphics Card(图形加速卡):专用于支持 Windows 图形界面。通过一颗专用芯片来同时处理 2D 显像和图形运算,卸载了 CPU 的图形运算。让更多的 CPU 资源用于运行 Windows 操作系统,时期运行非常流畅,也加速了 Windows 的普及,让 PC 走进了图形化界面时代。

1994 年,第三代 Video Card(视频加速卡):不仅仅是 2D 图形显像,更一步支持了针对视频显像数据流的编解码加速。

1996 年,第四代 3D Accelerator Card(3D 图形渲染加速卡):这是 NVIDIA 推出的一款划时代的产品,内含 TNT/TNT2 芯片的 3D 显卡,用硬件的方式实现了光栅化算法(Rasterization Stage),但依旧依赖 CPU 来完成顶点处理(Geometry Stage)的运算。

1999 年,第五代 GPU(图形处理器):GeForce 256 是 NVIDIA 推出的另一款划时代的产品,第一次提出 GPU 芯片的概念。面向发展迅猛的 3D 游戏图像处理加速市场,在游戏领域,第一次让 GPU 上升到了与 CPU 同等的高度,3D 渲染显像技术走向普及。

NVIDIA GeForce 256 作为世界上第一块 GPU,距今(2025)已有 25 年历史。
在这里插入图片描述

在这里插入图片描述

光栅化技术原理

光栅化技术的第一性原理是 “投影”,即:选取一个视角(Camera,摄影机),然后将 3D 几何物体透视投影到画布上,最后将投影像素化的过程。更进一步的,除了虚拟摄像头,还需要具有虚拟光源,并且当多个物体投射到同一张画布上时,还需要通过一系列的采样和插值算法来确定画布上像素点的取值。

在这里插入图片描述

光栅化技术的软件实现:OpenGL 3D 渲染管线设计

3D 渲染管线(Graphic Pipeline)能够实时的将 3D 图形渲染为 2D 屏幕中进行显示,并且参考 CPU 流水线,GPU 也通过流水线的方式,大大加快了实时渲染的速度。但即便如此,渲染一个复杂的游戏或电影场景依旧需要非常庞大的算力和时间。

粗略的,可以将 3D 渲染管线分为 “几何处理” 和 “光栅处理” 这 2 大阶段。

  1. 几何处理:把 3D 坐标转换为 2D 坐标。
  2. 光栅处理:把 2D 坐标转变为实际有颜色的像素方块。

更详细的,这 2 个阶段又可以细分为多个工作模块。这些工作模块在 GPU 中有相应的硬件模组进行处理,并且针对这些工作 GPU 也提供了不同的可配置性或可编程性。即:有些工作的硬件功能固化的,而有些工作的硬件功能是可编程的,这也是 CUDA 诞生的基础。例如:

  1. 顶点数据的输入与处理(顶点着色器,可编程):完成坐标变换与属性传递。
  2. 曲面细分(曲面细分着色器,可编程):完成动态曲面细分。
  3. 图元组装(几何着色器,可编程):完成重新生成图像。
  4. 裁剪剔除(不可编程):剔除不可见部分。
  5. 屏幕映射(不可编程):NDC 到屏幕像素。
  6. 图元光栅化(三角形设置与遍历,不可编程):生成片元。
  7. 像素着色(片元着色器,可编程):计算颜色与特效。
  8. 片元筛选(逐片元操作):深度/模板测试与混合。
  9. 屏幕图像输出(帧缓存):存储并显示最终的屏幕 2D 图像。

在这里插入图片描述

值得注意的是,根据 GPU 型号和软件框架(如 OpenGL)的不同,Pipeline 的设计并不完全一致。如下图是早期 OpenGL 的一个 Pipeline 软件设计,以及早期 RealityEngine 显卡芯片的硬件设计。

在这里插入图片描述

1. 顶点处理(Vertex Processing)

OpenGL Application 通过 CPU 调用 DrawCall 函数,启动一个 3D 渲染任务,向 GPU 输入一系列 3D 顶点坐标及其属性信息,包括:顶点坐标、纹理坐标、顶点法线和顶点颜色等顶点属性。为了让 OpenGL 明白顶点数据构成的是什么图元(Primitive),在 Application 中需要使用绘制指令传递相对应的图元信息,包括:点(GL_POINTS)、线(GL_LINES)、线条(GL_LINE_STRIP)、三角面(GL_TRIANGLES)等参数。

GPU 的顶点着色器(Vertex Shader)会对每个顶点坐标进行一系列的变换,包括:几何变换、视图变换、投影变换等,主要计算方式就是线性代数中的矩阵乘法,并且考虑到齐次坐标(homogeneous coordinates),这通常是一个四维矩阵乘法运算。最终,顶点着色器将这些顶点坐标全部转换世界坐标、观察坐标和裁剪坐标等等。

在这里插入图片描述

2. 三角处理(Triangle Processing)

三角处理,也称为图元处理(Primitive Processing),就是将前面得到的一系列 2D 坐标点组合在一起构成许多三角形,继而由多个三角形之间的拼接构成一个新的 3D 轮廓。除了最基本的三角处理,现在 GPU 和 OpenGL 还支持以下新特性:

  1. 曲面细分着色器(Tessellation Shader):利用镶嵌化处理技术动态地将三角形进一步细分,增加物体表面的三角面的数量,使曲面更圆滑。曲面细分由外壳着色器(Hull Shader)、镶嵌器(Tessellator)和域着色器(Domain Shader)构成,其中外壳着色器和域着色器是可编程的,而镶嵌器是有硬件固化的。
  2. 几何着色器(Geometry Shader):用于将输入的图元(点或线)扩展成几何多边形。
  3. 图元组装与裁剪剔除:将输入的顶点组装成指定的图元。同时将超出画布或位于背面的图元剔除或裁剪成新的三角形,以减少进入光栅化的图元的数量,加速渲染过程。
  4. 屏幕映射:透视除法和视口变换。

在这里插入图片描述

3. 光栅化(Rasterization)

经过图元组装以及屏幕映射阶段后,GPU 已经将物体的 3D 坐标转换为了 2D 的屏幕坐标。而光栅化,也称为栅格化,本质是一个离散化运算,就是将前面得到的每个三角形离散为一个个像素方格,因为屏幕所显示的图像就是由一个个像素点组成的。

在离散过程中,光栅化会利用图元的信息和一系列插值算法来确定图元像素所覆盖的片段(Fragments),并使用顶点属性的插值获取到这些片段的属性信息。这些信息用于后续的片段处理。

在这里插入图片描述

4. 片段处理(Fragment Processing)

片段处理,又称为纹理帖图(Texture Mapping)。由片段着色器(Fragments Shader)根据光栅化后的顶点属性信息(如着色设计)为每个像素点进行上色。需要注意是,片段是像素的候选者,只有通过后续的测试,片段才会成为最终显示的像素点。

另外,根据 GPU 厂商不同,片段着色器(Fragments Shader)也可以称为像素着色器(Pixel Shader)或 TMU(Texture Mapping Unit)。

在这里插入图片描述

5. 帧缓存(Frame Buffer)输出

当 1 帧图像的所有并行计算得出的 Fragments 送到显存帧缓冲区进行合并,合并的过程中会使用到 Z-buffer 等操作,最终构成像素级的图片,输出到显示器上。

在这里插入图片描述

光栅化技术的硬件实现:GPU 芯片架构设计

1996 年,NVIDIA 虽然已经通过 TNT 芯片实现了 3D 渲染管线中的光栅处理阶段(Rasterization Stage),但依旧依赖 CPU 来完成几何处理的(Geometry Stage)的运算。如下图所示,在 TNT 芯片中集成了 Rasterizer、Texture、Raster Operations Unit,Frame Buffer 等模块。

  1. CPU 负责所有的几何处理,包括:Vertex Shader 和 Geometry Shader,而将生成的 Primitive 2D Triangles 和相应的纹理材质加载到 Main Memory 中。
  2. 2D Triangles 被 TriangleCMD 通过 AGP bus 发送到 TNT 芯片,通过 Rasterizer 转换成扫描线请求并发送到 TMU(Texture Mapping Unit)。
  3. TMU 将 fragment 填充好之后,通过 Raster Operations Unit 输出到 Frame Buffer。
  4. Frame Buffer 利用 Z-Buffer test 技术在 GPU Memory 中保存 RGBA 和 z 值,并在完成了混合处理等特效功能后,转换成 VGA 信号给显示器。
    在这里插入图片描述

3 年后的 1999 年,NVIDIA 发布 GeForce 256 显卡,并第一次提出 GPU(Graphics Processing Unit,图形处理器)芯片的概念。之所以命名为 GPU 是因为这块芯片已经硬件实现了 3D 渲染管线的整个流程,而不再需要 CPU 的参与。

如下图所示,G256 在 TNT 的基础上还集成了 T&L(Transform & Lighting Unit,光照变化单元)模块,实现了顶点处理和几何变换等功能,而 CPU 只需要负责将 3D Triangles(描述 3D 空间的三角形)。

在这里插入图片描述

在这里插入图片描述

2000~2006:CUDA 的诞生:从 GPU 专用计算走向 GPGPU 通用计算

应用场景的复杂性驱动硬件芯片的可编程性

T&L 模块的加入使得 G256 完全硬件实现了完整的 OpenGL 3D 渲染管线。而随着 3D 游戏应用场景的发展,开发者对 OpenGL 提出了更加丰富的 API 需求和更加复杂的 Pipeline 设计,进而驱动了 GPU 设备可编程需求和更加通用化的芯片模块设计。

性能需求的广泛性驱动硬件芯片的通用性

CUDA 统一计算编程平台打通软硬界面

GPU 为并发计算而生

从光栅化算法的基础原理上就决定了 3D 图形的每一个顶点的处理之间并没有依赖,所以可以采用并行计算的方式。这也决定了 GPU 设计之初就是为了并行计算而生的。下图所示的 3D 渲染管线的计算和访存流程在 GPU 中大量的并行运算着,最终在帧缓存阶段进行并行结果的聚合。

在这里插入图片描述

2007~2016:走向 HPC 和 DL/AI 智能

2017~Now:引爆 AI 大模型时代

参考资料

  1. https://positiveczp.github.io/%E7%BB%86%E8%AF%B4%E5%9B%BE%E5%BD%A2%E5%AD%A6%E6%B8%B2%E6%9F%93%E7%AE%A1%E7%BA%BF.pdf
  2. https://mp.weixin.qq.com/s?__biz=MzUxNzQ5MTExNw==&mid=2247487976&idx=1&sn=d258826f5829b2225b93183248f3f893&chksm=f996012acee1883cd8a41eb8d57d6b6fee57357d5ffd184883a89a5b4524c796aec27e7840dc&cur_album_id=2538479717163761664&scene=189#wechat_redirect

相关文章:

  • 谈谈 HTTPS 的工作原理,SSL / TLS 握手流程是什么?
  • RabbitMQ怎么实现延时支付?
  • C++:内联函数
  • Linux常用指令
  • VirtualBox虚拟机安装Mac OS启动后的系统设置
  • 指纹细节提取(Matlab实现)
  • Java 大视界 -- Java 大数据在智能教育考试评估与学情分析中的应用(112)
  • RV1126的OSD模块和SDL_TTF结合输出H264文件
  • Elasticsearch简单学习
  • 电子电路中,正负双电源供电的需求原因
  • excel 斜向拆分单元格
  • 第51天:Web开发-JavaEE应用SpringBoot栈身份验证JWT令牌Security鉴权安全绕过
  • Webpack、Vite区别知多少?
  • 单片机学习规划
  • Java学习——day14
  • 成功解决 “\ufeffimport sys“ SyntaxError: invalid character in identifier
  • Node.js setImmediate 教程
  • Linux常见操作命令(1)
  • linux常见操作命令
  • 数列极限入门习题
  • 韩国代总统、国务总理韩德洙宣布辞职,将择期宣布参选总统
  • 最高法强化涉新就业形态民事案件审判指导:推动出台司法解释
  • 原国家有色金属工业局副局长黄春萼逝世,享年86岁
  • 媒体:黑话烂梗包围小学生,“有话好好说”很难吗?
  • 160名老人报旅行团被扔服务区?张家界官方通报
  • 中使馆:奉劝菲方有关人士不要在台湾问题上挑衅,玩火者必自焚