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│
└────────────────────────────────────────────────────┘
│                  共享缓存/控制                      │
└────────────────────────────────────────────────────┘
特点:大量弱核心,简单控制,高并行度

关键差异

特性CPUGPU
核心数8-128个数千-数万个
时钟频率3-5 GHz1-2 GHz
缓存几十MB几MB-几十MB
内存带宽~100 GB/s1-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架构演进

历代架构对比

架构年份代表产品核心创新
Pascal2016P100, GTX 108016nm, NVLink
Volta2017V100第一代Tensor Core
Turing2018RTX 2080, T4RT Core, INT4
Ampere2020A100, RTX 3090TF32, BF16, 结构化稀疏
Hopper2022H100FP8, Transformer Engine
Blackwell2024B200, 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光互连突破距离限制
----