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内的线程执行同一条指令,但作用于不同数据。
关键认知:GPU的并行并非“多核CPU”那种少量强核并行,而是“众核弱核”并行。一个A100 GPU拥有6912个CUDA核心,而一颗高端CPU通常只有16~64个物理核心。GPU通过大规模线程级并行隐藏访存延迟——当部分线程等待内存数据时,SM立即切换到其他就绪Warp执行,从而保持计算单元持续忙碌。
NVIDIA A100 GPU 内部架构层级示意 GPU 芯片(GA100)— 542亿晶体管 GPC 0(图形处理簇) SM 0 64×CUDA Core 4×Tensor Core 共享内存 164KB 寄存器堆 256KB SM 1 64×CUDA Core 4×Tensor Core 共享内存 164KB 寄存器堆 256KB SM 2 64×CUDA Core 4×Tensor Core 共享内存 164KB 寄存器堆 256KB SM 3 64×CUDA Core 4×Tensor Core 共享内存 164KB 寄存器堆 256KB GPC 1(图形处理簇) SM 4 64×CUDA Core 4×Tensor Core 共享内存 164KB 寄存器堆 256KB SM 5 64×CUDA Core 4×Tensor Core 共享内存 164KB 寄存器堆 256KB SM 6 64×CUDA Core 4×Tensor Core 共享内存 164KB 寄存器堆 256KB SM 7 64×CUDA Core 4×Tensor Core 共享内存 164KB 寄存器堆 256KB GPC 2 ~ GPC 7(共8个GPC) 每个GPC包含 4~8个SM A100 总计: 108 个 SM 6912 个 CUDA 核心 432 个 Tensor Core 40MB L2 缓存 HBM2e 显存 40/80GB HBM2e 显存(高带宽内存)— 带宽 1.6~2.0 TB/s CUDA Core Tensor Core 共享内存 寄存器堆 显存

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(含稀疏性)
实践建议:在AI框架(如PyTorch)中,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的存储体系如下:

  1. 寄存器文件(Register File):每个SM内,访问延迟约1个时钟周期,容量约256KB/SM。变量存储在寄存器中,线程私有。
  2. 共享内存(Shared Memory):每个SM内,访问延迟约20~30周期,容量164KB/SM(A100)。同一Block内线程可共享,常用于数据复用和Block内通信。
  3. L1缓存:与共享内存共用物理存储(可配置比例),用于缓存全局内存访问。
  4. L2缓存:芯片级统一缓存,A100为40MB,访问延迟约200周期。所有SM共享,缓存全局内存和显存数据。
  5. 显存(HBM2e / GDDR6):板卡级存储,A100的HBM2e容量40/80GB,带宽高达2TB/s,但访问延迟约400~600周期。
  6. 主机内存(CPU侧):通过PCIe或NVLink连接,带宽仅32GB/s(PCIe Gen4 x16)或600GB/s(NVLink 3.0),延迟为数微秒。

在AI训练中,数据搬运往往比计算更耗时。一个典型的Transformer训练迭代中,权重、梯度、优化器状态、中间激活值都需要在显存层次间频繁移动。性能优化的核心原则是:最大化数据在寄存器/共享内存中的复用,减少对显存和主机内存的访问。

案例:矩阵乘法优化——朴素实现中,每个输出元素需要从显存读取一整行和一整列数据,访存量为O(N³)。通过分块(Tiling)将子矩阵加载到共享内存,每个数据块被复用N/block_size次,访存量降为O(N³/block_size)。A100上使用共享内存分块+寄存器双缓冲,可将FP16矩阵乘法从约19 TFLOPS(纯CUDA Core)提升至接近312 TFLOPS(Tensor Core + 共享内存优化)。

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 常见误区与复盘

误区一:认为“GPU核心数越多,所有程序越快”。GPU的并行优势仅适用于数据并行度高的任务。如果程序包含大量分支判断、递归调用或串行依赖,GPU的SIMT模型会导致Warp内线程发散(Divergence),部分线程等待,利用率大幅下降。例如,链表遍历、图算法中的DFS等任务在GPU上可能比CPU更慢。
误区二:忽略显存容量限制。GPU的HBM显存虽然带宽极高,但容量远小于CPU内存。训练大模型时,模型参数、梯度、优化器状态(如Adam的动量项)和中间激活值都需要驻留显存。以175B参数的GPT-3为例,仅FP16权重就需要350GB,远超单张A100的80GB,必须使用模型并行和梯度分片技术。
误区三:混淆“算力峰值”与“实际吞吐”。厂商标称的TFLOPS是理论峰值,实际能达到的算力通常只有峰值的30%~60%。影响实际吞吐的因素包括:内存带宽是否足够(访存密集型算子)、Kernel启动开销、数据精度转换开销、以及是否有效利用了Tensor Core。使用ncu(NVIDIA Nsight Compute)分析时,应关注“Compute Throughput”和“Memory Throughput”两个指标,判断瓶颈在计算侧还是访存侧。
复盘:一个典型的AI训练性能诊断流程
  1. 使用 nvidia-smi 查看GPU利用率、显存占用、温度、功耗。
  2. 若GPU利用率低于80%,使用 nsys profile 检查是否存在CPU数据加载瓶颈或Kernel间隙。
  3. 使用 ncu --set full 分析单个Kernel的SM占用率、内存吞吐、Warp发散率。
  4. 若SM占用率低,检查Block大小、寄存器用量、共享内存配置是否合理。
  5. 若内存吞吐接近上限,考虑算子融合(如将激活函数融合进前一层)、使用FP16/BF16混合精度、优化数据布局(NHWC vs NCHW)。