┌─────────────────────────────────────────────────────────────────────┐
│ GRID (Kernel Launch) │
│ ┌──────────────────┐ ┌──────────────────┐ ┌──────────────┐ │
│ │ BLOCK (0,0) │ │ BLOCK (1,0) │ ... │ BLOCK (n,m) │ │
│ │ │ │ │ │ │ │
│ │ ┌──────────────┐ │ │ ┌──────────────┐ │ │ │ │
│ │ │ WARP 0 │ │ │ │ WARP 0 │ │ │ │ │
│ │ │ T0 T1 ...T31 │ │ │ │ T0 T1 ...T31 │ │ │ │ │
│ │ ├──────────────┤ │ │ ├──────────────┤ │ │ │ │
│ │ │ WARP 1 │ │ │ │ WARP 1 │ │ │ │ │
│ │ │ T32 T33...T63│ │ │ │ T32 T33...T63│ │ │ │ │
│ │ ├──────────────┤ │ │ ├──────────────┤ │ │ │ │
│ │ │ ... │ │ │ │ ... │ │ │ │ │
│ │ └──────────────┘ │ │ └──────────────┘ │ │ │ │
│ │ │ │ │ │ │ │
│ │ ╔══════════════╗ │ │ ╔══════════════╗ │ │ │ │
│ │ ║ SHARED MEM ║ │ │ ║ SHARED MEM ║ │ │ │ │
│ │ ║ (per Block) ║ │ │ ║ (per Block) ║ │ │ │ │
│ │ ╚══════════════╝ │ │ ╚══════════════╝ │ │ │ │
│ └──────────────────┘ └──────────────────┘ └──────────────┘ │
└─────────────────────────────────────────────────────────────────────┘
│ mapped to │ mapped to
▼ ▼
┌─────────────────────────────────────────────────────────────────────┐
│ PHYSICAL HARDWARE (SM) │
│ │
│ ┌─────────────────────────────────────────────────────────────┐ │
│ │ WARP SCHEDULER │ │
│ │ selects ready warp → issues instruction every cycle │ │
│ └──────────────────────────┬──────────────────────────────────┘ │
│ │ │
│ ┌──────────────┼──────────────┐ │
│ ▼ ▼ ▼ │
│ ┌───────────────┐ ┌───────────────┐ ┌───────────────┐ │
│ │ REG FILE │ │ L1 / SMEM │ │ LD/ST UNIT │ │
│ │ (per Thread) │ │ (per SM) │ │ → L2 → HBM │ │
│ │ 64K × 32bit │ │ │ │ │ │
│ └───────────────┘ │ ┌───────────┐ │ └───────────────┘ │
│ │ │ L1 CACHE │ │ │
│ │ │ 128B Line │ │ │
│ │ │(Warp-gran.)│ │ │
│ │ ├───────────┤ │ │
│ │ │SHARED MEM │ │ │
│ │ │ 32 Banks │ │ │
│ │ │ × 4B each │ │ │
│ │ │(Bank Conf!)│ │ │
│ │ └───────────┘ │ │
│ └───────────────┘ │
└─────────────────────────────────────────────────────────────────────┘
五层抽象的归属与边界
软件抽象层(程序员可见) 硬件实现层(对程序员透明)
━━━━━━━━━━━━━━━━━━━━━ ━━━━━━━━━━━━━━━━━━━━━━━━
Grid ──────────────────→ 整个 GPU(所有 SM)
Block ──────────────────→ 单个 SM(一个 Block 不跨 SM)
Thread ──────────────────→ 寄存器 + ALU 时间片
Warp ──────────────────→ 调度器最小发射单元(32 Threads 锁步)
Shared Memory ───────────→ SM 内 32-Bank SRAM
L1 Cache ────────────────→ SM 内 128B-Line SRAM(与 SMEM 物理共享)
L2 Cache ────────────────→ 全芯片共享,32B Sector
HBM ─────────────────→ 片外 DRAM Stack
关键关系速查表
| 关系 | 说明 |
|---|---|
| Grid → Block | Grid 是 Block 的二维/三维数组;Block 间无序、无同步(除 Cooperative Groups) |
| Block → Warp | Block 内线程按创建顺序每 32 个编为一个 Warp;Warp 是实际调度单位 |
| Warp → Thread | Warp 内 32 线程SIMT 锁步执行;分支发散时串行化 mask 切换 |
| Block → Shared Mem | 每个 Block 独占一块 SMEM;Block 结束后 SMEM 内容失效 |
| Warp → L1 | L1 line = 128B = 一个 Warp 的完美合并请求大小 |
| Warp → Bank | 32 threads ↔ 32 banks;同周期同 bank 不同地址 → conflict |
| Thread → Register | 每个 Thread 有独立寄存器文件;跨 Thread 通信必须经 SMEM/L1 |
| L1/SMEM → L2 → HBM | 逐级容量增大、延迟增大、粒度变化;Memory Controller 做粒度适配 |
最容易混淆的三个边界
-
Warp ≠ Block
Block 是资源分配单位(SMEM、barrier),Warp 是执行单位。一个 Block 可能有 8 个 Warp,但同一时刻只有部分 Warp 在发射指令。
-
L1 ≠ Shared Memory
物理上共用同一块 SRAM,可配置比例(如 64KB/64KB),但逻辑上完全独立:L1 是自动管理的 cache(128B line),SMEM 是显式管理的 scratchpad(32-bank)。Bank conflict 只影响 SMEM,不影响 L1。
-
Thread 不是并行单位
硬件从不单独调度一个 Thread。所有资源分配、指令发射、内存访问都以 Warp(32T) 为原子单位。"Thread" 只是编程模型中的索引抽象。
一句话总结
Grid/Block/Thread 是程序员的组织抽象,Warp/Bank/SMEM/L1 是硬件的执行现实。前者决定"数据怎么分",后者决定"数据怎么跑"。性能优化的本质,就是让前者的划分方式恰好对齐后者的物理约束------Warp 对齐 32,SMEM 对齐 32-bank,L1 对齐 128B,L2 对齐 32B sector,HBM 对齐 burst size。