- name
- gpu-opt-tier1-block-tiling
- description
- 为 GPU kernel(Triton/CUDA/HIP)选择 block 或 tile 尺寸、warp 数、pipeline stage, 以及面向 L2 的 block 分组策略。 适用于 autotune matmul 类 kernel、调 occupancy,或让 tile 几何与 M/N/K 规模及 NVIDIA/AMD 线程模型对齐。
# Tier 1:Block、Tile 与 Warp 配置
这个技能对应 [AutoKernel](https://github.com/RightNow-AI/autokernel) 手册中的 Tier 1:
先把 launch geometry 配对,再去做更细的内存微优化。
## `BLOCK_SIZE_M / N / K`
- **资格约束**:对于 tensor/MMA 路径,NVIDIA 上 `BLOCK_K` 通常要求 `>=16`,AMD CDNA 的 MFMA 常要求 `>=32`
- **方形还是矩形**:更宽的 `BLOCK_N` 有利于复用 B,更高的 `BLOCK_M` 有利于复用 A,但都要和寄存器或 SMEM 压力权衡
- **小 M 或小 N**:优先用更小的 tile,例如 `64x64` 或 `64x128`,确保 block 数足够填满 GPU
- **很大的 K**:更大的 `BLOCK_K` 能摊薄加载开销,但可能损害 occupancy
- **瘦长矩阵**:优先照顾更长的维度,避免 warp 空转
## `num_warps` 与 `num_stages`
- **`num_warps`**:更多 warp 能隐藏延迟,但也会增加寄存器占用,甚至降低 occupancy。常见搜索空间是 `2, 4, 8`
- **AMD 注意点**:wavefront 是 64,所以 `num_warps=4` 就是每个 block 256 线程
- **`num_stages`**:NVIDIA 上的软件流水通常希望 `>=2`;而 HIP/ROCm 上 `num_stages` 必须 `>=1`
- **联动关系**:`num_stages` 高、tile 又大时,常常会触发寄存器溢出
## Occupancy 调优
- 如果 DRAM/L2 指标偏低,而 warp 常因内存停顿,先试更多 warp 或更小的 tile
- 如果 occupancy 已经很高但计算单元仍然吃不饱,就该转向更大的 tile,或者进入后续 tier 的指令级优化
## `GROUP_SIZE_M`(面向 L2 的分块)
- 在沿 N 方向推进之前,先处理连续的 `GROUP_SIZE_M` 个 block 行,这样 B tile 更容易留在 L2 中
- 常见搜索空间是 `4, 8, 16`,其中 `8` 往往是比较稳妥的默认值
## 常见 autotune 搜索空间
| 平台 | `BLOCK_M×N×K`(示例) | `num_warps` | `num_stages` | 说明 |
|--------|-------------------------|-----------|------------|--------|
| NVIDIA | 每个维度常见 `64–256`,K 常为 `32–64` | `2, 4, 8` | `2–5` | WGMMA kernel 还需要结合架构上限 |
| AMD | `64–256`,K 常为 `32` | `2, 4, 8` | `1–3` | 支持时可以加入 `waves_per_eu`(`2–8`) |
## AMD:wavefront-64
- 一个 warp 是 64 线程,而不是 32
- 在与线程映射敏感的维度上,对齐到 64 的倍数通常更自然
- 再配合 `waves_per_eu`:compute-bound 可从 `2–4` 起步,memory-bound 可从 `4–8` 起步
## 面向 Triton 的默认起点
- NVIDIA 的 GEMM 类 kernel 常从 `128x256x64`、`128x128x32`、`64x128x32` 起步,并设置 `GROUP_SIZE_M=8`
- AMD CDNA 常从 `128x128x32` 或 `256x128x32` 起步;如果 occupancy 偏差,还应至少补一个 `64x64x32` 配置
- 总线程数要符合硬件上限;在 AMD 上,按 64 的倍数组织能减少尾部发散
## 可整除性、padding 与 grid 覆盖
- 如果 `M/N/K` 不能被 tile 尺寸整除,就要加 mask 或做边缘 epilogue 处理
- 优先选择和 MMA 指令形状对齐的因子,例如 16 或 32
## 与其他技能的关系
- 这个技能和 `gemm-kernel-optimization` 搭配使用,前者给决策逻辑,后者给具体配置组合
- 如果 Tier 1 已经到平台期,就转到 `tier2-memory-access`
## Agent 指令
1. 先读取 `M/N/K`,选择适合问题规模的 tile 尺度
2. 围绕 `BLOCK_*`、`num_warps`、`num_stages` 建一个紧凑的配置网格
3. 对 GEMM 类 kernel,始终扫描 `GROUP_SIZE_M`
4. 在固定最佳配置前,确认 occupancy 和寄存器或 SMEM 没超预算
5. 如果后面仍是带宽主导,就升级到 Tier 2
Voir sur GitHub