GPU架构原理
GPU是AI计算的核心引擎。深入理解GPU架构原理, 对于优化AI训练和推理性能至关重要。
预计阅读时间:60分钟·难度:中级·需要CUDA基础
GPU概述
CPU vs GPU
CPU和GPU的设计理念截然不同:CPU追求单线程性能和复杂任务处理, GPU则专注于大规模并行计算。
架构对比
CPU架构(延迟优化): ┌────────────────────────────────────────────────────┐ │ 控制单元 │ ALU │ 大缓存 │ ALU │ 控制单元 │ ALU │ │ │ (复杂) │ │ │ │ (复杂) │ │ │ └────────────────────────────────────────────────────┘ 特点:少量强核心,大缓存,复杂控制 GPU架构(吞吐优化): ┌────────────────────────────────────────────────────┐ │ALU│ALU│ALU│ALU│ALU│ALU│ALU│ALU│ALU│ALU│ALU│ALU│ALU│ │ALU│ALU│ALU│ALU│ALU│ALU│ALU│ALU│ALU│ALU│ALU│ALU│ALU│ └────────────────────────────────────────────────────┘ │ 共享缓存/控制 │ └────────────────────────────────────────────────────┘ 特点:大量弱核心,简单控制,高并行度
关键差异
| 特性 | CPU | GPU |
|---|---|---|
| 核心数 | 8-128个 | 数千-数万个 |
| 时钟频率 | 3-5 GHz | 1-2 GHz |
| 缓存 | 几十MB | 几MB-几十MB |
| 内存带宽 | ~100 GB/s | 1-3 TB/s |
| 设计目标 | 低延迟 | 高吞吐 |
为什么GPU适合AI
深度学习的核心计算是矩阵乘法,天然适合并行化。GPU的架构特点完美匹配AI计算需求:
大规模并行
神经网络中数百万个神经元的计算可以同时进行,GPU数千核心可并行处理
高内存带宽
AI计算需要频繁读写大量数据,GPU的HBM带宽可达CPU的10-30倍
专用计算单元
Tensor Core专门为矩阵运算优化,AI计算效率极高
成熟的软件生态
CUDA、cuDNN、TensorFlow、PyTorch等框架深度优化
GPU架构详解
SM流多处理器
SM(Streaming Multiprocessor)是GPU的核心计算单元, 每个SM包含多个CUDA核心和专用计算单元。
SM结构(以H100为例)
一个SM包含: ├── CUDA核心: 128个 (FP32) ├── Tensor Core: 4个 (第4代) ├── SFU: 32个 (特殊功能单元) ├── 共享内存: 228 KB ├── L1缓存: 256 KB ├── 寄存器文件: 256 KB ├── 线程调度器: 4个 └── Warp调度器: 4个 H100共有132个SM,总计16896个CUDA核心
SM核心组件
- CUDA Core:执行浮点和整数运算的基本单元
- Tensor Core:执行矩阵乘法累加的专用单元,AI训练核心
- SFU:处理sin、cos、sqrt等特殊运算
- Shared Memory:线程间共享的高速存储
- Warp Scheduler:以32线程为单位的调度器
存储层次
GPU的存储层次设计对性能影响巨大,理解存储层次是优化的关键:
GPU存储层次
速度从快到慢: 寄存器 (Register) │ 延迟: 1周期 │ 容量: 每SM 256KB (H100) ▼ 共享内存 (Shared Memory) │ 延迟: ~20周期 │ 容量: 每SM 228KB (H100) ▼ L1缓存 (L1 Cache) │ 延迟: ~30周期 │ 容量: 每SM 256KB (H100) ▼ L2缓存 (L2 Cache) │ 延迟: ~200周期 │ 容量: 50MB (H100) ▼ HBM显存 (Global Memory) │ 延迟: ~500周期 │ 容量: 80GB (H100) │ 带宽: 3.35 TB/s ▼ 主机内存 (Host Memory) │ 通过PCIe/NVLink访问 │ 带宽: 64 GB/s (PCIe 5.0) / 900 GB/s (NVLink 4.0)
NVIDIA架构演进
历代架构对比
| 架构 | 年份 | 代表产品 | 核心创新 |
|---|---|---|---|
| Pascal | 2016 | P100, GTX 1080 | 16nm, NVLink |
| Volta | 2017 | V100 | 第一代Tensor Core |
| Turing | 2018 | RTX 2080, T4 | RT Core, INT4 |
| Ampere | 2020 | A100, RTX 3090 | TF32, BF16, 结构化稀疏 |
| Hopper | 2022 | H100 | FP8, Transformer Engine |
| Blackwell | 2024 | B200, GB200 | 第二代Transformer Engine |
CUDA编程模型
Kernel函数
Kernel是在GPU上执行的函数,由主机调用,在设备上并行执行。
Kernel示例
// 定义Kernel函数
__global__ void vectorAdd(float *a, float *b, float *c, int n) {
// 计算当前线程的全局索引
int idx = blockIdx.x * blockDim.x + threadIdx.x;
// 边界检查
if (idx < n) {
c[idx] = a[idx] + b[idx];
}
}
// 主机调用
int main() {
int n = 1000000;
float *d_a, *d_b, *d_c;
// 分配显存
cudaMalloc(&d_a, n * sizeof(float));
cudaMalloc(&d_b, n * sizeof(float));
cudaMalloc(&d_c, n * sizeof(float));
// 配置执行参数
int blockSize = 256;
int numBlocks = (n + blockSize - 1) / blockSize;
// 启动Kernel
vectorAdd<<<numBlocks, blockSize>>>(d_a, d_b, d_c, n);
// 同步
cudaDeviceSynchronize();
return 0;
}线程层次
CUDA线程层次结构
Grid(网格)
└── Block(线程块)[最多3维]
└── Thread(线程)[最多3维]
层次关系:
- Grid: 所有线程的集合,由多个Block组成
- Block: 线程组,Block内线程可同步和共享内存
- Thread: 最小执行单位
限制(H100为例):
- 每Block最多1024线程
- 每SM最多1536线程
- 每SM最多32个Block
- Grid最大维度: 2^31-1 × 65535 × 65535内存模型
CUDA内存类型
// 1. 全局内存 (Global Memory)
__device__ float globalData[1024]; // 所有线程可访问
// 2. 共享内存 (Shared Memory)
__shared__ float sharedData[256]; // Block内线程共享
// 3. 寄存器 (Register)
float regData; // 线程私有,最快
// 4. 常量内存 (Constant Memory)
__constant__ float constData[256]; // 只读,有缓存
// 5. 纹理内存 (Texture Memory)
texture<float, 1> texRef; // 特殊读取模式
// 共享内存优化示例
__global__ void matMulShared(float *A, float *B, float *C) {
__shared__ float As[TILE_SIZE][TILE_SIZE];
__shared__ float Bs[TILE_SIZE][TILE_SIZE];
// 加载到共享内存
As[ty][tx] = A[row * K + k + tx];
Bs[ty][tx] = B[(k + ty) * N + col];
__syncthreads();
// 计算...
}性能优化
优化策略
1. 内存访问合并
相邻线程访问相邻内存地址,使内存访问合并为一次事务
2. 共享内存优化
利用共享内存减少全局内存访问,注意避免Bank Conflict
3. 占用率优化
合理配置Block大小和数量,最大化SM占用率
4. 使用Tensor Core
利用Tensor Core加速矩阵运算,使用WMMA API或cuBLAS
性能分析
NVIDIA Nsight工具
# 使用nvprof分析 nvprof ./my_cuda_program # 使用Nsight Systems nsys profile ./my_cuda_program # 使用Nsight Compute分析Kernel ncu ./my_cuda_program # 关键指标 - Memory Throughput: 内存吞吐量 - Compute Throughput: 计算吞吐量 - Occupancy: SM占用率 - Warp Execution Efficiency: Warp执行效率 - Memory Access Pattern: 内存访问模式
未来趋势
GPU架构发展方向
- 更高带宽:HBM4将提供更高带宽
- 更强Tensor Core:支持更多精度和运算类型
- Chiplet架构:多芯片封装提升规模
- 存算一体:减少数据搬运开销
- 光互连:NVLink光互连突破距离限制