GPU基础与架构:从并行计算到AI算力核心
2.1 GPU工作原理:从图形加速器到通用计算引擎
GPU(Graphics Processing Unit)最初设计目标是为图形渲染提供大规模并行计算能力。图形渲染的本质是对数百万个像素点执行相同或相似的数学运算——坐标变换、光照计算、纹理映射、颜色填充等。这类任务天然具有“数据并行”特征:每个像素的计算相互独立,不需要等待其他像素的结果。GPU正是围绕这一特征设计的:用大量相对简单的计算核心,同时处理海量独立数据。
现代GPU采用SIMT(单指令多线程)执行模型。以NVIDIA Ampere架构为例,其内部结构可概括为以下层级:
- GPC(图形处理簇):最高层级模块,包含光栅化引擎、光追引擎和多个SM。
- SM(流式多处理器):GPU的基本调度和执行单元,包含CUDA核心、Tensor Core、共享内存、寄存器堆等。
- CUDA Core:执行整数和浮点运算的最小单元,每个时钟周期可执行一条指令。
- Warp(线程束):SM调度线程的基本单位,通常为32个线程。同一Warp内的线程执行同一条指令,但作用于不同数据。
2.2 CUDA核心与Tensor Core:GPU的“算力引擎”
CUDA核心是NVIDIA GPU中最基础的运算单元,负责执行浮点运算(FP32)、整数运算(INT32)和逻辑操作。以A100为例,每个SM包含64个FP32 CUDA核心和32个INT32核心。CUDA核心本质上是单精度浮点单元(FMA,融合乘加),一条指令完成 d = a × b + c 运算,这是矩阵乘法和卷积中最频繁的操作。
然而,AI训练和推理对算力的需求远超传统图形计算。为此,NVIDIA从Volta架构开始引入Tensor Core——专为深度学习矩阵运算设计的专用硬件单元。Tensor Core支持混合精度计算(FP16输入、FP32累加),能在单个时钟周期内完成4×4矩阵乘法。A100的Tensor Core进一步支持TF32、BF16、FP16和INT8等多种精度。
| 特性 | CUDA Core | Tensor Core |
|---|---|---|
| 设计目标 | 通用并行计算(图形、科学计算) | 深度学习矩阵运算(GEMM) |
| 运算精度 | FP32 / INT32 / FP64(部分型号) | FP16 / BF16 / TF32 / INT8 / INT4 |
| 单周期运算 | 1次FMA(标量) | 4×4×4矩阵乘加(2048次FMA等效) |
| A100数量 | 6912个 | 432个 |
| 典型算力(FP16) | 19.5 TFLOPS | 312 TFLOPS(含稀疏性) |
torch.matmul、卷积层和Transformer的注意力计算会自动调用Tensor Core。要让Tensor Core真正生效,需要满足:输入数据为FP16/BF16/TF32格式、矩阵维度为8的倍数(Tensor Core的tile尺寸)、使用cuBLAS/cuDNN等优化库。如果直接使用FP32数据且未开启TF32,则只会走CUDA Core路径,算力差距可达10倍以上。
2.3 显存层次结构:数据搬运的“高速公路系统”
GPU的显存层次结构决定了数据访问速度的上限。理解这一层次,是优化AI训练性能的关键。从快到慢、从近到远,GPU的存储体系如下:
- 寄存器文件(Register File):每个SM内,访问延迟约1个时钟周期,容量约256KB/SM。变量存储在寄存器中,线程私有。
- 共享内存(Shared Memory):每个SM内,访问延迟约20~30周期,容量164KB/SM(A100)。同一Block内线程可共享,常用于数据复用和Block内通信。
- L1缓存:与共享内存共用物理存储(可配置比例),用于缓存全局内存访问。
- L2缓存:芯片级统一缓存,A100为40MB,访问延迟约200周期。所有SM共享,缓存全局内存和显存数据。
- 显存(HBM2e / GDDR6):板卡级存储,A100的HBM2e容量40/80GB,带宽高达2TB/s,但访问延迟约400~600周期。
- 主机内存(CPU侧):通过PCIe或NVLink连接,带宽仅32GB/s(PCIe Gen4 x16)或600GB/s(NVLink 3.0),延迟为数微秒。
在AI训练中,数据搬运往往比计算更耗时。一个典型的Transformer训练迭代中,权重、梯度、优化器状态、中间激活值都需要在显存层次间频繁移动。性能优化的核心原则是:最大化数据在寄存器/共享内存中的复用,减少对显存和主机内存的访问。
2.4 GPU与CPU对比:架构差异决定适用场景
CPU和GPU的架构差异源于设计目标的不同。CPU追求低延迟和复杂逻辑控制,GPU追求高吞吐和大规模并行。以下是核心对比:
| 维度 | CPU(如Intel Xeon 8480+) | GPU(如NVIDIA A100) |
|---|---|---|
| 核心数 | 56物理核心 / 112线程 | 6912 CUDA核心 + 432 Tensor Core |
| 时钟频率 | 2.0~3.8 GHz | 1.41 GHz(Boost) |
| 峰值算力(FP32) | 约 2~4 TFLOPS | 19.5 TFLOPS |
| 峰值算力(FP16) | 不支持(或极低) | 312 TFLOPS(Tensor Core) |
| 内存带宽 | DDR5,约 400 GB/s(8通道) | HBM2e,2,039 GB/s |
| 内存容量 | 可达 2TB+(DDR5) | 40 / 80 GB(HBM2e) |
| 延迟 | 内存访问约 80~100ns | 显存访问约 400~600ns |
| 适合任务 | 串行逻辑、分支密集、操作系统、数据库 | 大规模并行、矩阵运算、图像处理、AI训练 |
需要特别指出的是,CPU和GPU并非替代关系,而是协作关系。在AI训练服务器中,CPU负责数据预处理、任务调度、分布式通信协调,GPU负责核心的张量计算。CPU将数据从磁盘加载到内存,通过PCIe/NVLink拷贝到GPU显存,然后启动GPU Kernel执行计算,最后将结果回传。
2.5 常见误区与复盘
ncu(NVIDIA Nsight Compute)分析时,应关注“Compute Throughput”和“Memory Throughput”两个指标,判断瓶颈在计算侧还是访存侧。
- 使用
nvidia-smi查看GPU利用率、显存占用、温度、功耗。 - 若GPU利用率低于80%,使用
nsys profile检查是否存在CPU数据加载瓶颈或Kernel间隙。 - 使用
ncu --set full分析单个Kernel的SM占用率、内存吞吐、Warp发散率。 - 若SM占用率低,检查Block大小、寄存器用量、共享内存配置是否合理。
- 若内存吞吐接近上限,考虑算子融合(如将激活函数融合进前一层)、使用FP16/BF16混合精度、优化数据布局(NHWC vs NCHW)。