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 有复杂的内存层次结构,从快到慢依次为:
- Registers:最快的存储,每个线程独有
- Shared Memory:Block 内共享,速度快
- L1/L2 Cache:硬件管理的缓存
- Global Memory:最大的存储空间,但访问慢
- 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 架构也在不断演进,为更强大的计算能力提供支持。