GPU内部结构与嵌入式系统介绍
本文深入解析GPU架构设计,重点对比CPU与GPU的设计哲学差异。GPU采用"吞吐量优先"策略,通过成千上万小型核心实现大规模并行计算,其流式多处理器(SM)包含CUDA核心、Tensor核心等专用计算单元,采用SIMT执行模型管理海量线程。文章详细阐述GPU的多层次架构,包括芯片级结构、SM内部组成、线程执行模型和复杂内存体系,并探讨其在AI加速和嵌入式系统中的特殊优化。GP
一、设计哲学对比 —— 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代码,更是为了理解现代异构计算、人工智能硬件加速的基石。它代表了从“更快地完成任务”到“同时完成更多任务”的计算范式转变。
更多推荐
所有评论(0)