GPU 架构基础

GPU(Graphics Processing Unit,图形处理器)最初是为了处理图形渲染而设计的,但随着技术的发展,它已经演变成一种强大的并行计算设备。本文将介绍 GPU 的基本架构和核心概念。

GPU 的发展历程

GPU 的发展可以分为几个重要阶段:

  • 早期阶段(1990s):主要用于 3D 图形加速,处理简单的几何变换和光栅化
  • 可编程阶段(2000s):引入可编程着色器,开发者可以自定义渲染逻辑
  • 通用计算阶段(2006+):NVIDIA 推出 CUDA,使 GPU 可以用于通用计算(GPGPU)
  • AI 加速阶段(2010s+):深度学习兴起,GPU 成为 AI 训练和推理的核心硬件

GPU 与 CPU 的核心区别

CPU(Central Processing Unit,中央处理器)和 GPU 的设计理念完全不同:

特性 CPU GPU
设计目标 低延迟、复杂逻辑处理 高吞吐量、并行计算
核心数量 几十个(通常 4-64) 数千个(通常 1000-10000)
缓存 大容量、多级缓存 相对较小,注重共享内存
时钟频率 高(2-5 GHz) 较低(1-2 GHz)
适用场景 操作系统、串行任务 图形渲染、矩阵运算、AI

GPU 的核心架构

SM(Streaming Multiprocessor)

SM 是 GPU 的基本计算单元,一个 GPU 包含多个 SM。每个 SM 包含:

  • CUDA Cores:实际的计算单元,负责执行指令
  • Shared Memory:SM 内部的共享内存,速度快但容量小
  • Register File:寄存器文件,存储线程的临时数据
  • Scheduler:指令调度器,负责分配线程到核心
  • Load/Store Units:负责内存读写操作

Warp 和 Thread Block

GPU 的并行计算基于层次化的线程组织:

  • Thread(线程):最基本的执行单元
  • Warp(线程束):一组同时执行的线程(通常 32 个),所有线程执行相同指令(SIMT)
  • Thread Block(线程块):一组线程,可以访问共享内存和同步
  • Grid(网格):一组线程块,构成一个完整的 kernel
// CUDA 线程层次结构示例
__global__ void kernel(int *data) {
    int idx = threadIdx.x + blockIdx.x * blockDim.x;
    data[idx] = idx * 2;
}

int main() {
    int N = 1024;
    int *d_data;
    cudaMalloc(&d_data, N * sizeof(int));

    // 启动 kernel:256 个线程,每个 block 256 个线程
    kernel<<<4, 256>>>(d_data);
}

GPU 内存层次结构

GPU 有复杂的内存层次结构,从快到慢依次为:

  1. Registers:最快的存储,每个线程独有
  2. Shared Memory:Block 内共享,速度快
  3. L1/L2 Cache:硬件管理的缓存
  4. Global Memory:最大的存储空间,但访问慢
  5. Constant/Texture Memory:只读内存,有缓存优化

GPU 性能优化要点

1. 内存合并访问

确保相邻线程访问连续的内存地址,提高内存带宽利用率。

2. 避免线程分歧

Warp 内的线程应执行相同的代码路径,分歧会导致性能下降。

3. 最大化占用率

保持足够的活跃线程,隐藏内存延迟。

4. 使用共享内存

利用共享内存减少全局内存访问次数。

现代 GPU 架构示例

NVIDIA Ampere(RTX 30 系列)

  • 第二代 RT Core:光线追踪加速
  • 第三代 Tensor Core:AI 推理加速
  • GDDR6X 显存:高速显存
  • NVLink:多 GPU 互连

NVIDIA Hopper(H100)

  • 第四代 Tensor Core:FP8 支持
  • HBM3 显存:超高带宽
  • Transformer Engine:优化 AI 模型
  • 机密计算:安全计算支持

总结

GPU 通过大规模并行计算能力,在图形渲染、科学计算、人工智能等领域发挥着重要作用。理解 GPU 的架构和编程模型,是高效利用 GPU 性能的基础。随着 AI 的发展,GPU 架构也在不断演进,为更强大的计算能力提供支持。