**图形处理单元(GPU)**是一种能够同时执行大量相关计算的处理器,最初用于生成图像,如今也用于通用计算。其架构侧重于吞吐量,即单位时间内完成的工作量。GPU 将可编程执行单元与用于特定操作的专用硬件相结合,适用于图形渲染、科学计算和机器学习。它们通常与中央处理单元(CPU)协同工作,而不是取代 CPU 在系统管理方面的通用职责。(learn.microsoft.com)
历史发展
图形硬件从执行专用渲染功能,逐渐发展为可编程程度越来越高的处理器。1999 年,英伟达(NVIDIA)将 GeForce 256 宣传为首款 GPU,其定义是将变换、光照、三角形设置或裁剪以及渲染功能集成在一起的单芯片处理器。这是针对特定产品提出的定义,并不意味着图形加速始于 1999 年。这些功能的集成使更多图形处理工作得以交由专用硬件完成。(nvidia.com)
可编程着色和通用编程拓展了 GPU 的应用范围。英伟达的 CUDA 计算架构于 2006 年问世,使开发者能够利用 GPU 的执行资源处理图形以外的工作负载。一个具有重要影响的例子是 2012 年的 AlexNet 研究,其卷积神经网络在两块英伟达 GTX 580 GPU 上完成训练。该论文展示了 GPU 加速在大规模视觉识别中的实际价值。(nvidianews.nvidia.com)
架构与执行
GPU 通过维持大量轻量级执行线程来实现并行计算。其组织方式有利于数据并行,即对大量数据元素执行相似的操作。大型数组和矩阵通常具备这种结构,而以顺序依赖为主的工作负载则较难有效利用硬件。因此,GPU 加速的效果取决于工作负载及其实现方式,而不只是有没有 GPU。(docs.nvidia.com)
英伟达将其执行模型称为单指令多线程(SIMT)。各线程保有独立的状态和控制流,但硬件会将它们编为称作线程束(warp)的组进行调度。其他 GPU 架构也采用类似的分组执行方式。当同一组中的线程沿不同的条件分支执行时,分支分歧可能降低执行效率,因为这些路径并不总能同时执行。(docs.nvidia.com)
除了可编程单元,GPU 还配有专用引擎。例如,一些 GPU 包含用于加速光线追踪的硬件,尤其用于加速空间结构遍历和光线与三角形的相交测试。有些 GPU 还包含矩阵处理单元,例如英伟达的 Tensor Core,旨在加速对深度学习十分重要的运算。这些单元既不同于通用着色器执行资源,也不同于独立的张量处理单元。(nvidia.com)
图形渲染
在传统的图形流水线中,应用程序提供几何图元、相关数据和渲染状态。可编程着色器处理顶点并决定表面的外观。光栅化确定几何图元覆盖了哪些图像采样点;后续处理计算这些采样点的颜色,并通过深度、模板和混合操作组合结果。并非每个应用程序都会使用所有可用的流水线阶段。(learn.microsoft.com)
光线追踪采用另一种方法,通过计算光线与场景几何体的交点来确定可见性和光照效果。渲染系统可以将光栅化与通过光线追踪生成的阴影、反射或光照相结合。专用光线追踪硬件能够加速这一过程中的特定环节,但并不能省去可编程着色、场景准备或图像重建。(nvidia.com)
集成方式与内存
集成 GPU内置于处理器或其封装中,而独立 GPU则是单独的处理器。集成式设计通常访问系统内存,独立式设计通常配有专用设备内存。显卡是包含 GPU 及配套组件的板卡,而不是处理器本身。系统可以同时使用集成图形与独立图形,并根据各自的能力分配工作。(cdrdv2-public.intel.com)
在 GPU 内部,内存被组织为访问特性和作用范围各不相同的空间,包括寄存器、缓存、整个设备均可访问的内存,以及供协作线程组使用的高速局部存储。CUDA 将最后一种称为共享内存。高效的程序会复用高速存储中的数据,并合理安排访问,使相邻线程发出的请求能够合并为更少的内存事务。(docs.nvidia.com)
内存容量决定设备能够容纳多少数据,而内存带宽决定向执行单元供给数据的速度。在 CPU 与 GPU 内存之间搬移数据可能带来显著开销。一些集成式系统让主机与设备共享物理内存,但编程接口仍可能区分两者的逻辑内存空间。(docs.nvidia.com)
编程与计算应用
GPU 通用计算利用可编程执行资源处理非图形任务。应用程序通常将工作分配给在 CPU 上运行的主机代码和在加速器上运行的并行内核。CUDA 提供英伟达的编程环境,而 OpenCL 则是支持 GPU 和其他异构处理器的开放标准。程序库和高层框架可以调用内核,无须应用程序开发者自行实现每项底层操作。(khronos.org)
GPU 的应用包括科学软件、图像处理,以及神经网络训练和神经网络推理。这些应用之所以适合 GPU,往往是因为它们需要对大型数据集反复执行算术运算。例如,AlexNet 使用了经过优化的 GPU 实现来执行卷积及其他训练操作。其双 GPU 配置也解决了单个设备内存容量有限的问题。(khronos.org)
性能限制
GPU 的性能取决于可利用的并行性、内存访问模式、指令吞吐量和通信开销。小型任务可能无法提供足够的工作量来抵消内核启动和数据传输的成本。不规则访问、分支分歧或过高的存储需求,都可能导致执行资源未被充分利用。因此,仅凭峰值算术吞吐量无法确定应用程序的实际性能:测量时必须考虑数据搬移,以及程序中未由加速内核处理的部分。(docs.nvidia.com)