深入 DeepGEMM
走进 CTA 与 SM 内部,在交互时间线中理解 DeepGEMM 的计算、数据搬运与流水线。
CUDA 编程模型
四个问题:Host / Device 如何协同,工作如何编号,Threads 如何以 Warp 执行,数据如何共享与同步。
1. Host–Device Execution
先不打开 Kernel 内部。这里只观察 Host 如何提交 GPU 工作、Stream 如何组织顺序, 以及为什么 Host API、Runtime enqueue 与真正的 Device execution 是不同时间段。
2. Parallel Work Organization
Grid → CTA / Thread Block → Thread 定义逻辑工作层级;blockIdx / threadIdx 决定每个 Thread 的全局坐标。
3. SIMT Execution Model
32 个 Thread 构成一个 Warp。 重点看 active lanes、branch divergence,以及 lane 间协作。
0xffffffff
4. Memory & Cooperation
Memory visibility 与 cooperation scope 对齐理解即可。
CTA ↔ output tile:先看映射,再看任务分配
这一层先把 GEMM 简化成 C = A × B,只讨论二维 output tile 的映射 F(i) → (m,n)。
选择任意 CTA / output tile 时,同时观察它需要的 A[m,*] 与 B[*,n],从输入侧理解 CTA 之间的复用关系。
Persistent 不是另一种 tile mapping:它只决定固定 CTA / worker p 从线性任务序列里取哪些 i。
C[m,n],因此沿 K 方向读取整条 A[m,*] 与 B[*,n]。C[0,0] = Σk A[0,k] × B[k,0]
F(i) → (m,n)只回答:第 i 个线性任务是哪块 C output tile。CTA → iStatic:CTA 编号随任务递增;Persistent:固定 CTA 以 stride 反复取 i。常见 CTA ↔ output tile 映射模式 · 开源实现支持矩阵
表格按“映射 family”归类,而不是按仓库起名字。直接表示源码有明确现成实现;等价表示在注明条件下映射结果相同; 可自定义表示框架能写出该映射,但这里没有把它当成官方现成 preset。Persistent / multicast 不列成 mapping mode。
| Mapping family | 核心形状 | Triton | CUTLASS | DeepGEMM | Tensile | Composable Kernel | 关键参数 / 条件 |
|---|---|---|---|---|---|---|---|
| Linear · N-fast | C00 → C01 → … → C10 | 等价 GROUP_SIZE_M=1 | 等价 AlongN + swizzle=1* | 非 Normal 默认 | 未单列这种 preset | 等价 M01=1 | 最基础 row-major;*CUTLASS 此处指 cluster=1×1 |
| Linear · M-fast | C00 → C10 → … → C01 | 可自定义 | 等价 AlongM + swizzle=1* | Batched 分支可出现 | 未单列这种 preset | 等价 N01=1 | 最基础 column-major;*CUTLASS 此处指 cluster=1×1 |
| Grouped-M strip | M 切成 G 行;组内 M-fast | 直接 GROUP_SIZE_M | 等价 AlongN + swizzle G* | 直接 group on M | Blocking 是相关但不同 family | 直接 M00_N0_M01 | Triton 常见 G=8;DeepGEMM 候选 G=8/16;*cluster=1×1 时 CUTLASS 同构 |
| Grouped-N strip | N 切成 G 列;组内 N-fast | 可自定义 / 转置 | 等价 AlongM + swizzle G* | 直接 group on N | Blocking 是相关但不同 family | 直接 N00_M0_N01 | DeepGEMM multicast A 时使用 group on N;*cluster=1×1 时 CUTLASS 同构 |
| 2D Blocking / box | 当前活跃 WG 压进局部矩形,再移动 box | 可自定义 | 不是该命名的公开 preset | 不是该命名的公开 preset | 直接 WorkGroupMappingType=B | 有 grouped WGP 变体 | Tensile WorkGroupMapping / WGM |
| Morton / Z-order | bit interleave;2D 空间填充顺序 | 可自定义 | 未见现成 preset | 未见现成 preset | 直接 WorkGroupMappingType=Z | 未在本次源码核对中确认 | Tensile 源码还注明 Z-order 并不比 blocking 更快 |
tile_id += NUM_SMS;CUTLASS StaticPersistentTileScheduler 用
linear_idx += total_grid_size;DeepGEMM 用 blockIdx.x + iter × kNumSMs。它们都可以叠在各自的
F(i) → (m,n) 之上,而不是另起一种 output-tile mapping。
SM hardware map:先认硬件模块,再讨论 GEMM 数据流
这一层只画相对稳定的硬件结构,不把 TMA/WGMMA 的执行顺序、mbarrier、proxy/fence 画成流程图。 点击硬件模块,右侧再展开它关联的 PTX / CUDA 指令,以及前面讨论过的 register、warp scheduler、scoreboard、TMA、WGMMA、cache、barrier 与 proxy 等知识点。
H20 实机 CUDA Runtime 校验 · 8 / 8 GPU 属性一致PyTorch 2.10.0+cu128 · CUDA 12.8
规格来源与校验说明
④ H20 / H100 / H200 / H800 · 整卡规格对照(可展开)
四种 Hopper SKU 的整卡差异
这里明确保留具体 form factor,不再把 PCIe 与 SXM 混为一类:H20 / H100 / H200 使用当前页面的 SXM profile,H800 则采用本会话实测的 H800 PCIe。单个 SM 的 CC 9.0 上限基本一致;整卡启用 SM 数、L2、显存接口与时钟会因 SKU / form factor 不同。
| GPU profile | Enabled SMs | FP32 cores | 4th-gen Tensor Cores | HBM | HBM bandwidth | L2 | 说明 / 证据 |
|---|---|---|---|---|---|---|---|
| H20 SXM5 96GB | 78 | 9,984* | 312* | 96 GB marketed 97,356 MiB runtime | 4.02 TB/s† | 60 MiB 62,914,560 B | 8×H20 实机 CUDA Runtime 12.8:78 SM、CC 9.0、6144-bit bus、2619 MHz memory clock、60 MiB L2。* core 数按每-SM 架构数量推导;† 带宽由 clock × bus × DDR 推导。 |
| H100 SXM5 80GB | 132 | 16,896 | 528 | 80 GB HBM3 | 3.35 TB/s | 50 MB | NVIDIA 官方 132 SM;每 SM 128 FP32 + 4 Tensor Core。 |
| H200 SXM 141GB | 132 | 16,896* | 528* | 141 GB HBM3e | 4.8 TB/s | 50 MB* | 官方 + 架构推导 NVIDIA CUDA 资料给出 132 SM;带 * 数字由 GH100 每-SM 结构推导。 |
| H800 PCIe | 114 | 14,592* | 456* | 81,079 MiB runtime 85,017,493,504 B | 2.04 TB/s† | 50 MiB 52,428,800 B | 8×H800 PCIe 实机 CUDA Runtime 12.8:114 SM、CC 9.0、5120-bit bus、1593 MHz memory clock、50 MiB L2。* core 数按每-SM 架构数量推导;† 带宽由 clock × bus × DDR 推导。 |
DeepGEMM:CTA 内部执行与 Kernel Configuration
先沿紧凑的 U 型硬件路径观察一个已选定的 BF16 kernel 如何执行:L2 → SMEM → Tensor Core ↓ Registers → smem_c → Global C。下面再结合 Producer / Consumer multi-stage pipeline 理解重叠,最后回到 M×N×K 看 kernel configuration 如何选择。
TMA:不同 stage 的 async copy 可以同时 in-flight;复用某个 stage 前必须经过 WAIT EMPTY。 WGMMA:先经过 WAIT FULL 等当前 stage ready,再经过必要的 ORDER WAIT;图中 WGMMA K0 → K1 → K2 → … 不重叠。 交互:点击任意 bar,只重放该条 lane 对应的具体 TMA / WGMMA operation。
核心流程:硬件 / 实现先限定候选范围 → 资源约束过滤 → 对剩余配置估计并行效率与数据搬运成本 → 选择预计 cycles 最低的 configuration。
BM 沿 64-row 拼;BN 必须落在支持的 N;BK 沿 16 拼。BK = 64BF16 基础 K tileWGMMA = 64 × BN × 16由 BN 选择 instruction shapenum_stages由 BM/BN/BK 的每-stage SMEM 与总 SMEM 决定Group-M / N由 cluster / multicast 方向派生;G 再从 8/16 选ceil(M/BM) × ceil(N/BN)ceil(CTA / num_sms)L1,但这里应理解成 cost model 对 SM 本地数据通路压力的抽象,而不是“TMA 必须经过普通 L1 cache”。num_bytes_l1_* 是性能模型的“本地带宽层级”命名;因为它还包含 SMEM→Tensor Core 和结果 staging 流量,所以不能把它解释成真实的 L1 cache transaction 数。