CUDA 线程层次映射 — 软件配置 → 逻辑层次 → 物理硬件

1. 软件配置 kernel<<<gridDim, blockDim>>>() gridDim = (N + blockDim - 1) / blockDim 总共启动多少个 block — 可以任意大, GPU 自动分批调度 blockDim = 256 (通常取 128 / 256 / 512) 每个 block 多少线程 — 必须是 32 的倍数, 上限 1024 2. 逻辑层次 Grid (网格) — 全部 block 的集合, 分布在 GPU 所有 SM 上。不同 block 之间不能同步, 不能访问对方 Shared Memory。 Block 0 256 threads, 1 个 SM Block 1 256 threads, 1 个 SM Block 2 256 threads, 1 个 SM ... 共 gridDim 个 block Block 0 内部展开: Warp 0 Thread 0–31 Warp 1 Thread 32–63 Warp 2 Thread 64–95 ... ×8 warps = 256 threads blockDim = 256 → 256 threads = 8 warps。每 32 线程自动分组为一个 warp, 由 Warp Scheduler 锁步执行 (SIMT)。 3. 物理硬件 GA102 GPU (RTX 3090) — 82 SM SM0 SM1 SM2 ... ×82 SM SM 内部结构 Warp Scheduler ×4 CUDA Core ×128 Tensor Core ×4 Register / L1 / Shared 对应关系 Grid = 整个 GPU 芯片 gridDim 个 block 分布到所有 SM。自动分批 (wave) — block 0~821 先跑, 然后 822~, ... Block = 1 个 SM 一个 block 固定在一个 SM 上执行,不跨 SM。block 内线程通过 Shared Memory 通信并同步。 Warp = Warp Scheduler 的调度单位 每 32 线程 = 1 warp (硬件自动分组)。 SM 内 4 个 Warp Scheduler,每周期各发射 1 个 warp → 最多 128 threads/cycle。 一个 warp 等内存 (stall ~600 cycles) 时,Scheduler 零开销切到另一个就绪 warp — GPU 靠此隐藏延迟。 Thread = 1 个 CUDA Core 上的 1 条指令 RTX 3090 (1536 threads/SM): blockDim=256 → 6 blocks/SM → 100%  |  blockDim=1024 → 1 block/SM → 67% H100 (2048 threads/SM): blockDim=256 → 8 blocks/SM → 100%  |  blockDim=1024 → 2 blocks/SM → 100%  |  blockDim 和 GPU 型号相关, 不是绝对值