接触了一些cuda编程的概念后我觉得得先从GPU的结构下手
按我逻辑上比较舒服的顺序梳理一下结构
GPU由哪些大部件组成
一整张GPU卡由大量SM+全局缓存+显存接口组成
GPU的主存为HBM/GDDR(显存),存放:模型权重/KV cache/激活/中间张量
整个GPU共享L2 Cache(全局缓存)
专用硬件单元Copy Engines负责CPU与GPU之间的内存拷贝
Interconnect是多卡训练/推理的通信通道
GPU内部并行计算如何被调度
SM是GPU的基本运算单元,一个GPU有几十到上百个
Warp Scheduler(调度器)在SM内有1~多个,以warp(通常32线程)为单位发射指令
Execution Units(执行单元):CUDA Cores/Tensor Cores/SFU
一个SM可同时驻留多个thread blocks,决定occupancy
Shared Memory/L1 Cache每个SM一份,前者程序员显式管理,后者硬件自动缓存
单个线程如何执行指令和访问数据
Thread是CUDA中最小的执行实体
Warp是由32个线程组成的执行小队,是实际调度与执行的最小单位,SIMT(Single Instruction,Multiple Threads)
Registers每个线程私有,延迟最低、容量最小,使用过多会降低并发
Memory Access Pattern,warp 级访存
包含关系图
GPU(整张卡)
│
├── HBM / GDDR(显存,主存)
│
├── L2 Cache(全局缓存,整个 GPU 共享)
│
└── 多个 SM(Streaming Multiprocessor)
│
├── L1 Cache ←┐
├── Shared Mem ←┘ (同一块片上 SRAM,不同用途)
│
├── Warp Schedulers
│
├── Execution Units
│ ├── CUDA Cores
│ ├── Tensor Cores
│ └── SFU
│
└── Registers(寄存器,线程私有)
线程访问数据
Thread
↓
Registers(线程私有)
↓
Shared Memory / L1 Cache(SM 内)
↓
L2 Cache(全 GPU 共享)
↓
HBM / GDDR(显存,主存)