一、设计哲学对比 —— CPU vs. GPU

要理解GPU的内部结构,首先要明白它和CPU设计目标的根本差异:

特性

CPU

GPU

核心目标

低延迟,快速处理单个复杂任务。

高吞吐量,并行处理海量简单任务。

核心数

较少(几个到几十个),核心功能强大且独立。

极多(成千上万个),核心小而高效,专为并行设计。

缓存体系

庞大而复杂(多级大容量缓存),旨在减少数据获取延迟。

相对较小,主要用于服务线程束的快速数据共享,而非隐藏延迟。

控制单元

占比大,擅长复杂的指令调度、分支预测、乱序执行。

占比小,采用SIMT模型,控制一批线程执行相同指令流。

适用场景

操作系统、通用程序、逻辑控制、串行计算。

图形渲染、科学计算、深度学习、密码破解等数据并行任务。

比喻

“博学家” 或 “法拉利”:精通复杂任务,一次处理一件,速度极快。

“军队” 或 “巨型卡车”:不擅长复杂思考,但能组织无数士兵同时执行简单命令。

关键思想:GPU将大量的晶体管用于计算单元而非缓存和控制逻辑,通过极致的并行来最大化吞吐量。

二、GPU内部架构深入介绍

我们以现代NVIDIA GPU的架构(如Ampere, Hopper)为蓝本进行分解。一张GPU可以自上而下分为以下几个层次:

层级1:宏观结构 —— GPU芯片(Die)

一张GPU芯片主要由以下几大块组成:

  • 图形处理集群: 芯片内最大的划分单元,一个GPC包含一系列流式多处理器、光栅引擎等。
  • 流式多处理器: GPU的核心计算引擎,也是架构理解的关键。所有计算(图形、AI、科学)都在SM内部完成。一张高端GPU可能有上百个SM。
  • 内存控制器: 连接GPU核心与显存的桥梁。GPU拥有极高的显存带宽(如HBM2e/HBM3),这是其高性能的关键。
  • 二级缓存: 所有SM共享的最后一级缓存,是SM与显存之间的数据缓冲。
  • PCIe接口: 与主机CPU通信的通道。
层级2:核心引擎 —— 流式多处理器 的内部结构

SM是GPU真正的“心脏”。一个SM内部包含:

1、计算核心

  • CUDA核心: 最基本的标量计算单元,执行单精度浮点和整数运算。
  • Tensor核心: 专为矩阵运算设计的核心,能在一个时钟周期内完成一个4x4矩阵的混合精度乘加运算,是AI训练和推理性能爆炸性增长的根源。
  • RT核心: 专用于光线追踪的硬件单元,能加速光线与场景的求交计算。

2、执行上下文与线程束调度器

  • SM采用SIMT模型。一个SM可以同时管理成千上万个线程的上下文(寄存器状态)。
  • 线程束: GPU的基本执行单位,通常是32个线程为一组。这32个线程共享程序计数器,执行相同的指令,但处理不同的数据。
  • 调度器: 每个时钟周期,调度器会选择已经就绪的线程束,将其指令分发给相应的功能单元执行。高效的调度是隐藏内存访问延迟的关键。

3、寄存器文件

每个SM都有一个巨大的寄存器堆(例如256KB)。每个线程都拥有自己独立的寄存器,用于存储局部变量和中间结果。这是实现海量线程快速上下文切换的硬件基础。

4、内存层次

共享内存/一级缓存: 一个SM内部的小型、高速、可编程的SRAM。关键特性:由该SM内的所有线程共享。程序员可以显式地利用它来提升数据访问速度,是优化性能的利器。

只读缓存/常量缓存: 用于加速对常量和只读数据的访问。

层级3:执行模型 —— 线程如何映射到硬件

理解“网格-线程块-线程”的编程模型如何映射到物理硬件是核心:

线程: 最小的执行单位。

线程块: 逻辑上的一组线程(如256个),它们可以被调度到同一个SM上执行,并可以通过共享内存和同步进行协作。

网格: 由一个内核启动的所有线程块的集合。

物理映射流程:

  • 程序员启动一个内核(网格)。
  • GPU驱动将网格中的线程块分配到各个可用的SM上。
  • 一个SM可以同时容纳多个线程块(取决于资源消耗)。
  • 进入SM的线程块,其线程被进一步分组为线程束。
  • SM的调度器在每时钟周期调度多个线程束到计算核心上执行。
  • 同一个线程束内的32个线程,在Tensor核心或CUDA核心阵列上锁步执行相同的指令。
层级4:内存体系 —— 数据流动的路径

GPU拥有复杂的内存层次,访问速度和容量各不相同:

  • 寄存器: 最快,每个线程私有。
  • 共享内存: 很快,线程块内共享。
  • L1缓存/常量缓存/只读缓存: SM内缓存。
  • L2缓存: 所有SM共享,是整个GPU的缓存。
  • 全局内存: 显存,容量大但延迟高、带宽高。所有线程都可以访问。
  • 纹理内存/常量内存: 具有特殊缓存机制的只读全局内存。

性能优化核心: 尽可能让数据待在寄存器和共享内存中,减少对全局内存的访问,并确保全局内存访问是合并的(即一个线程束的32个线程连续访问一片对齐的内存地址),以最大化内存带宽利用率。

三、现代演进与AI的深度融合

从图形到通用计算再到AI:

  • 早期GPU只为图形渲染设计。
  • CUDA/OpenCL的出现使其变为通用GPU。
  • Tensor核心的引入标志着GPU正式成为AI加速器的首选,其设计重心从通用浮点计算向矩阵计算倾斜。

稀疏性加速: 现代AI模型权重和激活通常是稀疏的。新一代GPU(如Hopper)在Tensor核心中加入了结构化稀疏加速功能,能识别并跳过零值计算,进一步提升性能。

细粒度线程协作: 如线程束簇的概念被引入,允许更小规模的线程组(如16个)进行高效通信和同步,适应更灵活的并行模式。

四、嵌入式系统的特殊考量

嵌入式GPU(如NVIDIA Jetson系列、高通Adreno、ARM Mali)与桌面/数据中心GPU在架构哲学上一脉相承,但侧重点不同:

高度集成: 通常是SoC的一部分,与CPU、内存控制器、各种外设集成在同一芯片上,共享系统内存,而非独立显存。

能效比至上: 性能功耗比是关键指标。核心数量、频率、电压被精细控制,会采用更激进的动态电压频率调节和功耗门控技术。

规模缩小但架构一致: 可能只包含几个到几十个SM,但仍然具备完整的SM架构(CUDA核心、Tensor核心、共享内存等)。

专用功能单元: 针对嵌入式视觉任务,可能集成专用的图像信号处理器、视频编解码器,与GPU协同工作。

实时性考虑: 在某些汽车、工业控制场景,需要保证GPU任务的确定性和最坏执行时间,这与传统GPU追求最大吞吐量的目标有所不同。

五、总结

GPU的内部结构是其“吞吐量优先” 设计哲学的完美体现:

  • 以SM为重复单元,通过数量取胜。
  • 采用SIMT执行模型,用简单的控制逻辑驱动海量线程。
  • 设计专用核心来应对关键负载。
  • 复杂的片上内存层次是平衡性能与编程灵活性的关键。
  • 在嵌入式领域,能效比和集成度成为首要优化目标。

理解GPU架构,不仅是为了编写高效的CUDA/OpenCL代码,更是为了理解现代异构计算、人工智能硬件加速的基石。它代表了从“更快地完成任务”到“同时完成更多任务”的计算范式转变。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐