# PR304 SM100/FP8/FP4/BF16 GEMM Suite 代码review报告

## 范围

- Worktree: `pr-304`
- HEAD: `211d2678d`
- 审查方式: 代码review
- 这是 DeepGEMM 主分支的早期 snapshot，包含完整的 SM100 和部分 SM90 kernel 套件

## 实现概述

### SM100 FP8/FP4 MegaMoE Fused Kernel

`deep_gemm/include/deep_gemm/impls/sm100_fp8_fp4_mega_moe.cuh` (~1364 lines)

**warp 分工与线程布局 (硬编码 dispatch=128, TMA=128, epilogue=256):**

| Warp Index | 数量 | Threads | Role | 所属 Warpgroup |
|---:|---:|---:|---|---|
| 0–3 | 4 warps | 128 | Dispatch: 扫描 topk_idx，写 expert send/recv count，NVLink pull token+SF | WG0 |
| 4 | 1 warp | 32 | TMA A + SFA loader | WG1 |
| 5 | 1 warp | 32 | TMA B + SFB loader | WG1 |
| 6 | 1 warp | 32 | MMA issue warp (仅 leader CTA) | WG1 |
| 7 | 1 warp | 32 | Idle (warpgroup 占位) | WG1 |
| 8–15 | 8 warps | 256 | Math UMMA + SwiGLU epilogue + BF16 scatter + Combine reduce | WG2, WG3 |

**精确 warp 统计: 16 warps = 512 threads = 4 warpgroups** |

**寄存器分配 (典型配置: dispatch=128, TMA=128, epilogue=256):**

| Role | 每 thread register 数 | Threads | 总 register 消耗 |
|---|---|---|---|
| Dispatch | 48 | 128 | 6,144 |
| TMA/non-epilogue | 40 | 128 | 5,120 |
| Math/epilogue | 208 | 256 | 53,248 |
| **总计** | | **512** | **64,512 (恰好 64K budget)** |

**关键约束:**
- `kNumDispatchThreads % 128 == 0` → dispatch 独占整数个 warpgroup
- `kNumNonEpilogueThreads == 128` → TMA 恰好一个 warpgroup
- `kNumEpilogueThreads % 128 == 0` → math 独占整数个 warpgroup
- 2-CTA cluster MMA (SM100 UMMA)，cluster_size=2

### 其他 SM100 Kernel

| Kernel | 线程布局 | 备注 |
|---|---|---|
| `sm100_fp8_gemm_1d1d` | dispatch≥128 + TMA=128 + math≥128 | FP8 1D-1D grouped GEMM，TMEM accumulator |
| `sm100_fp8_fp4_gemm_1d1d` | 同上 | FP8/FP4 混合精度，UE8M0 SF packing |
| `sm100_bf16_gemm` | 同上 | BF16 GEMM, TMEM, stage merging |
| `sm100_fp8_mqa_logits` | cluster=2, 128 specialized + 256 math | FP8 MQA attention logits |
| `sm100_tf32_hc_prenorm_gemm` | cluster=2, dispatch+math | HyperConnection prenorm GEMM |

## 代码review发现

### 中: SM100 MegaMoE 调度器波次边界越界读取

`deep_gemm/include/deep_gemm/scheduler/mega_moe.cuh:73-81` 中 `get_num_tokens()` 声明的 `valid_value` 未初始化，在波次最后一个 expert 完成时 `advance_expert_idx()` 会在无人拥有该 expert index 的 warp 中调用 `get_num_tokens(wave_end)`。

### 中: SM100 kernel 的 register budget 在默认配置下已达上限

dispatch=128*48 + TMA=128*40 + epilogue=256*208 = 64512，恰好等于 64K reg budget（SM 寄存器总数 65536，扣除 CUDA runtime 开销后约 64512 可用）。任何 register 增加都会溢出。

### 低: TMA TMA load warp 中 `warp_idx == kNumDispatchWarps + 3` 的 idle warp 仅执行 dealloc，无实际工作

## 正面评价

- 完整覆盖 SM100 GEMM、MegaMoE、MQA attention、paged attention 场景
- 2-CTA cluster 充分利用 SM100 硬件能力
- HEURISTICS 文件结构清晰，按架构分离

## 建议检查清单

- 修复 scheduler `valid_value` 未初始化
- 所有 kernel 的 `warpgroup_reg_dealloc` 参考 SM90 已验证模式，当前无问题
