Skip to content

perf(cuda): batched-decode MMQ follow-ups — Q6_K MMQ kernel, Q/O split-K, cp.async staging (#201 leftover headroom: ~317 -> ~450+ t/s at N=8) #203

Description

@pekkah

Umbrella tracker for the batched-decode headroom left after #201 / PR #202. Work items are split into child issues:

Context

#201 / PR #202 landed the opt-in decode MMQ (SHARPI_BATCH_DECODE_MMQ=1): N=8 aggregate 246 -> 317 t/s. The N=8 step is now ~25.2 ms against a ~9.7 ms whole-step weight-streaming floor. Per-shape (nsys, 40-step capture, Qwen3-8B Q4_K_M @ 4070 Ti, N=8):

shape ms/step vs floor path
q6k ffn_down [4096x12288] 4.77 ~3.2x WS-sw (bit-exact) -> #204
q6k lm-head [151936x4096] 2.76 ~2.7x WS-sw -> #204
q4k gate/up [12288x4096] 6.89 1.7x MMQ n16 -> #205 (cp.async)
q4k Q/O + q4k-half ffn_down [4096x*] 4.47 ~2.7x MMQ n16, grid 64 blocks -> #205 (split-K)
q4k K/V [1024x4096] 0.91 ~6.6x WS (rows<2048 fallback) -> #205 (low prio)
q6k attn_v [1024x4096] 0.77 ~16x WS-sw -> #205 (low prio)

Combined estimate if #204 + #205 land near floor: ~450-500 t/s aggregate at N=8.

Measured dead ends recorded in #201 / PR #202 (do not retry without new evidence): token-warp WS geometry; SoA-Q8_1-act WS reads (register-bound); sub-block-sized MMQ K-step (latency-serial).

🤖 Generated with Claude Code

Metadata

Metadata

Assignees

No one assigned

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions