Skip to content

GPU 硬件架构深度解析

理解 GPU 硬件是写出高性能 CUDA 代码的前提。本文从芯片级别拆解 NVIDIA GPU 的物理结构,揭示并行计算能力的硬件来源�?

GPU 整体架构层次

GPU Die
�?
├── GPC (Graphics Processing Cluster) × N
�?  ├── TPC (Texture Processing Cluster) × M
�?  �?  └── SM (Streaming Multiprocessor) × 2
�?  �?      ├── CUDA Core (FP32) × 128
�?  �?      ├── Tensor Core × 4
�?  �?      ├── RT Core × 1 (Turing+)
�?  �?      ├── LD/ST Unit × 32
�?  �?      ├── SFU (Special Function Unit) × 16
�?  �?      ├── Warp Scheduler × 4
�?  �?      ├── Register File (256KB)
�?  �?      ├── L1 Cache / Shared Memory (128KB)
�?  �?      └── Texture Unit
�?  �?
�?  └── Raster Engine
�?
├── L2 Cache (共享,全芯片)
├── Memory Controller × N
└── HBM / GDDR 显存

SM �?Streaming Multiprocessor

SM �?GPU �?基本计算单元*,所�?CUDA Kernel 都在 SM 上执行�?

SM 内部结构(以 Ampere A100 为例�?

组件数量说明
FP32 CUDA Core128单精度浮�?整数运算
FP64 Core64双精度浮点运�?
Tensor Core (3rd Gen)4矩阵乘法加速单�?
LD/ST Unit32内存加载/存储单元
SFU16超越函数(sin/cos/sqrt/rcp�?
Warp Scheduler4每周期各发射1条指�?
Register File256 KB�?SM 最�?65536 �?32-bit 寄存�?
L1 Cache / Shared Mem192 KB可配置分配比�?

A100 整体规格

A100 SXM4
├── SM 数量�?08
├── CUDA Core�?08 × 128 = 13,824
├── Tensor Core�?08 × 4 = 432
├── FP32 峰值:19.5 TFLOPS
├── TF32 Tensor Core�?56 TFLOPS
├── BF16 Tensor Core�?12 TFLOPS
├── INT8 Tensor Core�?24 TOPS
├── 显存�?0GB HBM2e
└── 显存带宽�? TB/s

Warp �?执行的基本单�?

什么是 Warp

**Warp �?GPU 调度和执行的最小单�?*,由 **32 个线�?*组成�?

Block (例如 256 个线�?
├── Warp 0:Thread 0-31
├── Warp 1:Thread 32-63
├── Warp 2:Thread 64-95
├── ...
└── Warp 7:Thread 224-255

SIMT 执行模型

Warp �?32 个线�?同时执行同一条指�?,但各自操作不同数据�?

cpp
// 每个线程执行相同指令,但 threadIdx.x 不同
__global__ void add(float* a, float* b, float* c) {
    int i = threadIdx.x + blockIdx.x * blockDim.x;
    c[i] = a[i] + b[i];  // 32个线程同时执行这�?
}

Warp Divergence(分支分歧)

性能陷阱

�?Warp 内线程走不同分支时,GPU 必须串行执行每个分支,效率大幅下降�?

cpp
// 坏:Warp 内线程分�?
if (threadIdx.x % 2 == 0) {
    // 偶数线程执行
    result = a * b;
} else {
    // 奇数线程执行(与偶数线程串行!)
    result = a + b;
}

// 好:�?Warp 对齐的分支(32的倍数�?
if (threadIdx.x / 32 == 0) {
    // Warp 0 的所有线程走这里
    result = a * b;
} else {
    // 其他 Warp 走这�?
    result = a + b;
}

Warp 占用率(Occupancy�?

*Occupancy = 活跃 Warp �?/ SM 最�?Warp �?

SM 通过在多�?Warp 间切换来隐藏内存延迟�?

时间轴:
Warp A: [计算] [等待内存] ........... [计算]
Warp B:         [计算] [等待内存] ... [计算]
Warp C:                 [计算] [等待内存] [计算]
                �?�?A 等待时,调度 B/C 执行

影响 Occupancy 的因素:

资源限制
寄存器数�?�?SM 65536 个,寄存器越多,活跃 Block 越少
共享内存�?SM 固定大小,用得越多,活跃 Block 越少
Block 大小太小导致 Warp 不足,太大限制并�?Block �?

Tensor Core

Tensor Core 是专�?*矩阵乘法**设计的硬件加速单元,是深度学习性能的核心来源�?

工作原理

每个 Tensor Core 每个时钟周期执行一�?**4×4 矩阵乘加(MMA�?*�?

D = A × B + C
其中 A(4×4), B(4×4), C(4×4), D(4×4)

各代 Tensor Core 对比

架构代数支持精度峰值(单卡�?
Volta (V100)1stFP16125 TFLOPS
Turing (T4)2ndFP16, INT8, INT465 TOPS
Ampere (A100)3rdFP16, BF16, TF32, INT8312 TFLOPS
Hopper (H100)4thFP8, FP16, BF16, TF32989 TFLOPS
Blackwell (B200)5thFP4, FP8, FP16, BF164.5 PFLOPS

TF32 精度格式

Ampere 引入�?TF32(TensorFloat-32):

FP32:  1位符�?+ 8位指�?+ 23位尾�?= 32�?
TF32:  1位符�?+ 8位指�?+ 10位尾�?= 19�?
FP16:  1位符�?+ 5位指�?+ 10位尾�?= 16�?

TF32 = FP32 的指数范�?+ FP16 的精�?
�?对深度学习训练几乎无精度损失,速度提升 10x

内存系统架构

访问延迟(从快到慢)�?

寄存�?       ~1 cycle      每线程独有,最�?
L1 Cache      ~20 cycles    �?SM 共享�?28-192KB�?
共享内存      ~20 cycles    �?SM 共享,程序员控制
L2 Cache      ~200 cycles   全芯片共享(A100: 40MB�?
全局内存(HBM) ~600 cycles   所�?SM 共享,容量最�?

内存带宽对比

内存类型A100 带宽H100 带宽
HBM2e/HBM32 TB/s3.35 TB/s
L2 Cache~12 TB/s~60 TB/s
共享内存~19 TB/s/SM~33 TB/s/SM

当多�?GPU 协同工作时,NVLink 提供高带宽的 GPU 间直连:

版本单链路带�?链路�?总带�?
NVLink 2.0 (V100)25 GB/s × 26300 GB/s
NVLink 3.0 (A100)25 GB/s × 212600 GB/s
NVLink 4.0 (H100)25 GB/s × 218900 GB/s

对比 PCIe 5.0 x16 �?~64 GB/s,NVLink 带宽高出一个数量级�?

关键性能指标

Roofline 模型

性能 = min(峰值算�? 内存带宽 × 算术强度)

算术强度 = FLOP / Byte(每字节内存访问对应的浮点运算数�?

         峰值算�?
         �?
性能      �?        ╱‾‾‾‾‾‾‾‾‾‾‾‾‾‾�?
(FLOPS)   �?       �? 内存带宽受限 �?计算受限
          �?      �?
          �?     �?
          └──────────────────────────
                算术强度 (FLOP/Byte)

优化方向

  • 算术强度�?�?优化内存访问(合并访问、使用共享内存)
  • 算术强度高但未达峰�?�?提高 Occupancy、减少分支分�?

下一篇:CUDA 编程模型 �?Thread / Block / Grid →

基于 NVIDIA CUDA 官方文档整理