Files
project_6/CCCL_MUH_PARITY_AUDIT.md
dylanyunlon 611c491b0f audit: CCCL vs muh parity check — scale_mem_bound 11/11 PASS, SM100 benchmark values extracted
- scale_mem_bound: FULL PARITY with CCCL (all 11 test cases match)
- Extracted all SM100 benchmark annotations from 26 tuning headers
- reduce: 7 SM100 tunings + 3 deterministic (SM90/SM86)
- scan: 7 SM100 lookback tunings with delay policies
- Generated machine-readable JSON with benchmark runner params
- Identified 5 pending verification items for BI-V100 hardware
2026-08-07 07:19:00 +00:00

135 lines
7.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

================================================================================
CCCL vs muh 精确比对审计报告
================================================================================
### 1. scale_mem_bound 函数 parity check
------------------------------------------------------------
float32 (CCCL SM100 reduce) CCCL=( 16i, 512t,tile= 32768B) muh=( 16i, 512t,tile= 32768B) ✓
float64 (CCCL SM100 reduce) CCCL=( 8i, 640t,tile= 40960B) muh=( 8i, 640t,tile= 40960B) ✓
accum8 (CCCL SM100 reduce) CCCL=( 7i, 512t,tile= 28672B) muh=( 7i, 512t,tile= 28672B) ✓
scan 4B (CCCL SM100 scan) CCCL=( 22i, 384t,tile= 33792B) muh=( 22i, 384t,tile= 33792B) ✓
scan 8B (CCCL SM100 scan) CCCL=( 11i, 416t,tile= 36608B) muh=( 11i, 416t,tile= 36608B) ✓
det float32 SM90 CCCL=( 13i, 224t,tile= 11648B) muh=( 13i, 224t,tile= 11648B) ✓
det float64 SM86 CCCL=( 5i, 128t,tile= 5120B) muh=( 5i, 128t,tile= 5120B) ✓
1-byte type CCCL=( 32i, 256t,tile= 8192B) muh=( 32i, 256t,tile= 8192B) ✓
2-byte type CCCL=( 32i, 256t,tile= 16384B) muh=( 32i, 256t,tile= 16384B) ✓
16-byte type (int128) CCCL=( 4i, 256t,tile= 16384B) muh=( 4i, 256t,tile= 16384B) ✓
SMEM cap test (should trigger) CCCL=( 8i, 768t,tile= 49152B) muh=( 8i, 768t,tile= 49152B) ✓
→ scale_mem_bound: FULL PARITY ✓
### 2. reduce tuning: CCCL SM100值 → BI-V100 scale_mem_bound适配后
------------------------------------------------------------
CCCL benchmarked on SM100 → muh should use scale_mem_bound for BI-V100
Key: reduce loads to REGISTERS not SMEM → SMEM cap rarely triggers
float32_plus_o4 @4B: scaled=(16i, 512t) tile= 32768B (66.7%)
float32_plus_o4 @8B: scaled=( 8i, 512t) tile= 32768B (66.7%)
float64_plus_o4 @4B: scaled=(16i, 640t) tile= 40960B (83.3%)
float64_plus_o4 @8B: scaled=( 8i, 640t) tile= 40960B (83.3%)
accum8_plus_o4 @4B: scaled=(15i, 512t) tile= 30720B (62.5%)
accum8_plus_o4 @8B: scaled=( 7i, 512t) tile= 28672B (58.3%)
accum8_plus_o8 @4B: scaled=(15i, 512t) tile= 30720B (62.5%)
accum8_plus_o8 @8B: scaled=( 7i, 512t) tile= 28672B (58.3%)
det_float32_sm90 @4B: scaled=(13i, 224t) tile= 11648B (23.7%)
det_float32_sm90 @8B: scaled=( 6i, 224t) tile= 10752B (21.9%)
det_float32_sm86 @4B: scaled=( 6i, 224t) tile= 5376B (10.9%)
det_float32_sm86 @8B: scaled=( 3i, 224t) tile= 5376B (10.9%)
det_float64_sm86 @4B: scaled=(11i, 128t) tile= 5632B (11.5%)
det_float64_sm86 @8B: scaled=( 5i, 128t) tile= 5120B (10.4%)
default_fallback @4B: scaled=(16i, 256t) tile= 16384B (33.3%)
default_fallback @8B: scaled=( 8i, 256t) tile= 16384B (33.3%)
### 3. muh bi100 reduce当前值 vs CCCL参考
------------------------------------------------------------
muh改用了更大的items (24 vs SM100的16)来补偿16 SMs
这是对的——reduce加载到寄存器,SMEM不是瓶颈
★ float32 plus (paged_attention score reduction — 83% weight):
CCCL SM100: items=16, threads=512, vec=2
muh BI-V100: items=24, threads=512, vec=2
理由: 16 SMs vs 148 SMs, 每个CTA需要处理更多数据
tile对比: SM100=512*16*4=32768B | BI-V100=512*24*4=49152B (exactly 48KB)
→ items=24 用满了SMEM → 合理但有风险,如果BlockReduce实际占SMEM则溢出
→ 但注释说reduce不用BlockLoad(loads to registers) → 安全
### 4. scan tuning: CCCL SM100 → BI-V100 SMEM约束
------------------------------------------------------------
Scan DOES use BlockLoad staging in SMEM → tile_bytes ≤ 49152 is HARD
lookback_1B_o4 @1B: tpb= 512 ipt=18 tile= 9216B ✓
lookback_1B_o4 @2B: tpb= 512 ipt=18 tile= 18432B ✓
lookback_1B_o4 @4B: tpb= 512 ipt=18 tile= 36864B ✓
lookback_1B_o4 @8B: tpb= 512 ipt=18 tile= 73728B ✗ OVERFLOW → max_items=12
lookback_2B_o4 @1B: tpb= 512 ipt=13 tile= 6656B ✓
lookback_2B_o4 @2B: tpb= 512 ipt=13 tile= 13312B ✓
lookback_2B_o4 @4B: tpb= 512 ipt=13 tile= 26624B ✓
lookback_2B_o4 @8B: tpb= 512 ipt=13 tile= 53248B ✗ OVERFLOW → max_items=12
lookback_4B_o4 @1B: tpb= 384 ipt=22 tile= 8448B ✓
lookback_4B_o4 @2B: tpb= 384 ipt=22 tile= 16896B ✓
lookback_4B_o4 @4B: tpb= 384 ipt=22 tile= 33792B ✓
lookback_4B_o4 @8B: tpb= 384 ipt=22 tile= 67584B ✗ OVERFLOW → max_items=16
lookback_8B_o4 @1B: tpb= 416 ipt=23 tile= 9568B ✓
lookback_8B_o4 @2B: tpb= 416 ipt=23 tile= 19136B ✓
lookback_8B_o4 @4B: tpb= 416 ipt=23 tile= 38272B ✓
lookback_8B_o4 @8B: tpb= 416 ipt=23 tile= 76544B ✗ OVERFLOW → max_items=14
lookback_1B_o8 @1B: tpb= 384 ipt=14 tile= 5376B ✓
lookback_1B_o8 @2B: tpb= 384 ipt=14 tile= 10752B ✓
lookback_1B_o8 @4B: tpb= 384 ipt=14 tile= 21504B ✓
lookback_1B_o8 @8B: tpb= 384 ipt=14 tile= 43008B ✓
lookback_4B_o8 @1B: tpb= 416 ipt=19 tile= 7904B ✓
lookback_4B_o8 @2B: tpb= 416 ipt=19 tile= 15808B ✓
lookback_4B_o8 @4B: tpb= 416 ipt=19 tile= 31616B ✓
lookback_4B_o8 @8B: tpb= 416 ipt=19 tile= 63232B ✗ OVERFLOW → max_items=14
lookback_8B_o8 @1B: tpb= 320 ipt=22 tile= 7040B ✓
lookback_8B_o8 @2B: tpb= 320 ipt=22 tile= 14080B ✓
lookback_8B_o8 @4B: tpb= 320 ipt=22 tile= 28160B ✓
lookback_8B_o8 @8B: tpb= 320 ipt=22 tile= 56320B ✗ OVERFLOW → max_items=19
关键发现:
- scan lookback_4B_o4: items=22, threads=384 → tile@4B=33792 ✓ tile@8B=67584 ✗
- scan lookback_8B_o4: items=23, threads=416 → tile@8B=76544 ✗
- 这些值在SM100上是安全的(228KB SMEM),但在BI-V100(48KB)上必须降级
- muh已经做了降级(用scale_mem_bound),但需要验证降级后的值是否正确
### 5. CCCL benchmark format解析
------------------------------------------------------------
NVIDIA的benchmark注释格式:
ipt_<items>.tpb_<threads>.ns_<delay>.dcid_<algo>.l2w_<latency>.trp_<transpose>.ld_<load>
后跟4个浮点数: 在[2^16, 2^20, 2^24, 2^28]四个problem size下的speedup
dcid映射:
0 = no_delay
1 = fixed_delay
2 = exp_backoff
3 = exp_backoff_jitter
4 = exp_backoff_jitter_window
5 = exp_backon_jitter_window
6 = exp_backon_jitter
7 = exp_backon
### 6. 竞赛关键路径优先级
------------------------------------------------------------
Token吞吐加权值 = Output_TPS × 16.796 + Input_TPS × 2.799 + Cache_TPS × 0.56
→ Output_TPS权重83%, Input_TPS权重14%, Cache_TPS权重3%
decode热路径 (Output TPS):
1. paged_attention score reduction → reduce (DONE: muh tuned)
2. softmax denominator prefix-sum → scan (DONE: muh tuned)
3. top-k/top-p sampling → topk/radix_sort (DONE: muh tuned)
4. RMSNorm/SiLU/RoPE element-wise → transform (DONE: muh tuned)
prefill热路径 (Input TPS):
5. flash_attention → scan + reduce
6. MoE expert routing → select_if + reduce_by_key
cache热路径 (Cache TPS):
7. KV cache block copy → batch_memcpy (DONE: muh tuned)
### 7. 待验证的关键问题
------------------------------------------------------------
1. reduce items=24: 虽然loads to registers, 但实际BlockReduce<WARP_REDUCTIONS>的SMEM用量需要确认
2. scan delay参数: 0.5x/0.6x缩放是启发式, 需要BI-V100实测L2 write latency
3. LOAD_LDG vs LOAD_DEFAULT: topk bench显示BI-V100上LOAD_DEFAULT更快, reduce/scan可能同理
4. SM count=16 → wave efficiency: 所有tuning都需要重新算occupancy
5. transform bytes_in_flight: 从18GB/s改为56GB/s后items需要相应增大