The Softmax Wall and the 2:4 Sparse Attention Trap
A first-principles teardown of asymmetric silicon scaling—from MI355X's 896-cycle softmax and Blackwell's polynomial FMA emulation to Rubin's 7-step TMEM repack round-trip, pairwise 4:8 collapse, and why coarse token-level sparsity won
For the past decade, optimizing Transformer attention was treated as a synonym for accelerating matrix multiplication. Every hardware generation followed the same playbook: drop the numerical precision of the Tensor Cores or Matrix Cores—from FP32 to FP16/BF16, then to FP8, and now to 4-bit MXFP4 and NVFP4—to double the matrix FLOPs per clock.
That playbook just hit a physical wall of its own making. By scaling matrix throughput 2× to 4× per generation while leaving Special Function Units (SFUs), vector ALUs, and shared-memory bandwidth behind, chipmakers inverted the attention roofline.
Figure 1: The argument in 77 seconds. Per-SM cycles for one 128 × 128 attention tile from H100 to Rubin, what 2:4 sparsity does to a row of attention values and what that costs (Qin, 2026), and the alternative: drop whole keys before the softmax, as DeepSeek Sparse Attention and DeepSeek-V4.1 do.
In FP8 and FP4, attention is no longer bottlenecked by matrix multiplication. It is bottlenecked by the transcendental and vector math of softmax and the on-chip memory traffic required to shuttle intermediate scores between execution domains:
On AMD’s Instinct MI355X (gfx950, CDNA 4) and Instinct MI455X (gfx1250, CDNA 5): On MI355X, dropping from BF16 to FP8 doubles matrix throughput, so the two attention GEMMs (QK⊤ and PV) for a 32×128 tile take just 1,024 cycles. The exact FP8 softmax between them, however, runs on the vector ALU at unchanged speed and takes 896 vector cycles—leaving AMD’s default AITER kernel with its matrix pipe idle 31.7% of the time. To break that bottleneck in ZYFA (released this week), Zyphra had to bypass the hardware exponential instruction altogether with “Lean P”—an IEEE/FP8 bit-pattern trick that computes 2x in e4m3 using one floating-point multiply-add and one integer conversion, cutting softmax from 896 to 384 cycles and lifting steady-state matrix utilization from 60% to 86%. Even then, preserving dynamic range in FP8 probabilities flips more operand bits in the multiplier trees, triggering a switching-power clock drop from 2,108 MHz to 1,628 MHz on real Mistral-7B activations. In CDNA 5 (gfx1250, MI455X), AMD overhauled the compute core—switching to Wave32 WMMA, expanding addressable VGPRs 4× to 1,024 per wave, adding VOPD3 dual-issue and hardware block-scaled conversions (V_CVT_SCALEF32), and doubling transcendental throughput (2× vs. MI355X). Yet because CDNA 5 simultaneously scales OCP MXFP8 and MXFP4 matrix throughput by 4× over MI355X (reaching 20.13 PFLOPS in FP8/MXFP8 and 40.26 PFLOPS in MXFP4 against 5.03 PFLOPS in BF16), low-bit matrix engines on MI455X outpace the doubled transcendental units by an even wider margin.
On NVIDIA’s Blackwell (sm_100), Blackwell Ultra (sm_103), and Vera Rubin (sm_107): From Hopper H100 to Blackwell B200, BF16 Tensor Core throughput per SM doubled (4,096→8,192 ops/clk/SM), while the multifunction exponential unit (MUFU.EX2) stayed frozen at 16 ops/clk/SM and shared-memory read bandwidth stayed frozen at 128 B/clk/SM. For a 128×128×128 tile on B200, MUFU.EX2 takes 1,024 cycles—already tying BF16 matmuls (1,024 cycles), taking 2× longer than FP8 matmuls (512 cycles), and taking 4× longer than NVFP4 matmuls (256 cycles). FlashAttention-4 had to route 10%–25% of its exponentials onto general-purpose FP32 FMA pipelines via degree-3 Sollya polynomial emulation and skip ~90% of online softmax rescaling steps. NVIDIA responded by doubling SFU throughput in Blackwell Ultra (B300) to 32 ops/clk/SM. Vera Rubin (sm_107) did not double it again for FP32. NVIDIA’s own Rubin spec table lists EX2 at 32 ops/clk/SM for FP32 and 64 for FP16, so the second doubling only exists for half-precision exponentials. Rubin meanwhile doubled per-SM FP8 Tensor Core throughput. With an FP32 exponential, a Rubin FP8 tile is 2× SFU-bound and an NVFP4 tile 4×, worse than B300. Rubin only gets back to a zero-slack FP8 tie if the kernel moves the exponential itself to FP16. NVIDIA’s most direct hardware answer, the Rubin CPX context GPU with “3× exponent operations,” was pulled from the roadmap at GTC 2026.
Against this inverted roofline, a second hardware pitch has resurfaced: accelerating dynamic attention with fine-grained 2:4 Sparse Tensor Cores—most prominently in NVIDIA’s Vera Rubin (sm_107), which adds the PTX 9.4 instruction tcgen05.ld.red.spcompress to prune 2 of every 4 attention logits while loading from Tensor Memory (TMEM) so that PV can run on tcgen05.mma.sp, alongside 4:2 structured-sparse matrix instructions (V_SWMMAC) in AMD’s CDNA 5 (gfx1250). The headline numbers are still sold with sparsity. Rubin’s 50 PF NVFP4 “inference” figure is Transformer Engine compute with a new, undisclosed “adaptive compression” scheme that SemiAnalysis says is neither 2:4 nor Blackwell’s pairwise 4:8; the dense training figure is 35 PF. AMD’s MI455X datasheet lists 2:4 peaks only for FP16, BF16 and INT8, at 10.07 PF, which is half of the same chip’s 20.13 PF of dense FP8.
Let me state my position up front: applying 2:4 (or FP4 pairwise 4:8) hardware sparse matrix units to attention is an architectural trap.
It accelerates the shrinking part of the loop while dumping repack and online-pruning work onto the bottleneck. On Blackwell and Rubin’s tcgen05 architecture, Tensor Cores write S=QK⊤ into TMEM and require operand A (P) for PV to come from TMEM or Shared Memory (SMEM)—never from thread registers. Yet Rubin’s tcgen05.ld.red.spcompress writes its compressed FP32 values (cdata) and 2-bit metadata (mdata) into general-purpose registers. Software must still execute sparse softmax in registers, downcast dtypes, repack P into the MMA A-layout, repack and swizzle the 2-bit metadata, store both back to SMEM/TMEM (tcgen05.st), and wait on a completion fence before tcgen05.mma.sp can issue. (AMD’s CDNA 5 avoids that TMEM round-trip because V_SWMMAC keeps operands and indices in VGPRs, but CDNA 5 lacks a hardware spcompress instruction, leaves unscaled FP8 at the same K=128 tile depth as dense V_WMMA, and disables structured sparsity entirely on block-scaled V_WMMA_SCALE* instructions.) Across Ada, Hopper, and Blackwell, online pruning and compression of P consumes 70% to 87% of total runtime, turning a 1.49×–1.77× standalone FP16 sparse-GEMM speedup into a net 0.38×–0.51× slowdown in FP16 (and trailing dense NVFP4 at 0.93×–0.96× in the 4× tier).
At equal bits and equal Tensor Core tiers, dropping one dense precision step crushes 2:4 on both speed and accuracy. Even before counting metadata or 2:4 structural constraints, analytical distribution models and convex SDP lower bounds (Kuzmin et al., 2023) show that uniform quantization dominates unstructured pruning at every practical bit-width above 3 bits. Once 2:4’s 2-bit index per kept value (1 bit per original element) is counted, 2:4 on 2m-bit values costs the exact same memory as dense (m+1)-bit quantization (2:4 + FP16=9 bits>FP8). Quantization error energy shrinks 4× with every added bit, whereas 2:4 deletes a fixed fraction of tensor energy (e2:4=13.2% on Gaussian data) that never shrinks with bit-width—and Hadamard rotations (Q,K) make 2:4 twice as bad by spreading energy evenly across each 4-tuple. Across 221,408 measured configurations (Qin, 2026), dense FP8 and dense NVFP4 beat 2:4 at the 2× and 4× compute tiers on every operand.
Perplexity hides severe degradation in fact recall and multi-step reasoning, single-sided pruning caps speedup at 1.29×, and Blackwell/Rubin’s pairwise 4:8 FP4 constraint collapses model quality. Evaluating pruned models by WikiText-2 perplexity is a mirage: parametric fact recall breaks at just 20%–30% sparsity (Jin et al., 2024; Jaiswal et al., 2024), pruning small weights monotonically and irreversibly impairs harder tasks by destroying the pre-trained loss basin (Yin et al., 2024), and on Qwen3-1.7B, 2:4 sparsity collapses reasoning accuracy from 54.0% to 15.3% (Shao et al., 2026). Trying to rescue 2:4 accuracy by relaxing to 6:8 sparsity (SlideSparse) forces a 1.5× activation duplication tax that caps theoretical speedup at 1.33×. Inside attention, pruning P alone leaves QK⊤ dense (1.29× Amdahl ceiling), pruning Q or K wrecks early layers and long-context retrieval, and at the NVFP4 floor hardware forces pairwise 4:8 sparsity—blowing up one-shot Llama-3.1-8B perplexity from 6.98 to 108.83.
You can see the verdict in the production serving codebases. In 2026, vLLM and LLM Compressor deleted their 2:4 sparsity kernels for lack of adoption. Where fine-grained sparsity genuinely pays off—such as >99% unstructured activation sparsity in ReLU-gated FFNs via Sakana AI and NVIDIA’s Tile-wise ELLPACK (TwELL) kernels on CUDA Cores, or static weights combined with low-rank adapters below the 4-bit floor—it works by skipping >99% of column/row fetches or operating offline on static weights, neither of which applies to 2:4 attention. In attention, vLLM v0.33.0, SGLang v0.5.23, and FlashInfer v0.7.3—across NVIDIA Hopper/Blackwell/Rubin, AMD MI355X/MI455X, and Google TPUv7 SparseCores—converged on coarse token-level sparse attention (DeepSeek Sparse Attention / DSA, QSA, MSA): a lightweight ReLU indexer selects the top k=512 to 2,048 tokens out of 1M, skipping 99.8% of the QK⊤ matmuls, 99.8% of the softmax exponentials, and 99.8% of the KV HBM reads before the main attention loop even starts, and then executes the surviving tokens as dense tiles at peak low-precision Tensor Core speed.
1. Why did FP8 and FP4 make the softmax the bottleneck?#
To see why softmax suddenly became the governor of long-context prefill and training, start from the two-stage arithmetic structure of self-attention. Given query, key, and value matrices Q,K,V∈RL×d for an attention head of dimension d, tiled into blocks of M queries by N keys, each iteration of the inner FlashAttention loop executes two matrix multiply-accumulates (MMAs) separated by a row-wise online softmax:
Count the operations required for a single M×N tile with head dimension d:
Matrix multiply-accumulate work (QK⊤ and PV):
Each of the two GEMMs performs 2MNd multiply-adds, for a total of
WMMA=4MNdFLOPs
Crucially, WMMA runs on dedicated matrix engines (NVIDIA Tensor Cores, AMD Matrix Cores) whose per-cycle throughput ΘMMA(b)doubles (or quadruples) every time you halve the operand bit-width b—from 16-bit (BF16/FP16) to 8-bit (FP8 E4M3/MXFP8) to 4-bit (NVFP4/MXFP4).
Non-matmul softmax and rescaling work (S↦P and O correction):
Between the two GEMMs, every one of the M×N score elements in S must undergo a row-max reduction, a scaled subtraction, a base-2 transcendental exponentiation
pij=exp(dsij−mi)=2(sij−mi)⋅(log2e/d),Wexp=MNexponentials
a row-sum reduction ℓi=∑jpij, a down-conversion to the MMA input format (BF16, FP8, or FP4), and—whenever a block’s row maximum increases—a vector rescaling of the M×d running output accumulator O.
Look at the fundamental scaling asymmetry between WMMA and Wexp:
The ratio of matrix FLOPs to transcendental exponentials is fixed solely by the head dimension d:WexpWMMA=MN4MNd=4d
For the standard head dimension d=128 used across Llama, Qwen, DeepSeek, Kimi, and GLM, every 1 exponential evaluation is paired with exactly 4×128=512 matrix FLOPs (and for d=64, as in Meta’s 816B Muse Spark Open, only 256 matrix FLOPs per exponential).
Lowering GEMM precision to FP8 or FP4 shrinks the cycle time of those 512 matrix FLOPs by 2× to 8×, but does not reduce Wexp=MN by a single operation. Because attention logits S=QK⊤ must be accumulated and exponentiated in FP32 to avoid catastrophic overflow or underflow before normalization, the softmax stage still has to evaluate M×N exponentials in FP32 on Special Function Units (NVIDIA’s MUFU.EX2) or vector ALUs (AMD’s VALU v_exp_f32), and still has to move S, P, and O across on-chip memories (TMEM, SMEM/LDS, and the register file).
For an attention kernel to remain compute-bound on its matrix engines without stalling on softmax, the hardware’s per-SM/per-WGP matrix throughput ΘMMA(b) and exponential throughput Θexp must satisfy:
At d=128, the moment a chip’s matrix throughput exceeds 512× its exponential throughput (ΘMMA/Θexp>512), the exponential unit takes more clock cycles per tile than both matrix multiplications combined. At d=64, that crossover happens at ΘMMA/Θexp>256.
1.1 How did the cycle budget change from Hopper (sm_90) to Blackwell (sm_100)?#
Now plug the actual per-SM hardware throughputs of NVIDIA’s Hopper H100 (sm_90) and Blackwell B200 / GB200 (sm_100) into that inequality, following the roofline analysis in FlashAttention-4 (Zadouri, Hoehnerbach, Shah, Liu, Thakkar, & Dao, arXiv:2603.05451, §2.2 & §3.1):
On Hopper H100 (sm_90):
BF16 Tensor Cores:4,096 FLOPs/clk/SM (∼1 PFLOPS dense across 132 SMs).
Check the ratio at d=128: in BF16, ΘMMA/Θexp=4,096/16=256≤512. For a 128×128×128 tile, the two BF16 MMAs take TMMA=40964⋅1283=2,048 cycles, while the 1282=16,384 exponentials take Texp=161282=1,024 cycles. Because matrix math took 2× longer than MUFU.EX2, FlashAttention-3 could hide the entire BF16 softmax behind the Tensor Cores using a two-warpgroup ping-pong schedule. In FP8 on Hopper, however, ΘMMA/Θexp=8,192/16=512: TMMA dropped to 1,024 cycles, already tying Texp=1,024 cycles.
On Blackwell B200 / GB200 (sm_100):
As documented in zartbot’s November 2025 microarchitectural analysis (Inside Nvidia GPU: Discussing Blackwell’s Limitations and Predicting Rubin’s Microarchitecture) and the FlashAttention-4 roofline model, NVIDIA aggressively expanded the 5th-generation Tensor Core (tcgen05.mma) and added 256 KB of Tensor Memory (TMEM) plus DSMEM per SM—consuming so much die area that the SM count per die was trimmed to 80 (148 enabled across two dies on B200, 160 on GB200) while the SFU (MUFU.EX2) and SMEM bandwidth were left unscaled:
SMEM read cycles (BF16 operands):QK⊤ is a shared-shared (SS) MMA reading 128×128 of Q and 128×128 of K⊤ from SMEM; PV is a tensor-shared (TS) MMA reading P directly from TMEM and 128×128 of V from SMEM. At 2 bytes/element and 128 B/clk:
TSMEM(fwd, BF16)=1282×(128d+128d+128N)=81923MNd=768 cycles
Exponential unit (MUFU.EX2) cycles:Texp=16MN=161282=1,024 cycles(independent of GEMM precision)
And in the backward pass on B200 (which chains 5 MMAs: S⊤=KQ⊤, dP⊤=VdO⊤, dV=P⊤dO, dQ=αdSK, and dK=αdS⊤Q), 5 BF16 MMAs take TMMA=819210⋅1283=2,560 cycles, while 1-CTA SMEM traffic (reading 8 BF16 MMA operands from SMEM = 2,048 cycles, writing BF16 dS to SMEM = 256 cycles, and writing + TMA-reading FP32 dQ = 1,024 cycles) takes TSMEM=3,328 cycles—exceeding Tensor Core compute time by 30% (and requiring 2-CTA cooperative MMA with 384 cycles of DSMEM dS exchange to bring total SMEM traffic down to 2,688 cycles).
Look at what happened to the forward pass on B200:
Even in BF16, ΘMMA/Θexp=8,192/16=512=4d: the SFU (1,024 cycles) is already tied 1:1 with the Tensor Cores (1,024 cycles), before counting a single cycle of row-max reduction, row-sum reduction, scale subtraction, or TMEM load/store.
In FP8, ΘMMA/Θexp=1,024=8d: the SFU (1,024 cycles) takes 2× longer than both Tensor Core GEMMs combined (512 cycles).
In NVFP4, ΘMMA/Θexp=2,048=16d: the SFU (1,024 cycles) takes 4× longer than both Tensor Core GEMMs combined (256 cycles).
1.2 Did B300 (sm_103) and Rubin (sm_107) fix the exponential unit?#
At this point, a hardware defender will raise the natural objection: “NVIDIA recognized the B200 SFU mistake. Blackwell Ultra (B300 / GB300, sm_103) doubled SFU throughput from 16 to 32 ops/clk/SM, and Vera Rubin (sm_107) doubles it again.”
The first half is true. The second half is true only for half precision. Check both against NVIDIA’s own specifications and benchmarks.
In Blackwell Ultra (B300 / GB300, sm_103), NVIDIA doubled MUFU.EX2 throughput from 16 to 32 ops/clk/SM. In NVIDIA’s mufu_ex2_bench microbenchmark (Making Softmax More Efficient with NVIDIA Blackwell Ultra), isolating raw MUFU.EX2 loops across the full GPU confirms the 2× jump:
On DeepSeek-V3 forward propagation (FPROP) in FP8, that single change—doubling MUFU.EX2 without changing FP8 Tensor Core FLOPs—boosted attention FPROP throughput by ~35%. That 35% jump is the clearest possible proof of how badly B200 was SFU-starved in FP8.
Now look at what 32 MUFU.EX2 ops/clk/SM on B300 actually buys you against the precision ladder:
For a 128×128×128 tile on B300 (sm_103), Texp=321282=512 cycles.
In BF16 (TMMA=1,024 cycles), B300 merely restores the 2:1 MMA-to-SFU cushion that Hopper H100 already had in 2022.
In FP8 (TMMA=512 cycles), Texp=512 cycles is a zero-margin 512-vs.-512 tie: the SFU must stay 100% utilized on every single clock cycle just to keep the FP8 Tensor Cores from stalling, leaving zero slack for row-max, row-sum, or tcgen05.ld/tcgen05.st latency.
In NVFP4—where B300 sm_103 also widened dense Tensor Core reduction depth from K=64 to K=96, pushing dense NVFP4 from 10 PFLOPS to 15 PFLOPS (∼49,152 ops/clk/SM at K=96, or 32,768 at K=64)—TMMA is 171 to 256 cycles against Texp=512 cycles. Even on B300, NVFP4 Tensor Cores still outrun the doubled SFU by 2× to 3×.
Now Vera Rubin (sm_107). Start with what Rubin did to the Tensor Cores:
By moving PCIe, NVLink 6, and NVLink-C2C off the compute dies onto separate I/O dies connected via NV-HBI, Rubin expands the SM count by 1.4× (from 160 SMs on B300 to 224 SMs on Rubin, with 896 Tensor Cores) and raises clock frequency by ∼25%.
Rubin doubles the per-cycle K-dimension throughput of the Tensor Core for FP8 (and expands NVFP4 from K=96 to K=128). Across the GPU, dense BF16 rises from 2.25 PFLOPS (B300) to 4.0 PFLOPS (1.78×), dense FP8 jumps from 5.0 PFLOPS (B300) to 17.5 PFLOPS (3.5× chip-wide, or 2.0× per Tensor Core per clock; NVIDIA’s rack page gives 1.26 EF FP8 training for 72 GPUs), and NVFP4 reaches 35 PFLOPS dense training / 50 PFLOPS inference.
Then read the SFU row of NVIDIA’s own Rubin compute table (Inside the NVIDIA Rubin Platform: Six New Chips, One AI Supercomputer). It lists “Softmax acceleration (SFU EX2 Ops/Clk/SM for FP32 | FP16)” as 16 for Blackwell and 32 | 64 for Rubin. B300 already runs FP32 MUFU.EX2 at 32 per clock per SM (the GB300 mufu_ex2_bench numbers above). So Rubin’s FP32 exponential rate per SM is the same as B300’s. The new doubling is the FP16 EX2 path.
Do the per-SM per-clock arithmetic for a 128×128×128 tile on Rubin. Per-SM FP8 throughput doubles to 32,768 ops/clk/SM, so TMMA(FP8)=256 cycles. NVFP4 reaches 65,536 ops/clk/SM, so TMMA(NVFP4)=128 cycles. Against that:
With an FP32 exponential (32 per clock): Texp=1282/32=512 cycles. FP8 is now 2× SFU-bound and NVFP4 4×. That is worse than B300, where FP8 was a 512-vs-512 tie. Rubin went back to B200’s ratios.
With an FP16 exponential (64 per clock): Texp=256 cycles. FP8 returns to a zero-slack 256-vs.-256 tie and NVFP4 stays 2× SFU-bound.
So the second doubling helps only kernels that move the exponential itself to half precision. That is a numerics decision, not a free speedup. The scaled logit and its exponential then carry FP16’s 10-bit mantissa and narrower range instead of FP32’s, before P is rounded again to BF16, FP8 or FP4 for the PV MMA. It is the same kind of trade ZYFA’s Lean P makes in software on AMD (§2.2): precision that the destination format will throw away anyway is spent on throughput instead. On Rubin, NVIDIA built that trade into the SFU and left the FP32 path where B300 had it.
1.2.1 What about the vector units, Rubin CPX, and Rubin Ultra?
The software escape hatch is narrowing too. FA4’s way around the SFU (§2.1) moves 10%–25% of the exponentials onto FP32 FMA pipes. NVIDIA’s same Rubin blog publishes the FP32 vector rates: 67 TFLOPS (Hopper), 80 (Blackwell), 130 (Rubin). Against dense FP8 matrix throughput of roughly 2 PF (H100), 4.5 PF (B200) and 17.5 PF (Rubin), the ratio of FP8 matrix FLOPs to FP32 vector FLOPs goes from about 30:1 to 56:1 to 135:1. From Blackwell to Rubin the FMA pipes grew 1.6× while FP8 matrix grew about 3.9×. The idle FMA capacity that FA4 borrows shrinks per matrix FLOP each generation, so polynomial emulation buys less on Rubin than it did on B200.
Rubin CPX was NVIDIA’s dedicated answer, and it was pulled. In September 2025 NVIDIA announced Rubin CPX, a monolithic GDDR7 GPU for the context (prefill) phase with up to 30 PF of NVFP4 and “3x faster attention capabilities compared with NVIDIA GB300 NVL72 systems.” Third-party notes from the launch describe the mechanism as “3x exponent operations” in “attention acceleration cores.” That is a chip built around the softmax wall, for exactly the long-context prefill this article is about. It never shipped. CPX was absent from the six-chip Rubin launch at CES 2026 and from the GTC 2026 roadmap. Ian Buck told reporters “we’ve pulled CPX. It’s still a good idea,” and NVIDIA said prefill work goes back to the Rubin GPU, with Groq 3 LPX racks taking the decode-specialist slot. A revived CPX with 168 GB of HBM4 was reported in August 2026 by one analyst (Ming-Chi Kuo) and has not been confirmed. As shipped, the Rubin generation’s context processing runs on a GPU whose FP32 EX2 rate per SM equals B300’s.
Rubin Ultra changes package size, not the per-SM ratio, as far as anything is published. NVIDIA’s only official Rubin Ultra spec is from March 2025: four reticle-sized dies, 100 PF FP4 and 1 TB of HBM4E per package, for 2H 2027 in Kyber racks. In June 2026 SemiAnalysis reported the quad-die design was cut to two dies; NVIDIA has not confirmed that or published a replacement. Either way, NVIDIA has published no SM-level numbers for Rubin Ultra: no SFU rate, no per-SM Tensor Core rate. Adding dies multiplies matrix units and SFUs together. The tile ledger above only moves if the SM itself changes, so there is nothing yet to suggest Rubin Ultra fixes it.
A note on names, since sources mix them:
Rubin is the shipping GPU (two dies, 224 SMs, 288 GB HBM4). SemiAnalysis calls it R200; “R100” appears in some early coverage but is not an NVIDIA product name.
VR200 NVL144 was the GTC 2025 name for the Rubin rack, counting dies. NVIDIA went back to counting packages, so the same rack ships as Vera Rubin NVL72.
Rubin Ultra (R300 in some trackers) pairs with Kyber. “NVL576” meant one Kyber rack counted by dies in 2025; in the GTC 2026 roadmap, Kyber NVL144 is one rack and Vera Rubin Ultra NVL576 is eight racks.
Feynman (2028) has no published performance numbers.
1.3 Does AMD hit the same wall on CDNA 4 (gfx950) and CDNA 5 (gfx1250)?#
This asymmetric scaling wall is not an artifact of NVIDIA’s SM layout. It hits AMD’s Instinct line on both CDNA 4 (gfx950, MI355X) and the newly disclosed CDNA 5 (gfx1250, MI455X / MI450)—first through CDNA 4’s static wave-scheduling constraints, and then through CDNA 5’s 4× microscaling matrix jump.
1.3.1 Why does AITER leave the MI355X (gfx950) matrix pipe idle 31.7% of the time?
On MI355X (gfx950), each Compute Unit (CU) contains four Wave64 SIMD/Matrix Core quadrants. Moving from BF16 to FP8 e4m3 doubles the throughput of the Matrix Fused Multiply-Add (MFMA) units. However, the softmax between QK⊤ and PV executes on the Vector ALU (VALU), whose throughput does not change when the GEMMs switch from BF16 to FP8.
In Zyphra’s ZYFA technical report (Zyphra FlashAttention on AMD, released this week for MI355X on ROCm 7.2.3), the authors traced the exact cycle breakdown for a single SIMD processing a tile of M=32 queries against N=128 keys at head dimension d=128:
FP8 Matrix Core work (QK⊤ + PV):1,024 cycles.
Exact FP8 Softmax work on the Vector ALU (VALU):896 vector cycles.
Look at those two numbers: 896 vector cycles of softmax against 1,024 matrix cycles of FP8 GEMM (87.5% of the entire matrix budget).
On paper, a naive roofline model would say: max(1,024,896)=1,024 cycles, so if you overlap VALU softmax for tile k with MFMA matrix multiplication for tile k+1, the 896 vector cycles should hide completely behind the 1,024 matrix cycles.
Why doesn’t that happen in silicon on MI355X?
Because unlike NVIDIA’s tcgen05 (which runs asynchronously in a separate TMEM domain and signals mbarrier completion in hardware), MI355X does not track matrix instruction completion in hardware. On CDNA 4, both MFMA instructions and VALU instructions are issued by the same wave schedulers and share the vector register file (split into 256 architectural VGPRs and 256 accumulation VGPRs), with no hardware scoreboard for asynchronous MFMA completion. Consequently, overlapping the 896 cycles of VALU softmax with the 1,024 cycles of MFMA requires static instruction-order interleaving across waves sharing a SIMD.
Because Pk=softmax(Sk) has a hard data dependency on the completion of the QKk⊤ MFMA, and the PkVk MFMA has a hard data dependency on the completion of the softmax VALU instructions (plus cross-lane row-max and row-sum reductions and VGPR-to-LDS staging), 1,024−896=128 cycles of slack is far too small to absorb pipeline bubbles:
In AITER (AMD’s default production kernel library), Zyphra’s thread traces show that the MI355X matrix pipe sits completely idle for 31.7% of cycles, capping 32K-token FP8 attention at 1,944 TFLOP/s (39% of the MI355X FP8 datasheet peak) on d=128 and just 1,237 TFLOP/s on DeepSeek’s MLA shape (192/128).
Even when Zyphra implemented a hand-scheduled two-wave ping-pong schedule (where two waves share each SIMD, one issuing MFMA instructions while the other computes softmax probabilities on the VALU, and then swapping), running exact FP8 softmax (896 cycles) only kept the matrix pipe busy for 60% of steady-state cycles.
1.3.2 What changes on CDNA 5 (gfx1250, Instinct MI455X)?
How does AMD’s next-generation CDNA 5 architecture on the Instinct MI455X / MI450 (gfx1250)—detailed in AMD’s Introducing AMD CDNA 5 Architecture whitepaper and the preliminary CDNA5 Instruction Set Architecture Reference Guide (July 2026)—change this equation?
In CDNA 5, AMD made the most sweeping microarchitectural shift since the original GCN/CDNA split, converging several RDNA 4 (gfx12) execution concepts with datacenter matrix and memory engines across 8 TSMC N2 Accelerator Complex Dies (XCDs):
From Wave64 CUs and MFMA to Wave32 WGPs and WMMA:
The 32 Compute Units per XCD of MI355X are replaced by 32 Work-Group Processors (WGPs) per XCD (2 Shader Engines × 16 WGPs per XCD = 256 active WGPs chip-wide, running at up to 2,400 MHz; Whitepaper pp. 6, 21).
Each WGP (“Double Compute Unit”) contains four 32-lane SIMD32 units and four scalar ALUs, and operates exclusively in Wave32 mode (dropping Wave64 entirely; ISA Ch. 1, p. 3), supporting up to 64 resident waves per WGP (16 per SIMD32; Whitepaper p. 10) and up to 32 workgroups per WGP.
CDNA’s old Wave64 MFMA instructions are replaced by Wave32 Wave Matrix Multiply-Accumulate (WMMA) instructions (V_WMMA_* and block-scaled V_WMMA_SCALE*; ISA §7.12, Table 43), operating on 16×16 output tiles (plus 32×16 for FP4).
Just as NVIDIA doubled MUFU.EX2 in B300, AMD’s CDNA 5 whitepaper (p. 7) explicitly states that existing transcendental operations have twice (2×) the throughput of the same instructions on the Instinct MI355X, specifically targeting activation and softmax bottlenecks. (The preliminary CDNA 5 ISA Reference Guide does not publish a per-cycle instruction-rate table for transcendental opcodes, though LLVM gfx1250 scheduling definitions also show FP32 transcendental latency dropping from 9 cycles on RDNA 4 to 8 cycles on gfx1250.)
The ISA also adds native BF16 transcendental instructions (V_EXP_BF16, V_LOG_BF16, V_RCP_BF16, V_RSQ_BF16, V_SQRT_BF16, V_SIN_BF16, V_COS_BF16), hardware hyperbolic tangent (V_TANH_F32, V_TANH_F16, V_TANH_BF16, directly accelerating attention logit soft-capping), and single-lane pseudo-scalar transcendental ALU ops (V_S_EXP_F32, V_S_EXP_F16, V_S_LOG_F32, V_S_LOG_F16, V_S_RCP_F32, V_S_RCP_F16, V_S_RSQ_F32, V_S_RSQ_F16, V_S_SQRT_F32, V_S_SQRT_F16; ISA §7.3 & §7.10).
For general vector math, CDNA 5 retains packed 64-bit FP32 operations (V_PK_FMA_F32, V_PK_ADD_F32, V_PK_MUL_F32; ISA §7.7) and adds RDNA-style dual-issue VALU instructions (VOPD 64-bit 2-source and a new VOPD3 96-bit 3-source encoding; ISA §7.8), delivering 315 TFLOPS of peak vector/matrix FP32 and vector FP16 throughput across the GPU (Whitepaper p. 21).
The 4× Matrix Scaling Leap in FP8/MXFP8 and MXFP4:
Now compare that 2× transcendental speedup against what CDNA 5 did to the matrix engines per clock (Whitepaper pp. 4, 7, 21 & ISA §7.12, Table 43):
Matrix FP16 / BF16 (V_WMMA_F32_16X16X32_{F16,BF16}, K=32): Doubled 2× per clock over MI355X to 5.03 PFLOPS (8,192 FLOPs/clk/WGP, or 2,048 FLOPs/clk/SIMD32 at 2,400 MHz).
OCP MXFP8, FP8, and MXFP6 (V_WMMA_F32_16X16X128_{FP8,BF8} and V_WMMA_SCALE{,16}_F32_16X16X128_F8F6F4, K=128): Quadrupled 4× per clock over MI355X to 20.13 PFLOPS (32,768 FLOPs/clk/WGP, or 8,192 FLOPs/clk/SIMD32). Notice that on MI455X, FP8/MXFP8 matrix peak (20.13 PF) is 4× the BF16 matrix peak (5.03 PF)—not 2×—because CDNA 5 expanded the FP8/F6 WMMA reduction depth to K=128 (4× BF16’s K=32).
OCP MXFP4 (V_WMMA_SCALE{,16}_F32_32X16X128_F4, 32×16×128): Quadrupled 4× per clock over MI355X to 40.26 PFLOPS (65,536 FLOPs/clk/WGP, or 16,384 FLOPs/clk/SIMD32—an 8× jump over MI455X’s own BF16 matrix rate).
Look at what that 4×-vs.-2× scaling asymmetry does to the 32×128 SIMD tile (d=128, WMMA=4×32×128×128=2,097,152 FLOPs) when moving from MI355X (gfx950) to MI455X (gfx1250):
In BF16, both matrix throughput and transcendental throughput doubled (2×) per WGP/CU over MI355X, keeping the BF16 matrix-to-softmax ratio unchanged.
In FP8 / MXFP8, however, per-WGP matrix throughput scaled 4× (1,024 matrix cycles on MI355X →256 matrix cycles on MI455X at 8,192 FLOPs/clk/SIMD32), while only transcendental throughput scaled 2×. ZYFA’s 896-cycle exact softmax on MI355X also contains non-transcendental VALU work (row max, row sum, scaling, FP8 conversion), and AMD does not publish per-cycle rates for either, so the same softmax on MI455X lands somewhere between 448 cycles (if every one of the 896 cycles were transcendental) and 896 cycles (if none were). Either end sits above the 256-cycle FP8 matrix budget.
And in MXFP4 (16,384 FLOPs/clk/SIMD32), both GEMMs for a 32×128 tile finish in 128 matrix cycles.
The same squeeze shows up in AMD’s datasheet totals. MI455X lists 315 TFLOPS of vector FP32 against 20.13 PFLOPS of dense FP8 matrix, a 64:1 ratio of matrix to vector FLOPs. On NVIDIA’s published numbers, Rubin sits at about 135:1 (§1.2.1). AMD left more vector headroom per matrix FLOP than NVIDIA did, but the software exponential tricks of §2 still run on a vector side that grew more slowly than the matrix side.
1.3.3 What about the rest of the MI400 family (MI450, MI430X, MI440X)?
AMD’s naming moved during 2026, so here is what each name refers to and whether it changes the argument:
MI450 is the earlier label for the whole generation. AMD’s Q2 2026 results still say “MI450 Series” for its Helios deals, and this week’s SGLang and vLLM notes say “MI450” for gfx1250 hardware. At the July 23, 2026 launch AMD defined the MI400 series as two GPUs, MI455X and MI430X.
MI455X is the Helios rack GPU and the only MI400 part with a full public datasheet. Everything in §1.3.2 refers to it. The datasheet also shows how far CDNA 5 was split by precision: MI455X lists 5 TFLOPS of FP64, matrix or vector.
MI430X is the HPC and sovereign-AI part: 288 TFLOPS of hardware FP64, 432 GB of HBM4, availability in 2027, and systems announced for ORNL’s Discovery and two European machines. AMD has not published its low-precision matrix rates or its transcendental rate. It does not change the attention ledger, and nothing published lets you compute one for it.
MI440X was announced at CES 2026 as an eight-GPU enterprise server built from a low-precision CDNA 5 subset, like MI455X. It was not in the July launch definition, and AMD has published no compute, memory or availability figures for it.
So for attention on AMD’s 2026–27 parts, the MI455X numbers above are the only ones there are. The CES framing does support one point: AMD is now building different CDNA 5 dies or configurations per precision envelope (FP64 for MI430X, FP4–BF16 for MI440X and MI455X). That is the same choice NVIDIA made in Rubin’s FP64 vector rate, which fell from 40 TFLOPS on Blackwell to 33. Vendors are trading high-precision units for low-precision matrix area. On the AI parts, exponentials got at most 2× out of that trade (on MI455X, and only for FP16 on Rubin), while FP8 matrix got 4× (MI455X over MI355X) or 3.5× (Rubin over B300).
Put the cycle budgets across NVIDIA and AMD generations side by side for a standard attention tile (d=128, normalized to a 128×128 tile on an NVIDIA SM / AMD 4-SIMD WGP, and shown per-SIMD for AMD’s 32×128 tile):
Accelerator (Architecture)
Matrix Throughput (BF16 / FP8 / FP4)
Exp / Vector Unit Scaling
BF16 Tile Cycles (TMMA vs. Texp)
FP8 / MXFP8 Tile Cycles (TMMA vs. Texp)
FP4 Tile Cycles (TMMA vs. Texp)
Primary Forward Bottleneck in FP8 / FP4
NVIDIA Hopper H100 (sm_90)
4,096 / 8,192 / — ops/clk/SM
16 MUFU ops/clk/SM
2,048 vs. 1,024 (2.0× MMA)
1,024 vs. 1,024 (1.0× tied)
—
Co-bottlenecked in FP8 (512:1 ratio)
NVIDIA Blackwell B200 (sm_100)
8,192 / 16,384 / 32,768ops/clk/SM
16 MUFU ops/clk/SM (1× vs. H100)
1,024 vs. 1,024 (1.0× tied)
512 vs. 1,024 (2.0× SFU-bound)
256 vs. 1,024 (4.0× SFU-bound)
Severely SFU-bound (1,024:1 FP8, 2,048:1 FP4)
NVIDIA Blackwell Ultra B300 (sm_103)
8,192 / 16,384 / 49,152∗ops/clk/SM
32 MUFU ops/clk/SM (2× vs. B200)
1,024 vs. 512 (2.0× MMA)
512 vs. 512 (1.0× tied)
171–256 vs. 512 (2–3× SFU-bound)
Zero-slack tie in FP8; 2–3× SFU-bound in FP4
NVIDIA Vera Rubin (sm_107), FP32 EX2
8,192 / 32,768 / 65,536ops/clk/SM
32 EX2 ops/clk/SM (FP32) (1× vs. B300)
1,024 vs. 512 (2.0× MMA)
256 vs. 512 (2.0× SFU-bound)
128 vs. 512 (4.0× SFU-bound)
Back to B200’s ratios with an FP32 exponential
NVIDIA Vera Rubin (sm_107), FP16 EX2
same
64 EX2 ops/clk/SM (FP16) (2× vs. B300)
1,024 vs. 256 (4.0× MMA)
256 vs. 256 (1.0× tied)
128 vs. 256 (2.0× SFU-bound)
Zero-slack tie in FP8 only if the exponential runs in FP16
AMD Instinct MI355X (gfx950, CDNA 4)
4,096 / 8,192 / 16,384ops/clk/CU (MFMA)
Baseline VALU (1×, per-CU rate not in ZYFA)
2,048 vs. 896 (32×128 SIMD tile)
1,024 vs. 896 (87.5% of MFMA)
512 vs. 896 (1.75× VALU-bound)
VALU softmax + static wave overlap (31.7% idle in AITER)
AMD Instinct MI455X (gfx1250, CDNA 5)
8,192 / 32,768 / 65,536ops/clk/WGP (WMMA)
2× Transcendentals vs. MI355X (exact ops/clk unpublished)†
1,024 vs. 448–896† (32×128 SIMD tile)
256 vs. 448–896† (4× matrix vs. 2× trans)
128 vs. 448–896† (8× BF16 matrix rate)
4× FP8/FP4 matrix leap outruns 2× trans scaling
*Note: B300 (sm_103) supports dense K=96 for NVFP4 (1.5× B200’s K=64), and Rubin (sm_107) expands NVFP4 to K=128 (2× B200’s K=64) while doubling FP8 K depth. Rubin’s EX2 rates are NVIDIA’s published 32 (FP32) and 64 (FP16) ops/clk/SM. †For MI455X (gfx1250), per-WGP matrix rates are derived directly from AMD’s published peaks (5.03 PF BF16, 20.13 PF FP8/MXFP8, 40.26 PF MXFP4 at 2,400 MHz across 256 WGPs); exact per-cycle transcendental instruction rates are not published in the preliminary CDNA 5 ISA guide, so 448–896 brackets MI355X’s 896-cycle exact softmax under the whitepaper’s stated 2× transcendental throughput: 448 if all of those cycles were transcendental, 896 if none were.
Conclusion: Across both NVIDIA (sm_100→sm_107) and AMD (gfx950→gfx1250), the transition from BF16 to FP8 and FP4 broke the foundational assumption of early FlashAttention kernels—that non-matmul softmax work is cheap enough to hide effortlessly behind slow matrix multiplications. Once matrix units take 128 to 1,024 cycles per tile while exact softmax takes 256 to 1,024 cycles, hardware SFU/transcendental doublings alone only tread water. They fall further behind when FP8/FP4 matrix depth quadruples (CDNA 5) or when the doubling covers only FP16 exponentials (Rubin). To keep the matrix engines fed, software had to rewrite how exponentials and online normalization are computed.
2. How does software get around the exponential unit, and what does it cost?#
When hardware transcendental units cannot keep up with low-precision matrix engines, kernel engineers have only two mathematical degrees of freedom:
Replace hardware exp2 calls with software bit-manipulation and polynomial FMA instructions that execute on underutilized ALU/FMA pipes; and
Eliminate redundant vector rescaling and reduction operations in the online softmax loop.
Both FlashAttention-4 (on NVIDIA Blackwell B200) and Zyphra’s ZYFA (on AMD MI355X) pull these exact levers—and AMD’s CDNA 5 (gfx1250) ISA bakes several of those software workarounds directly into silicon.
2.1 How does FlashAttention-4 do it on Blackwell?#
Look at how FlashAttention-4 (Zadouri et al., 2026) attacks the 1,024-cycleMUFU.EX2 wall on Blackwell B200 (sm_100).
First, FA4 partitions each 512-thread CTA into four specialized 128-thread warpgroups (WG0–WG3 in the CuTe-DSL / TIRx reference implementation) and uses PTX setmaxnreg instructions to dynamically redistribute the SM’s 65,536 32-bit registers to the warps that actually hold the softmax rows:
WG3 (Orchestration: Warp 0 = tcgen05 MMA, Warp 1 = TMA Load, Warp 2 = TMA Store): Because tcgen05.mma is launched by a single elected thread (elect_sync) and writes its accumulator directly to Tensor Memory (TMEM) rather than registers, WG3 sheds registers via setmaxnreg.dec.sync.aligned.u32(48) (48 registers/thread).
WG0 and WG1 (Ping-Pong Softmax for Q Stages 0 and 1): Acquire the freed registers via setmaxnreg.inc.sync.aligned.u32(200) (200 registers/thread, totaling 128×(200+200+64+48)=65,536 registers). That 200-register budget allows each of the 128 threads in a softmax warpgroup to load and hold one entire 128-element FP32 row of S in private registers (s_chunk_buf), eliminating inter-thread warp shuffles during the row-max and row-sum reductions.
Even with zero warp-shuffle overhead and WG0/WG1 alternating on two query tiles (QH and QL), the hardware MUFU.EX2 pipe is still capped at 16 ops/clk/SM. While MUFU.EX2 is 100% saturated during softmax, the SM’s general-purpose FP32 FMA pipelines sit mostly idle.
FA4 exploits those idle FMA pipelines by implementing a hybrid hardware/software exponential:
Cody–Waite Range Reduction (2x=2⌊x⌋⋅2xfrac):
For any scaled logit x=(sij−mi)log2e/d (clamped at −127 to prevent underflow), decompose x into its integer floor n=⌊x⌋∈Z and fractional part xfrac=x−⌊x⌋∈[0,1). In hardware, FA4 extracts ⌊x⌋ in two FP32 instructions using the magic-number round-down trick: add 223+222=12,582,912.0 to force the fractional bits out of the 23-bit IEEE-754 mantissa, then subtract it back in round-toward-−∞ mode.
Degree-3 Sollya Minimax Polynomial on Packed f32x2 FMA Units:
On the unit interval xfrac∈[0,1), FA4 approximates 2xfrac with a degree-3 polynomial whose coefficients are optimized via the Sollya package to minimize maximum relative error:
2xfrac≈p0+xfrac(p1+xfrac(p2+p3xfrac)),{p0=1.0,p2=0.22756439,p1=0.69514614,p3=0.07711909
Using Horner’s rule, evaluating this cubic polynomial on pairs of logits takes just three packed fma.rn.ftz.f32x2 instructions:
// Horner evaluation of (((p3 * r) + p2) * r + p1) * r + 1.0 on packed f32x2fma.rn.ftz.f32x2 l10, l9, l6, l5;fma.rn.ftz.f32x2 l10, l10, l9, l4;fma.rn.ftz.f32x2 l10, l10, l9, l3;
IEEE-754 Exponent Bit-Shift Reconstruction:
Because 2xfrac∈[1,2), its IEEE-754 FP32 representation already has biased exponent 127 and holds the fractional mantissa bits in bits [0..22]. Multiplying by 2⌊x⌋ is therefore a single integer shift-and-add: shift the integer ⌊x⌋ left by 23 bits into the FP32 exponent field ([23..30]) and add the bit representation of 2xfrac.
Why doesn’t FA4 run all 128 exponentials per row through FMA emulation? Because polynomial emulation requires extra temporary registers for intermediate values and polynomial coefficients, consumes more register-file read/write bandwidth, and has higher instruction latency than a single MUFU.EX2. Emulating 100% of the row would spill registers past the 200-register ceiling. Instead, FA4 tunes the split (emu_pairs): 75%–90% of each row executes on hardware MUFU.EX2, while 10%–25% executes in parallel on the FMA units, expanding effective exponential throughput just enough to break the MUFU bottleneck without a single register spill.
And what about numerical accuracy? Look at the error measurements across 4 million random inputs in [0,1) against an FP64 oracle (Table 2 of FlashAttention-4):
Exponential Method
FP32 Max Rel. Error
FP32 Mean Rel. Error
BF16 Max Rel. Error (after cast to P)
BF16 Mean Rel. Error (after cast to P)
Ideal (FP64→BF16)
—
—
3.89×10−3
1.41×10−3
Hardware MUFU.EX2
1.41×10−7
3.04×10−8
3.89×10−3
1.41×10−3
FA4 Degree-3 FMA Polynomial
8.77×10−5
5.43×10−5
3.90×10−3
1.41×10−3
Degree-4 FMA Polynomial
3.05×10−6
1.84×10−6
3.89×10−3
1.41×10−3
Degree-5 FMA Polynomial
1.44×10−7
5.48×10−8
3.89×10−3
1.41×10−3
At the raw FP32 level, the 3-FMA cubic polynomial has a max relative error of 8.77×10−5. Once cast to BF16 (or FP8) to form the operand P for PV, however, BF16’s 7-bit mantissa rounding error (3.89×10−3) is 44× larger than the polynomial approximation error. After rounding to BF16, the degree-3 FMA polynomial matches hardware MUFU.EX2 to within 1 BF16 ULP on 99% of inputs and achieves the exact same mean relative error (1.41×10−3).
FA4 pairs this with a second non-matmul optimization: Conditional Online Softmax Rescaling.
In standard FlashAttention-2 and -3, whenever KV block j produces a candidate row maximum rc=max(rold,rowmax(Sj)) strictly greater than the previous reference rold, the kernel immediately rescales the running output accumulator Oj−1 by ascale=2(rold−rc)α. On Blackwell, where O lives in TMEM (O_region), rescaling Oj−1 is expensive: the Correction warpgroup (WG2) must read the 128×128 FP32 tile out of TMEM into registers (tcgen05.ld), multiply every element by ascale, and write it back to TMEM (tcgen05.st) before the next PV MMA can accumulate into O.
FA4 notices that FP32 has a massive exponent range (2−126 to 2127), so subtracting rold instead of rc does not threaten overflow unless the new maximum jumps by a large margin. Setting a threshold τ=log2(256)=8.0 (allowing unnormalized block weights up to 28=256), FA4 modifies the online update rule to:
Each warp in WG2 checks its 32 rows simultaneously using vote.sync.any.pred (any_needs_rescale). Whenever all 32 rows stay within the τ=8.0 slack window (ascale=1.0), the warp skips the entire TMEM -> registers -> multiply -> TMEM correction pass and immediately signals the p_o_rescale barrier so the PV MMA can proceed. Because the final epilogue normalizes Ofinal by the true accumulated denominator ℓfinal on the same reference scale, skipping intermediate rescales preserves exact mathematical equivalence while cutting vector rescaling operations by ~10×. Combined with its CuTe-DSL async pipeline, FA4 reaches 1,613 TFLOP/s in BF16 on B200 (71% hardware utilization, 1.1×–1.3× faster than cuDNN 9.13 and 2.1×–2.7× faster than Triton).
2.2 How does ZYFA do it on MI355X (gfx950), and what changes on CDNA 5 (gfx1250)?#
On AMD’s Instinct MI355X (gfx950), the problem is even sharper: in FP8 attention, the target probability matrix P consumed by the PV MFMA instruction is not 16-bit BF16; it is 8-bit FP8 e4m3.
In AMD’s default AITER kernel, computing P follows the textbook path: evaluate the FP32 base-2 exponential on the vector ALU (v_exp_f32), scale it, and convert the FP32 result down to FP8 e4m3. Across a 32×128 tile, that exact FP8 softmax takes 896 vector cycles against 1,024 matrix cycles, starving the matrix pipe.
In ZYFA, Zyphra asked a first-principles question: if the destination of 2x is an 8-bit e4m3 float with only 3 mantissa bits, why compute a 23-bit FP32 transcendental on the SFU/VALU only to throw away 20 bits of mantissa a cycle later?
Look at the binary layout of an unsigned FP8 e4m3 number:
Bit 7 is the sign bit (0 for non-negative probabilities pij>0).
Bits [6..3] are the 4-bit biased exponent E∈{0,…,15} (bias b=7).
Bits [2..0] are the 3-bit mantissa M∈{0,…,7}, representing the significand 1+M/8.
Now read that 8-bit e4m3 byte directly as an unsigned integer I∈{0,…,127}:
I=8E+M=8(e+7)+8(2xfrac−1)≈8(e+xfrac+7)=8x+56
Because an e4m3 float has 3 mantissa bits (23=8 quantization steps per octave), its integer code I grows by exactly 8 every time the floating-point value doubles (x↦x+1). And on the fractional interval xfrac∈[0,1), the piecewise-linear secant 1+xfrac already approximates 2xfrac to within a maximum error of 1−ln21+ln(ln2)≈0.086, which is smaller than a single e4m3 mantissa step (1/8=0.125).
This observation—a modern FP8 incarnation of Schraudolph’s (1999) IEEE-754 bit-level exponential—gives ZYFA its core mechanism, Lean P:
One Multiply-Add + One Integer Conversion: Instead of calling the hardware exponential unit and then casting FP32 to FP8, Lean P computes the integer bit pattern of the e4m3 probability directly from the scaled logit x using a single floating-point multiply-add (8x+const) and a single float-to-integer conversion. The low byte of that integer is the valid e4m3 floating-point probability.
57% Reduction in Softmax Cycles: Eliminating the transcendental instruction and separate float-to-FP8 conversion slashes softmax vector work per 32×128 block from 896 vector cycles down to 384 vector cycles (2.33× fewer VALU cycles).
Two-Wave Ping-Pong Schedule: With softmax compressed to 384 vector cycles against 1,024 matrix cycles, ZYFA pairs two waves on each SIMD in a ping-pong schedule: while Wave 0 issues MFMA matrix instructions, Wave 1 computes Lean P probabilities on the VALU, and then they swap. Because 384 vector cycles now fit comfortably inside the 1,024-cycle MFMA window, steady-state matrix-pipe utilization jumps from 60% (with exact P) to 86% (with Lean P).
Power-of-2 Block Scaling and Rounded Row Sum via MFMA: To prevent small probabilities from underflowing e4m3’s narrow dynamic range and to eliminate quantization bias in the denominator, ZYFA scales each 64-key block of probabilities by a power of 2 before the Lean P rounding step—a factor that CDNA 4’s block-scaled MFMA instruction removes in hardware at zero extra cycle cost—and normalizes by the sum of the rounded FP8 probabilities (computed by issuing 1 extra matrix instruction per block rather than burning VALU cycles on a vector reduction).
Look at what Lean P + block scaling + rounded row sum achieves on MI355X:
Throughput: On 32K-token Gaussian benchmarks, ZYFA reaches 2,672 TFLOP/s in FP8 (53% of MI355X’s FP8 datasheet peak, vs. AITER’s 1,944 TFLOP/s / 39%—a 1.37× gain) at d=128, and on DeepSeek’s MLA shape (192/128) it reaches 2,464 TFLOP/s vs. AITER’s 1,237 TFLOP/s (1.99×).
Accuracy (62%–78% Lower Error than Exact Hardware Exp Without Block Scaling): Against an FP64 reference, even though Lean P uses a 1-FMA bit-pattern approximation for 2x, ZYFA’s power-of-2 block scaling and rounded row sum cut total FP8 attention error to 0.22× AITER’s on Mistral-7B (78% lower error) and 0.38× on Qwen3-8B (62% lower error). Across the full Mistral-7B model, KL divergence from FP64 drops from 5.9×10−3 (AITER) to 3.4×10−3 (ZYFA), with bitwise-identical outputs across 7,200 consecutive kernel launches.
How does CDNA 5 (gfx1250, MI455X) change the AITER / ZYFA pipeline?
When porting AITER, ZYFA, or FlyDSL attention kernels from MI355X (gfx950) to CDNA 5 (gfx1250, MI450 / MI455X)—where initial gfx1250 enablement for gpt-oss-120b, DeepSeek-R1, DeepSeek-V4-Flash, MiniMax-M3, and FlyDSL / AITER tgemm landed in ROCm 10.0 / 10.1, vLLM v0.33.0 (#58761, #58800), and SGLang v0.5.23 (#41988, #42699, #44671, #45304, #45365, #45758, #46366) this week—six ISA changes directly alter the attention cycle ledger:
4× Addressable Unified VGPRs (1,024 VGPRs/Wave via S_SET_VGPR_MSB):
On CDNA 4, a wave was restricted to 256 architectural VGPRs plus 256 MFMA-only AccVGPRs. On CDNA 5 (ISA §3.3.2.1 & §3.3.2.3; Coelacanth’s Dream), the split AccVGPR file is eliminated and a single Wave32 can allocate up to 1,024 unified 32-bit VGPRs (in blocks of 16). To address registers beyond V255 without breaking 8-bit register fields in standard encodings, CDNA 5 introduces S_SET_VGPR_MSB (and MODE bits DST_VGPR_MSB, SRC0_VGPR_MSB, SRC1_VGPR_MSB, SRC2_VGPR_MSB), which supplies the upper 2 bits ([9:8]) of each operand’s 10-bit VGPR address. (While RDNA 4’s dynamic VGPR allocation instruction is a no-op on gfx1250, static allocation of up to 1,024 VGPRs per wave allows an attention wave to keep large S, P, and O subtiles resident in registers without AccVGPR-to-VGPR copies or LDS spills.)
Hardware VALU/WMMA Co-Execution, S_DELAY_ALU, and 16 Named Barriers per Workgroup:
On MI355X, overlapping VALU softmax with MFMA required brittle static instruction-order interleaving across waves. On CDNA 5 (ISA §5.7.2.1 & §5.8), 16-bit and smaller XDL WMMA instructions are tracked in S_DELAY_ALU as TRANS operations (DEP codes 5–7), allowing normal VALU instructions and WMMA instructions to co-execute. By default, the arbiter stalls a wave for the multi-cycle duration of its WMMA so peer waves on the same SIMD can co-execute VALU softmax instructions; setting SCHED_MODE[2] (DISABLE_XDL_ARB_STALL) instead allows a single wave to issue multiple WMMA instructions back-to-back and immediately issue independent VALU instructions while the matrix ops execute. Combined with 16 hardware named barriers per workgroup (S_BARRIER_INIT, S_BARRIER_JOIN, S_BARRIER_SIGNAL, S_BARRIER_WAIT, allocated from 64 per WGP; ISA §5.6.2) and LDS split barriers (DS_ATOMIC_ASYNC_BARRIER_ARRIVE_B64; ISA §11.2.2), CDNA 5 supports true producer/consumer wave specialization.
Dual-Issue VOPD / VOPD3 and Packed V_PK_FMA_F32:
Because MI455X quadruples FP8/MXFP8 and MXFP4 matrix throughput (4×) while doubling transcendental throughput (2×), software exponential paths like ZYFA’s Lean P (1 FMA + 1 int cast) or FA4’s Horner cubic polynomial become even more essential on CDNA 5. CDNA 5 accelerates those non-transcendental softmax instructions with both 64-bit packed FP32 math (V_PK_FMA_F32, V_PK_MUL_F32, V_PK_ADD_F32) and dual-issue VALU encodings (VOPD and the new 96-bit 3-source VOPD3, which removes VOPD’s even/odd destination bank restriction; ISA §7.8.1).
Pseudo-Scalar Transcendentals (V_S_EXP_F32, V_S_RCP_F32) and Native V_TANH_* / V_EXP_BF16:
In Wave32 attention, when a row or sub-tile maximum mi and denominator ℓi are reduced across lanes, computing the per-row rescaling factor ascale=2(rold−rc)α or final reciprocal 1/ℓi previously burned a full 32-lane vector transcendental instruction. CDNA 5’s pseudo-scalar transcendental ops (V_S_EXP_F32, V_S_EXP_F16, V_S_RCP_F32, V_S_RCP_F16; ISA §7.10) read an SGPR/constant and write the result directly to an SGPR in a single lane, while V_TANH_{F32,F16,BF16} and V_EXP_{F16,BF16} accelerate half-precision activation and soft-capping steps.
Hardware Block-Scaled Conversions (V_CVT_SCALEF32_PK*) + 4-DWORD Block-Scaled V_WMMA_SCALE*:
ZYFA’s biggest accuracy win on MI355X came from computing a per-block power-of-2 scale in software before casting P to FP8. CDNA 5 turns block-scaled conversion into a native VALU instruction family: V_CVT_SCALEF32_PK8_{FP8,BF8,FP4}_{F32,F16,BF16} and V_CVT_SCALEF32_PK16_{FP6,BF6}_{F32,F16,BF16} (plus stochastic-rounding variants V_CVT_SCALEF32_SR_*; ISA §7.3 & §7.6.3), which feed directly into CDNA 5’s 4-DWORD VOP3PX2 block-scaled matrix instructions (V_WMMA_SCALE_F32_16X16X128_F8F6F4 for 32-element blocks and V_WMMA_SCALE16_F32_16X16X128_F8F6F4 for 16-element blocks, supporting E8M0, E5M3, and fractional E4M3 scales; ISA §7.12.6).
Tensor Data Mover (TDM), Async Global-to-LDS Loads, Cluster Multicast, and Transpose Loads (DS_LOAD_TR* / GLOBAL_LOAD_TR*):
Each WGP on MI455X includes a dedicated Tensor Data Mover (TDM) (TENSOR_LOAD_TO_LDS, TENSOR_STORE_FROM_LDS, tracked by TENSORcnt; ISA §10.11) that copies up to 5D tiles between HBM4 and the 320 KB LDS without using VGPRs, optionally inserting bank-conflict-free LDS padding (pad_enable), broadcasting tiles across up to 16 WGPs in a Shader Engine cluster (workgroup_mask), or executing indexed row gathers (up to 16 16-bit or 8 32-bit row indices per descriptor). Once in LDS (or directly from global memory), DS_LOAD_TR16_B128, DS_LOAD_TR8_B64, DS_LOAD_TR6_B96, and DS_LOAD_TR4_B64 (and GLOBAL_LOAD_TR*; ISA §10.9 & §11.2.4) load and transpose 16-bit, 8-bit, 6-bit, or 4-bit matrix tiles into VGPRs in hardware, eliminating the VALU/LDS transpose instructions that previously competed with softmax.
2.3 Why did the faster kernel run at a lower clock on MI355X?#
When Zyphra measured ZYFA and AITER on captured real-model activations at sustained clocks (16K context on Mistral-7B, Qwen3-8B, and DeepSeek-V2-Lite), they uncovered one of the most important hardware-software interactions in modern low-precision inference.
While ZYFA achieved a 1.99× speedup on synthetic Gaussian inputs (and 1.76× on DeepSeek-V2-Lite’s real MLA activations), its wall-clock speedup on real Mistral-7B and Qwen3-8B activations was 1.16× and 1.17×—significantly smaller than the cycle-count reduction predicted. Why?
Because on the Mistral-7B layer, AITER ran at a sustained GPU clock of 2,108 MHz, while ZYFA caused the MI355X to throttle its clock down to 1,628 MHz—a 480 MHz (22.8%) frequency drop.
Why did a faster, more accurate kernel run at a 22.8% lower clock frequency on the exact same GPU and the exact same layer activations?
Look at the physics of dynamic CMOS power dissipation inside a matrix multiplier array:
Pdynamic=αtoggle⋅Cload⋅Vdd2⋅fclk
where αtoggle∈[0,1] is the bit-toggling activity factor—the fraction of logic gates and operand bits that flip between 0 and 1 on each clock cycle.
Why AITER runs at 2,108 MHz: In real language-model attention (unlike synthetic zero-mean Gaussian tensors), attention distributions are heavy-tailed: a few keys have large probabilities, and thousands of keys in the tail have very small probabilities. Without ZYFA’s per-64-key power-of-2 block scaling, AITER lets those small tail probabilities underflow to exact zero (0x00) or subnormals when cast to FP8 e4m3. When the PV MFMA array streams thousands of 0x00 bytes into its multiplier trees, the operand bits do not flip (αtoggle→0). Dynamic switching power drops, and MI355X’s power management firmware boosts fclk to 2,108 MHz.
Why ZYFA drops to 1,628 MHz (and still wins): ZYFA’s per-64-key power-of-2 block scaling rescales each block upward before rounding so that small tail probabilities survive as non-zero e4m3 bit patterns (which is why ZYFA’s error is 62%–78% lower). Feeding dense, non-zero mantissa and exponent bits into the Matrix Cores on every cycle maximizes bit-toggling activity αtoggle at 86% matrix-pipe utilization, driving the chip into its TDP/current limit and forcing DVFS to pull the clock down to 1,628 MHz. As Zyphra’s authors emphasize, this is why low-precision attention kernels must always be benchmarked on real model activations at sustained clocks rather than synthetic Gaussian inputs in short bursts.
Even after absorbing that 22.8% clock drop, ZYFA’s cycle reduction is so large that it still finishes 1.16×–1.76× faster in wall-clock time and delivers 21%–22% higher energy efficiency (1.94 and 1.91 TFLOP/J on Mistral-7B and Qwen3-8B, vs. AITER’s 1.60 and 1.56 TFLOP/J).
Kernel & Target GPU
Softmax Mechanism
Softmax Cycles / Tile
Matrix Pipe Steady-State Busy %
Headline FP8 / BF16 Throughput
Real-Activation Sustained Clock (Mistral-7B)
Energy Efficiency & Numerical Error vs. FP64
AMD AITER FP8 (MI355X, gfx950)
Hardware v_exp_f32 + unscaled FP8 cast
896 cyc (32×128)
60% (ping-pong) 68.3% (default)
1,944 TFLOP/s (d=128) 1,237 TFLOP/s (MLA)
2,108 MHz (tail probs underflow to 0x00)
1.60 TFLOP/J; baseline FP8 error (KL=5.9×10−3)
Zyphra ZYFA FP8 (MI355X, gfx950)
Lean P (1 FMA + 1 int cast) + 2k block scale + MFMA row sum
Matches MUFU.EX2 within 1 BF16 ULP on 99% of inputs
Conclusion: On both Blackwell and MI355X (and even more so under CDNA 5’s 4× low-bit matrix scaling), the only way software reaches 53%–71%+ of peak attention throughput is by treating the non-matmul softmax path—every MUFU.EX2 instruction, every VALU cycle, every TMEM load/store, and every bit-flip in the probability tile—as the primary scarce resource. Now watch what happens when a hardware architect tries to bolt 2:4 Sparse Tensor Cores onto that exact bottleneck.
3. Can 2:4 sparse Tensor Cores speed up attention?#
Once you understand that modern attention is bottlenecked by softmax and the on-chip data path between QK⊤ and PV, examine the hardware pitch for 2:4 Sparse Tensor Core Attention—most recently in NVIDIA’s Vera Rubin (sm_107) architecture disclosures (Inside NVIDIA Rubin GPU Architecture and PTX ISA 9.4) and in AMD’s 4:2 structured-sparse V_SWMMAC instructions on CDNA 5 (gfx1250).
Here is the hardware pitch in its strongest form:
In NVIDIA’s Vera Rubin (sm_107) architecture preview and PTX ISA 9.4:
The first attention GEMM (S=QK⊤) runs densely on Tensor Cores, writing the dense FP32 score tile S into Tensor Memory (TMEM). Next, instead of loading all M×N scores into registers with a standard tcgen05.ld, Rubin introduces a new compound PTX 9.4 instruction:
While reading the dense FP32 scores out of TMEM, tcgen05.ld.red.spcompress performs 2:4 selection in hardware: from every group of 4 consecutive FP32 logits, it retains the 2 largest values (cdata), generates 2-bit-per-element positional metadata (mdata), and simultaneously computes the fragment’s local row maximum (redval via .red with rowop::max).
Because only 50% of the logits survive into cdata, the softmax warps only have to evaluate ex2.approx((x - max) * log2(e)) and normalize on half as many values (cutting SFU work in half), and the second attention GEMM (O=PspV) can then execute on Sparse Tensor Cores (tcgen05.mma.sp) at up to 2× the dense MMA instruction rate.
The Broader 2:4 Hardware Promise:
Since Ampere (sm_80) in 2020 (Mishra et al., arXiv:2104.08378), NVIDIA’s keynote slides and datasheets have quoted “2× the math throughput of dense matrix units” whenever an operand satisfies the 2:4 pattern (at least 2 zeros in every contiguous 4-element group along the GEMM reduction dimension K, encoded with 2-bit positional indices).
Even on static linear weights—where pruning and metadata compression happen offline before deployment—practitioners have learned to treat the “2× throughput” datasheet figure with skepticism. As documented across NVIDIA’s own benchmarks, SemiAnalysis’s Hopper Tensor Core analysis, and Spheron’s production benchmarks (Myth: NVIDIA’s 2:4 Sparsity Doubles Your Inference Throughput), real-world 2:4 sparse GEMMs on static weights typically land between 1.1× and 1.4× over dense equivalents (e.g., ∼1.2× on A100 TensorRT 8.0, 1.1×–1.2× single-stream on A100 Sparse Llama, and 1.0×—zero measured speedup—on an NVIDIA L4 serving a verified 2:4-pruned Qwen3-4B-Instruct across concurrency 1–128), due to sparse kernel maturity gaps relative to cuBLAS, TDP power ceilings, and memory-bandwidth bottlenecks at low batch sizes. SemiAnalysis put it bluntly in its Rubin CPX analysis: sparsity “has yet to actually deliver the promised benefits – falling well short of the 2x pickup it promises.”
The 2026–27 datasheets still lead with sparse numbers, and the two vendors now do it differently:
NVIDIA Rubin introduces a third sparsity scheme. NVIDIA’s Rubin table gives 50 PF NVFP4 “inference”, footnoted as “Transformer Engine compute,” next to 35 PF NVFP4 “training”, footnoted as “dense compute.” NVIDIA attributes the gap to “new hardware-accelerated adaptive compression designed to boost NVFP4 performance while preserving accuracy.” SemiAnalysis reads the same ratio as sparse to dense (it puts Rubin at 50 PF sparse vs 33.3 PF dense, and CPX at 30 vs 20, a 3:2 ratio) and says the scheme “is unlike the 2:4 structured sparsity used in Hopper and Ampere, and it isn’t like Blackwell’s 4:8 pairwise structured sparsity either.” NVIDIA has not published what pattern it accepts, whether the compression happens offline on weights or online on activations, or whether it applies to the attention GEMMs at all. Until it does, the honest reading is that Rubin’s dense NVFP4 rate is 35 PF, and the rest of this article’s tests apply as soon as the mechanism is public. If it compresses static weights offline, §4’s equal-bit and capability arguments apply. If it compresses activations such as P online, §3.3’s preprocessing cost and §3.4’s Amdahl ceiling apply.
AMD publishes 2:4 peaks only where they cannot beat its own dense FP8. The MI455X datasheet lists “with structured sparsity” peaks for exactly three formats, Matrix FP16, BF16 and INT8, each 10,066 TFLOPS, double their 5,033 dense. It lists no sparse figure for FP8, MXFP8, MXFP6 or MXFP4. On the same chip, dense FP8 is 20,133 TFLOPS. So the fastest sparse number AMD will put on paper for MI455X is half of its dense FP8 number. AMD’s MI400 page describes the feature the same way: “INT8, and FP16/BF16 sparsity support for AI.” The ISA does define FP8 V_SWMMAC instructions (§3.2), but AMD has not published a rate for them.
When you move from static weights to dynamic attention, where the sparse operand P (or Q,K,V) must be pruned, normalized, quantized, and packed into hardware metadata format on the fly inside every attention tile, the hardware pitch collides with four independent mechanisms.
3.1 Where do the operands live on tcgen05, and why does that force a 7-step repack?#
First, trace where Tensor Core and Matrix Core operands actually live across NVIDIA and AMD architectures:
Accelerator Architecture
Matrix Instruction
Operand A (Q or P) Location
Operand B (K⊤ or V) Location
Accumulator D (S or O) Location
Sparse Metadata Location
NVIDIA Volta / Ampere / Ada (sm_70–sm_89, plus sm_120)
mma.sync / mma.sp.sync
Registers (RMEM)
Registers (RMEM)
Registers (RMEM)
Registers (RMEM)
NVIDIA Hopper (sm_90a)
wgmma.mma_async / wgmma.mma_sp
RMEM or SMEM
SMEM
Registers (RMEM)
Registers (RMEM)
NVIDIA Blackwell & Vera Rubin (sm_100a, sm_103a, sm_107a)
tcgen05.mma / tcgen05.mma.sp
TMEM or SMEM(never RMEM)
SMEM(never RMEM)
TMEM(never RMEM)
TMEM(never RMEM)
AMD CDNA 5 (gfx1250, MI455X)
V_WMMA / V_SWMMAC
Registers (VGPRs)
Registers (VGPRs)
Registers (VGPRs)
Registers (VGPR SRC2)
On older register-resident NVIDIA architectures like Ada Lovelace (sm_89), mma.sp.sync.aligned.m16n8k32 is a warp-synchronous instruction whose inputs A, B, metadata E, and accumulator Dall live in the thread register file (RMEM). That register-resident symmetry is what academic Ada kernels such as DynSpAttn (Yu et al., ACM ICS 2026) relied on: when S=QK⊤ finishes in thread registers, each thread can prune 2 of 4 scores in-register, run exp2 in-register, pack two FP16 values and 2-bit indices into registers, and pass those exact registers directly into the next mma.sp.sync instruction for PspV without writing Psp or its metadata to shared memory.
That register-resident data path no longer exists on datacenter Blackwell (sm_100/sm_103) or Vera Rubin (sm_107).
To scale tile sizes up to 128×128 and 128×256 without exhausting the 65,536-register file, tcgen05 completely severed the Tensor Core from the CUDA Core register file:
tcgen05.mma writes the dense score accumulator S=QK⊤ into Tensor Memory (TMEM).
CUDA Cores (and SFUs) cannot operate on TMEM directly; softmax warps must load S out of TMEM into general-purpose thread registers (RMEM) via tcgen05.ld.
Conversely, tcgen05.mma and tcgen05.mma.sp cannot read operand A (P) or sparse metadata from general-purpose thread registers. Operand A must reside in TMEM or Shared Memory (SMEM), and for tcgen05.mma.sp, the 2-bit-per-element metadata operand must also reside at a TMEM address.
Now trace what actually happens on Vera Rubin (sm_107) when you use PTX 9.4’s tcgen05.ld.red.spcompress instruction (zartbot, Nvidia Rubin Architecture Preview, §1.4):
tcgen05.ld.red.spcompress always operates on FP32 (f32) data in TMEM, performs 2:4 selection, emits 2-bit (b2) metadata, and supports vector lengths from .x4 to .x128.
Where does it put the output? It places the compressed FP32 logits (cdata) and the 2-bit metadata (mdata) into general-purpose thread registers (RMEM).
Even inside the register file, ld.spcompress does not cut register pressure by 50%: metadata registers add overhead for shorter vector widths, while long vector widths (.x128) inflate peak register live ranges inside the exact softmax warpgroups (WG0/WG1) that are already pinned against their 200-register/thread ceiling.
Furthermore, rowop::max only returns the local maximum redval of the loaded fragment—it is not a complete softmax instruction.
Because cdata and mdata land in thread registers while tcgen05.mma.sp requires sparse operand A in SMEM or TMEM and its metadata in TMEM, the software pipeline between QK⊤ and PV is forced to execute a 7-step register-to-TMEM/SMEM repack round-trip on every single tile:
[TMEM: dense f32 scores S] │ (tcgen05.ld.red.spcompress.rowop::max) ▼[RMEM: compressed f32 logits (cdata) + b2 metadata (mdata) + local redval] │ ├─► Step 1: Cross-fragment / cross-warp row-max reduction + online softmax │ (ex2.approx((x - max) * log2(e)), row sum, and O rescaling sync) ├─► Step 2: Dtype conversion in RMEM (f32 probabilities -> bf16 / fp8 / nvfp4 + block scales) ├─► Step 3: MMA A-layout repacking in RMEM (swizzle compressed non-zeros for tcgen05.mma.sp) ├─► Step 4: Metadata-layout repacking in RMEM (pack & swizzle b2 mdata into TMEM metadata format) ├─► Step 5: Shared-memory or TMEM store (tcgen05.st for P_sp + tcgen05.st for TMEM metadata) ├─► Step 6: Asynchronous store completion wait (tcgen05.wait::st.sync.aligned + mbarrier arrive) └─► Step 7: Issue tcgen05.mma.sp (reads P_sp from TMEM/SMEM and metadata from TMEM)
Compare that 7-step sparse obstacle course against what dense FlashAttention-4 does on the exact same TMEM hardware (§3.1.2 of the FA4 paper and its CuTe-DSL / TIRx reference implementation):
In dense FA4, the 128-Row × 512-Column TMEM allocation (tmem) has zero metadata region. S0 occupies physical columns [0, 128), and P0 is simply an in-place float16 view (P_region) aliasing the upper 64 physical columns [64, 128) of S0.
The softmax warpgroup loads S, computes P, casts to 16-bit/8-bit, and issues contiguous tcgen05.st.sync.aligned.32x32b.x16.b32 stores straight into [64, 128)—immediately kicking off the first segment (K_SPLIT = 96) of the dense PV MMA after just three 32-column chunks are written, with zero metadata repacking, zero metadata TMEM stores, and zero TMEM column fragmentation.
In short, on tcgen05, ld.spcompress saves half the ex2.approx calls in Step 1 only to pile Steps 3, 4, and 5 (register layout shuffling, metadata bit-packing, and extra TMEM metadata writes) right back onto the softmax warpgroups’ CUDA Core ALU and TMEM-store pipelines.
3.2 Does AMD CDNA 5 (gfx1250) avoid that round-trip?#
Look at the fourth row of the operand table above: AMD’s CDNA 5 (gfx1250, Instinct MI455X).
Unlike NVIDIA’s tcgen05, AMD did not move matrix accumulators into a separate Tensor Memory address space on CDNA 5. Instead, CDNA 5 expanded each Wave32’s addressable vector register file to 1,024 unified VGPRs and kept all matrix operands in VGPRs. For structured sparsity, CDNA 5 provides the V_SWMMAC instruction family (ISA §7.12, Tables 43–44 & §7.12.3–7.12.5):
V_SWMMAC_F32_16X16X64_{F16,BF16}, V_SWMMAC_F16_16X16X64_F16, V_SWMMAC_BF16_16X16X64_BF16, and V_SWMMAC_BF16F32_16X16X64_BF16 for 16-bit data (where a packed 16×32 Matrix A in 8 VGPRs represents a 4:2 sparse 16×64 matrix multiplied by a dense 64×16 Matrix B in 16 VGPRs);
V_SWMMAC_{F32,F16}_16X16X128_{FP8,BF8}_{FP8,BF8} and V_SWMMAC_I32_16X16X128_IU8 for 8-bit data (where a packed 16×64 Matrix A in 8 VGPRs represents a 4:2 sparse 16×128 matrix multiplied by a dense 128×16 Matrix B in 16 VGPRs).
In every V_SWMMAC instruction, the packed A-matrix (SRC0), dense B-matrix (SRC1), 2-bit sparse index data (SRC2, fitting in 1 VGPR where each lane holds sixteen 2-bit codes with idx0 < idx1), and accumulator C/D (VDST) all reside in VGPRs.
Let’s state the architectural consequence plainly: because CDNA 5 keeps V_WMMA and V_SWMMAC operands and 2-bit index metadata in VGPRs, the tcgen05 register-to-TMEM/SMEM repack round-trip (§3.1) does not apply to AMD’s sparse path on CDNA 5. On gfx1250, the dense S=QK⊤ output of V_WMMA is already in VGPRs, and V_SWMMAC can consume the pruned Psp and its index register SRC2 directly from VGPRs without writing them to LDS or TMEM.
Does that rescue 4:2 sparse attention on CDNA 5? No—because three CDNA 5 hardware constraints and three general algorithmic walls immediately take its place:
CDNA 5 has no hardware spcompress instruction—so 4:2 selection and index packing run on the VALU:
Unlike Vera Rubin’s tcgen05.ld.red.spcompress, the CDNA 5 ISA has no hardware instruction that selects the top 2 of 4 FP32 logits and emits 2-bit indices. On gfx1250, software must compare every 4 consecutive FP32 scores in VGPRs, select the top 2 while enforcing the hardware’s ordering rule idx0 < idx1 (ISA §7.12.3, p. 101), pack the surviving values into SRC0, and bit-pack sixteen 2-bit index nibbles per lane into the SRC2 VGPR—all using VALU instructions on the exact vector pipeline that softmax is already competing for.
In unscaled FP8, CDNA 5’s dense V_WMMA already matches V_SWMMAC’s 16×16×128 tile shape:
Look at ISA Table 43 (§7.12, p. 95) and the RAW data-hazard table (§7.12.1, p. 98). For 16-bit F16/BF16, V_SWMMAC doubles the K dimension per instruction from K=32 (V_WMMA_F32_16X16X32_BF16, requiring 5 V_NOP / co-exec hazard slots) to K=64 (V_SWMMAC_F32_16X16X64_BF16, 3 V_NOP slots). For 8-bit FP8/BF8, however, CDNA 5 already provides a dense K=128 instruction (V_WMMA_F32_16X16X128_FP8_FP8, 4 V_NOP slots) alongside the K=64 instruction (V_WMMA_F32_16X16X64_FP8_FP8, 2 V_NOP slots), while sparse V_SWMMAC_F32_16X16X128_FP8_FP8 (3 V_NOP slots) is capped at the exact same 16×16×128 expanded shape (as Chips and Cheese also noted from the gfx1250 LLVM target definitions, keeping K the same as the wide dense instruction). The preliminary CDNA 5 ISA guide publishes no rate for V_SWMMAC. The MI455X datasheet gives one only for the 16-bit and INT8 forms: 10,066 TFLOPS, against 20,133 TFLOPS for dense FP8 V_WMMA.
CDNA 5’s block-scaled F8F6F4 and F4 WMMA instructions do not support structured sparsity at all:
Look at ISA §7.12.6 (p. 103) for V_WMMA_SCALE_F32_16X16X128_F8F6F4, V_WMMA_SCALE16_F32_16X16X128_F8F6F4, V_WMMA_SCALE_F32_32X16X128_F4, and V_WMMA_SCALE16_F32_32X16X128_F4:
“These matrix operations do not supported structured sparsity.”
Those block-scaled instructions are the exact instructions that deliver MI455X’s headline 20.13 PFLOPS MXFP8 and 40.26 PFLOPS MXFP4 throughput and implement ZYFA-style hardware block scaling (eliminating 62%–78% of FP8 attention quantization error). On CDNA 5, choosing 4:2 V_SWMMAC means forfeiting both MXFP4 (40.26 PF) and hardware block scaling on FP8.
And beyond those ISA specifics, CDNA 5 faces the exact same online pruning overhead (§3.3), single-sided Amdahl ceiling (§3.4), and equal-bit / equal-tier precision and capability losses (§4) as NVIDIA GPUs.
3.3 How much does pruning and packing P cost in practice?#
How much does online pruning, repacking, and metadata compression of the attention probability matrix P actually cost in wall-clock time on real GPUs?
In “Is 2:4 Sparsity Still Worth It? Semi-Structured Sparsity versus Quantization in LLM Inference” (Qin, October 2026, arXiv:2610.28947, §3.5, §4.2, and Appendix E, Tables 13–14), Xiuyi Qin measured this exact operation across three GPU generations—Ada Lovelace (L40S), Hopper (H100), and Blackwell (RTX PRO 6000, sm_120)—using CUPTI hardware kernel timers.
To give the 2:4 side the fastest possible online compression path, Qin did not rely on cuSPARSELt’s built-in cusparseLtSpMMAPrune + cusparseLtSpMMACompress API (which takes 15,086 µs on Blackwell and 47,354 µs on H100 for a 65,536×16,384P matrix) or PyTorch’s semi-structured conversion (3,330 µs on Blackwell, 4,796 µs on H100). Instead, Qin used a hand-written fused Triton prune-and-compress kernel (reimplementing HieraSparse’s kernel bit-for-bit, plus fused FP8 quantization) that reads P once, selects the top 2 of every 4 entries, and writes the compressed values and 2-bit metadata indices once—running at 63% to 102% of the GPU’s raw memory-copy bandwidth on H100 and Blackwell (1,892 to 2,277 µs on Blackwell, 1,530 to 1,728 µs on H100; Table 13).
Now look at what happens to the attention GEMMs (Table 14 of Qin, four query heads per KV group, d=128, sequence lengths 4,096 / 16,384) when you compare the standalone sparse GEMM kernel speedup (ignoring online pruning/compression) against the true wall-clock speedup once online pruning and compression are included:
GPU Architecture
Attention Operand
Same-Precision FP16 Speed Ratio (Kernel Only ⟶With Online Prep)
Same-Precision FP8 Speed Ratio (Kernel Only ⟶With Online Prep)
2× Tier vs. Dense FP8 (Kernel ⟶With Prep)
4× Tier vs. Dense NVFP4 (Kernel ⟶With Prep)
Share of 2:4 Time Spent in Online Prep
NVIDIA L40S (Ada, sm_89)
P (O=PV)
3.90×→0.51× (4K) 1.77×→0.38× (16K)
1.55×→1.25× (4K) 1.63×→1.31× (16K)
0.72×→0.79× (4K) 0.92×→0.74× (16K)
—
87% (4K) 78% (16K)
NVIDIA H100 (Hopper, sm_90)
P (O=PV)
1.49×→0.44× (4K) 1.73×→0.38× (16K)
1.28×→0.93× (4K) 1.50×→1.07× (16K)
0.86×→1.04× (4K) 0.85×→1.08× (16K)
—
70% (4K) 78% (16K)
NVIDIA Blackwell (sm_120)
P (O=PV)
1.75×→0.40× (4K) 1.76×→0.46× (16K)
1.41×→1.18× (4K) 1.60×→1.23× (16K)
1.02×→1.01× (4K) 0.91×→0.92× (16K)
0.76×→0.93× (4K) 0.90×→0.96× (16K)
77% (4K) 74% (16K)
NVIDIA Blackwell (sm_120)
Q (S=QK⊤)
0.91×→0.89× (4K) 1.15×→1.15× (16K)
1.02×→1.01× (4K) 1.06×→1.06× (16K)
0.91×→0.93× (4K) 1.03×→1.03× (16K)
1.12×→1.11× (4K) 1.00×→1.00× (16K)
2% (4K) 0% (16K)
NVIDIA Blackwell (sm_120)
K (S⊤=KQ⊤)
0.72×→0.71× (4K) 0.91×→0.91× (16K)
1.01×→1.01× (4K) 0.94×→0.94× (16K)
0.75×→0.76× (4K) 0.91×→0.91× (16K)
1.04×→1.04× (4K) 0.95×→0.95× (16K)
1% (4K) 0% (16K)
NVIDIA Blackwell (sm_120)
V (O⊤=V⊤P⊤)
1.23×→1.20× (4K) 1.05×→1.05× (16K)
1.30×→1.27× (4K) 1.01×→1.01× (16K)
0.72×→0.74× (4K) 0.52×→0.52× (16K)
0.71×→0.75× (4K) 0.58×→0.59× (16K)
3% (4K) 0% (16K)
Look closely at the P rows in that table:
When you benchmark the PV sparse GEMM kernel in isolation, 2:4 looks like a 1.49× to 1.77× winner in FP16 (excluding L40S’s narrow-shape dense heuristic outlier at 4K) and a 1.28× to 1.63× winner in FP8.
The moment you include the online pruning and metadata compression of P, online preprocessing consumes 70% to 87% of total runtime. Why? Because for O=PV, the output dimension is the small head dimension d=128. Pruning and compressing an M×N probability matrix touches M×N elements, whereas the PV GEMM itself only performs 2d=256 FLOPs per element of P. With an arithmetic intensity bounded by d=128, the time spent pruning and packing P is three to six times larger than the time saved inside the PV Tensor Core instruction.
As a result, in FP16, 2:4 on P runs at 0.38× to 0.51× the speed of dense FP16 (more than a 2× slowdown). And in the 4× compute tier on Blackwell (comparing 2:4-FP8 P against dense NVFP4 P), 2:4 is slower than dense NVFP4 (0.93× / 0.96×).
3.4 How much can pruning only one of the two matmuls save?#
There is an even simpler arithmetic flaw in Rubin’s ld.spcompress attention path.
In Rubin’s described pipeline, QK⊤ is computed 100% densely. Sparse selection only happens afterQK⊤, when tcgen05.ld.red.spcompress loads S from TMEM to feed PV.
Apply Amdahl’s Law to the two attention GEMMs (QK⊤ and PV), which have identical FLOP counts (2MNd each):
Even if tcgen05.mma.sp (or V_SWMMAC) achieved a realistic 1.68× speedup on PVand the register-to-TMEM repack and online pruning cost zero cycles, leaving QK⊤ dense caps the total GEMM speedup at:
Speedupsingle-sided=1+1.6811+1=1.25× to 1.29×
To break past that 1.29× single-sided Amdahl ceiling, a kernel has to prune both GEMMs—applying 2:4 sparsity to the Query matrix Q or Key matrix K along the head dimension d=128 so that QK⊤ also runs on Sparse Tensor Cores.
Look back at the Q and K rows of the attention GEMM table above (Table 14 of Qin) to see what happens when you apply 2:4 sparsity to Q or K along a 128-channel head dimension:
Because the reduction axis of S=QK⊤ is only K=d=128, the sparse GEMM kernel has almost no reduction depth over which to amortize metadata fetches: on H100, 2:4 on Q runs at 0.80×–0.87× the speed of dense FP16 and 0.95×–0.98× in FP8 (a net slowdown); on Blackwell, it barely breaks even (1.01×–1.06× in FP8, and 1.00× against NVFP4 at 16K).
Moreover, any benchmark that claims a 1.6×–1.7× speedup by comparing 2:4-sparse FP16 against dense FP16 is comparing the wrong baselines. On Ada, Hopper, Blackwell, Rubin, MI355X, and MI455X, the equal-tier dense competitor to 2:4-FP16 is dense FP8 (such as FA3/FA4 FP8 or ZYFA FP8)—which achieves the same 2× Tensor Core throughput tier without pruning. On MI455X the comparison is not even a tie: AMD’s datasheet puts 2:4 BF16 at 10,066 TFLOPS and dense FP8 at 20,133 TFLOPS, so dense FP8 has twice the peak rate of the sparse 16-bit path, again without pruning a single element of Q or S, without online metadata packing, and with an order of magnitude lower numerical error.
4. At equal bits, is 2:4 sparsity better than quantization?#
Why did vLLM (PR #32688 removing Marlin 2:4 in January 2026; PR #36799 removing Sparse24 compressed-tensors integration in v0.19.0, March 2026) and LLM Compressor v0.11.0 delete their 2:4 semi-structured sparsity support in 2026, even as NVIDIA kept Sparse Tensor Cores in Ampere, Hopper, Blackwell, and Rubin?
Because in real LLM deployment, 2:4 sparsity does not compete against uncompressed 16-bit floats. Because 2:4 composes with quantization, the decision an engineer actually faces at any point on the compression curve is:
Starting from a given precision, is it better to add 2:4 sparsity, or to drop one step to the next lower dense precision?
When you analyze that choice across the literature—from analytical rate-distortion and convex SDP bounds (Kuzmin et al., 2023) to equal-bit and equal-tier evaluations across all six Transformer operands (Qin, 2026), downstream fact-recall and reasoning benchmarks (Jaiswal et al., 2024; Jin et al., 2024; Yin et al., 2024), and post-2:4 workarounds (V:N:M and SlideSparse)—quantization dominates 2:4 sparsity everywhere above the hardware precision floor.
4.1 How many bits does 2:4 really save, and how much error does it add?#
Before even imposing the 2:4 pattern or counting index metadata, ask a more fundamental question: at equal nominal compression ratios, how does idealized unstructured magnitude pruning compare against uniform quantization?
In “Pruning vs Quantization: Which is Better?” (Kuzmin, Nagel, van Baalen, Behboodi, & Blankevoort, NeurIPS 2023, arXiv:2307.02973), the authors answered this question analytically, via per-layer optimization bounds, and via full-model fine-tuning—granting unstructured pruning the idealistic assumption of zero metadata storage overhead (comparing 50% sparsity directly against INT8, 75% sparsity against INT4, and so on relative to FP16):
Analytical Distributions and 46 Model-Zoo Networks + 3 LLMs (Kuzmin et al., §3):
On a standard normal distribution, INT4 quantization achieves a signal-to-noise ratio (SNR) of 19.1 dB versus only 5.6 dB for 75% magnitude pruning. Even when modeling heavy-tailed outlier distributions with a truncated Student’s-t distribution (ν=2) and measuring every weight tensor across 46 PyTorch model-zoo networks plus BLOOM-3B, LLaMA-3B, and OPT-2.7B, uniform quantization achieves higher SNR than unstructured pruning for almost all tensors down to 4 bits; unstructured pruning only overtakes uniform quantization at extreme compression (2 to 3 bits per value) on tensors with extreme kurtosis.
Algorithm-Independent Per-Layer Bounds (Kuzmin et al., §4):
To rule out the possibility that a better pruning heuristic could flip the ranking in post-training compression, Kuzmin et al. formulated per-layer output activation MSE minimization minw∥Xw^−Xworig∥22 as a Mixed-Integer Quadratic Program (MIQP). By comparing a convex Semi-Definite Programming (SDP) lower bound on quantization error against the exact global optimum of unstructured pruning (solved via Gurobi branch-and-bound across 10 layers of MobileNet-V2, EfficientNet-lite, ResNet-18, and ViT), they proved that quantization beats even globally optimal unstructured pruning at moderate compression ratios (4 to 8 bits) regardless of the optimizer used.
Full-Model QAT vs. Gradual Pruning with Fine-Tuning (Kuzmin et al., §5, Table 1):
Across 9 models trained with equal fine-tuning epochs (LSQ quantization-aware training vs. gradual magnitude pruning), quantization won across the board. On OPT-350M (WikiText-103, baseline FP16 perplexity 14.8), QAT achieved perplexities of 14.8 (8b), 14.9 (6b), 15.3 (4b), 15.9 (3b), and 19.9 (2b), whereas gradual pruning with fine-tuning degraded to 18.0 (8b / 50% sparsity), 22.6 (6b), 35.4 (4b / 75% sparsity), 53.5 (3b), and 101.4 (2b).
As Kuzmin et al. note in §6, because unstructured pruning has strictly more degrees of freedom than semi-structured 2:4 pruning, unstructured pruning is an upper bound on the accuracy of 2:4 pruning.
Now move from idealized unstructured pruning to hardware 2:4 sparsity and count the metadata bits honestly (Qin, 2026, §3.1 & Table 6). In hardware, every kept value in an element-wise 2:4 tensor must store a 2-bit position index specifying where it sat inside its 4-element group. For a group of 4 original elements, 2:4 stores 2 kept values plus 2×2=4 index bits—which is 1 metadata bit per original element. If a dense symmetric integer format INTk with one FP16 scale per g=128 elements costs k+g16 bits per element, then a 2:4 tensor whose kept values are quantized to k′=2m bits costs 22m value bits +1 index bit +g16 scale bits per original element:
bits(2:4+INT(2m))=m+1+g16=bits(dense INT(m+1))
Look at what that exact algebraic identity means for every format pairing:
Storage / Compute Tier
2:4 Sparse Format
True Bits / Original Element(incl. index & scale)
Equal-Bit or Equal-Tier Dense Rival
True Bits / Original Element
9 / 8-bit Budget (2× Tier)
2:4 + FP16 / BF16
9.000 bits (8 val+1 idx)
Dense FP8 (E4M3) Dense INT8 (g=128)
8.000 bits 8.125 bits
5-bit Budget (4× Tier)
2:4 + FP8 / INT8
5.000 / 5.125 bits (4 val+1 idx)
Dense NVFP4 (g=16, E4M3 scale) Dense INT5 (g=128)
4.500 bits 5.125 bits
4-bit Budget
2:4 + INT6
4.125 bits (3 val+1 idx)
Dense INT4 (g=128) Dense MXFP4 (g=32, E8M0 scale)
4.125 bits 4.250 bits
3-bit Budget
2:4 + INT4
3.125 bits (2 val+1 idx)
Dense INT3 (g=128)
3.125 bits
Blackwell FP4 Floor (8× Tier)
Pairwise 4:8 + NVFP4
2.750 bits (2 val+0.5 idx+0.25 scale)
No dense 2.75-bit TC format exists
—
Dropping half the elements does not save half the bits: 2:4 + FP16 (9.0 bits) actually uses more memory than dense FP8 (8.0 bits), and 2:4 + FP8 (5.0 bits) uses more memory than dense NVFP4 (4.5 bits). At equal bits, the real choice is: do you drop 2 of every 4 elements and quantize the surviving 2 elements with 2m bits each, or keep all 4 elements and quantize every one of them with m+1 bits?
Now derive the error ratio Rpred between those two choices from first principles (Qin, §5, Eqs. 3–5).
Let A be any of the six GEMM operands in a Transformer layer (W,X,Q,K,V,P), partitioned into groups g of 4 consecutive elements along the hardware-forced reduction axis of its GEMM:
Linear weights W (Y=XW⊤): grouped along input features;
Linear activations X (Y=XW⊤): grouped along hidden dimension;
Queries Q (S=QK⊤) and Keys K (S⊤=KQ⊤): grouped along the head dimension d;
Values V (O⊤=V⊤P⊤): grouped along the token sequence axis;
Attention probabilities P (O=PV): grouped along the key sequence axis.
In each 4-element group g, magnitude 2:4 pruning drops the two smallest-magnitude entries ag,1,ag,2 and keeps the two largest entries ag,3,ag,4. The relative Frobenius error energy of the pruning step alone is the 2:4 energy loss:
e2:4(A):=∥A∥F2∑g(ag,12+ag,22)
When the kept entries ag,3,ag,4 are subsequently quantized to 2m bits with relative error energy e2mkept(A) (normalized by ∥A∥F2), notice that the pruning error lives solely on the dropped coordinates (ag,1,ag,2), while the quantization error lives solely on the disjoint kept coordinates (ag,3,ag,4). Because the two error vectors have disjoint support, they are strictly orthogonal, so their squared Frobenius norms add exactly. Comparing against a dense (m+1)-bit quantizer with relative error energy em+1(A) gives the exact tensor error ratio:
Look at that inequality. It explains, without a single fitted parameter, why 2:4 loses above the quantization floor:
Quantization error shrinks exponentially with bit-width; 2:4 energy loss is a fixed floor.
Every time you add 1 bit to a uniform or floating-point quantizer, the step size Δ halves and the error energy em+1(A)∝Δ2/12 drops by roughly a factor of 4× (RMSE drops by 2×). By contrast, e2:4(A)does not depend on bit-width m at all. No matter how many bits you spend on the two kept values ag,3,ag,4, you can never recover a single bit of the energy ag,12+ag,22 that 2:4 zeroed out.
For i.i.d. Gaussian data, order-statistic integration gives e2:4=0.132 (e2:4=36.4% relative RMSE):
At 9 / 8.1 bits (2:4 + FP16 vs. dense INT8): 2:4 error is 36.4% vs. 0.6% for INT8 (60× higher RMSE).
At 5.1 bits (2:4 + INT8 vs. dense INT5): 2:4 error is 36.4% vs. 5.5% for INT5 (6.6× higher RMSE).
At 4.1 bits (2:4 + INT6 vs. dense INT4): 2:4 error is 36.4% vs. 11.7% for INT4 (3.1× higher RMSE).
At 3.1 bits (2:4 + INT4 vs. dense INT3): 2:4 error is 37.3% vs. 27.4% for INT3 (1.36× higher RMSE).
Moreover, unlike Kuzmin et al.’s global kurtosis predictor (which works for unstructured pruning of whole tensors, but only achieves a Spearman rank correlation of 0.10 on 2:4 because it ignores the hardware-forced grouping axis), Rpred ranks the 3,400 measured (model,layer,cell) points for W,X,Q,K,V with a Spearman correlation of 0.93 and an AUC of 0.945 (Qin, Table 9).
At equal Tensor Core compute tiers (2× and 4×), 2:4 is even further behind:
In a GEMM C=AB, the 2× tier pairs 2:4-FP16 on A (with dense FP16 B) against dense 8-bit on bothA and B, and the 4× tier pairs 2:4-FP8 on A (with dense FP8 B) against dense 4-bit on both:
Rpred2(2×)=e8(A)+e8(B)e2:4(A),Rpred2(4×)=e4(A)+e4(B)e2:4(A)+e8kept(A)+e8(B)
Because throwing away 2 of every 4 elements in A (e2:4≈10%–13% energy loss) is two orders of magnitude more destructive than rounding A and B to 8-bit FP8 (e8≈0.05%–0.2% energy loss), 2:4 gets blown out in the 2× tier and still loses in the 4× tier against NVFP4.
Why Hadamard Rotations (QuaRot, SpinQuant, ZYFA) Help Quantization and Hurt 2:4:
In modern low-precision inference (including ZYFA’s FP8 attention on MI355X, where applying a Hadamard rotation to Q and K halves input quantization error at just 0.1% runtime cost, as well as QuaRot and SpinQuant), an orthogonal Hadamard transform H is applied before quantization: (QH)(KH)⊤=QK⊤.
What does H do to our inequality? By mixing channels, H wipes out channel outliers and makes every 4-element group look i.i.d. Gaussian. That shrinks the quantization error ek(A) while increasing e2:4(A) by spreading energy evenly across all four elements of each group—roughly doubling the error ratio R against 2:4 for Q, K, and X (Qin, Figure 4c).
4.2 Why does perplexity hide what pruning breaks?#
Compare the measured operator error ratio R=error(best quantized)error(best 2:4) (R>1 means quantization wins) across all 32–36 layers of Llama-3.1-8B-Instruct and Qwen3-8B (221,408 total configurations in Qin, 2026, Tables 7 & 8):
Operand Family & Forced Axis
Storage: 8.1b (vs. FP8-row)
Storage: 5.1b (vs. NVFP4-g16)
Storage: 4.1b (vs. INT4 / MXFP4)
Storage: 3.1b (vs. INT3-g128)
Compute: 2× Tier (2:4-FP16 vs. FP8)
Compute: 4× Tier (2:4-FP8 vs. NVFP4)
W (Linear Weights, in-features) Llama-3.1-8B / Qwen3-8B
13.27× / 13.00×
3.69× / 3.61×
2.90× / 2.77×
1.27× / 1.22×
7.50× / 6.84×
2.13× / 1.86×
X (Linear Inputs, hidden dim) Llama-3.1-8B / Qwen3-8B
—
—
—
—
7.70× / 7.12×
2.21× / 1.96×
Q (Queries, head dim d) Llama-3.1-8B / Qwen3-8B
—
—
—
—
5.17× / 6.31×
1.72× / 1.78×
K (Keys, head dim d) Llama-3.1-8B / Qwen3-8B
10.28× / 10.43×
2.96× / 2.62×
1.58× / 1.41×
1.05× / 1.27×
5.33× / 6.52×
1.88× / 1.92×
V (Values, token axis) Llama-3.1-8B / Qwen3-8B
21.71× / 19.36×
5.54× / 5.13×
3.25× / 3.10×
1.55× / 1.49×
15.83× / 15.64×
3.18× / 3.20×
P (Attn Probs, key axis) Llama-3.1-8B / Qwen3-8B
—
—
—
—
6.12× / 5.04×
1.28× / 1.02×
Every single cell in that table is >1.0: against FP8 at the 2× tier and NVFP4 at the 4× tier, 2:4 loses on every operand of both models, with 5× to 16× higher error than FP8 and 1.02× to 3.20× higher error than NVFP4.
If 2:4 loses so decisively on operator error, why did so many pruning papers claim “negligible accuracy loss” at 50% sparsity? Because they evaluated compressed models almost exclusively on WikiText-2 perplexity—and four independent studies have now demonstrated that perplexity systematically hides the capabilities that pruning destroys:
LLM-KICK (Jaiswal, Gan, Du, Zhang, Wang, & Yang, ICLR 2024, arXiv:2310.01382):
Evaluating Magnitude, Wanda, SparseGPT (both unstructured and 2:4 / 4:8 N:M structured sparsity), and GPTQ / AWQ / LLM.int8() across Vicuna-7B/13B/33B and LLaMA-1/2 on knowledge-intensive tasks, Jaiswal et al. showed that while WikiText-2 perplexity stays nearly flat up to 45%–50% sparsity, FreebaseQA factoid question answering drops below the 5% tolerance threshold at trivial 25%–30% unstructured sparsity (falling from 65.44% dense on Vicuna-7B to 44.66% under Wanda and 42.86% under SparseGPT at 50% sparsity, while MMLU drops from 47.1% to 38.6% and 30.8%). Across every task in LLM-KICK—FreebaseQA, MMLU, TriviaQA, CNN/DailyMail summarization, and MT-Bench instruction following—not a single N:M (2:4 or 4:8) sparse model achieved matching performance, suffering ≥50% relative degradation on Factoid-QA. By contrast, 8-bit quantization (LLM.int8(), AWQ, GPTQ) and 4-bit GPTQ (on 13B) preserved MMLU (47.10%–47.82%), retrieval-augmented QA (75.55%–75.91%), and MT-Bench GPT-4 judge scores (9.72–9.81). Even more tellingly, at an identical 7B active parameter count, a smaller dense Vicuna-7B (46.7% MMLU) outperformed a 46.16%-pruned Vicuna-13B (31.7% Magnitude, 45.3% Wanda, 46.3% SparseGPT).
Fact Recall Deteriorates Long Before In-Context Learning (Jin, Clement, Dong, Nagarajan, Carbin, Ragan-Kelley, & Dziugaite, ICLR 2024, arXiv:2310.04680):
Why do pruned models look decent on next-token perplexity or short-context reading comprehension while failing on knowledge-intensive tasks? Jin et al. disentangled in-weight parametric fact recall (closed-book TriviaQA and WebQuestions) from in-context learning (ICL) (open-book TriviaQA, NaturalQuestions, counterfactual overriding DisentQA, and in-context learning of parameterized linear, 2-layer NN, and decision-tree classifiers) across OPT-13B/30B, LLaMA-13B/33B, and Pythia-12B under SparseGPT and Wanda. Accepting a 5% relative accuracy drop, closed-book fact recall breaks at just 20%–30% sparsity (30% on TriviaQA, 20% on Pythia-12B), whereas in-context copying and function learning survive up to 60%–70% sparsity (50%–60% on open-book QA, 70% on counterfactual DisentQA, and 60%–70% on in-context function learning). Furthermore, ablating module-level sparsity on LLaMA-13B (§7, Figure 5 of Jin et al.) showed that while attention and FFW layers are equally important for in-context learning, pruning 60% of FFW layers degrades closed-book fact recall by 14 percentage points more than pruning 60% of attention layers.
The “Junk DNA” Hypothesis (Yin, Jaiswal, Liu, Kundu, & Wang, ICML 2024, arXiv:2310.02277):
Conventional pruning rests on the assumption that small-magnitude weights are redundant “junk”. By constructing six continuous task-difficulty spectra (varying target data volume on GLUE, option count from 2 to 4 on MMLU, context length on TriviaQA, k-shot demonstrations k∈{0,1,3,5} on MMLU, the normalized human-LLM gap across PIQA [17.5%], HellaSwag [37.6%], and OpenBookQA [60.4%], and FreebaseQA vs. MMLU), Yin et al. proved that pruning small weights monotonically impairs downstream accuracy in direct proportion to task difficulty across Magnitude, SparseGPT, and Wanda in both unstructured and N:M modes (Spearman rank correlation 0.975–1.000, Table 2). By contrast, GPTQ quantization at matched compression ratios does not exhibit this monotonic difficulty collapse (Spearman 0.316–0.872). Worse, Linear Mode Connectivity (LMC) interpolation and continual fine-tuning experiments (comparing Dense Transfer, Dense Transfer with 70%–90% of small weights frozen, Sparse Transfer, and Sparse-to-Dense Transfer where pruned weights are allowed to regrow) showed that removing small pre-trained weights destroys the dense loss basin on hard tasks, causing irreparable accuracy loss even when pruned weights are allowed to regrow during fine-tuning.
Spiky P vs. Non-Spiky Q,K,V and Multi-Step Reasoning (Qin, 2026):
Inside attention itself, notice that P is the one operand in Qin’s table that comes closest to parity in the 4× tier (R=1.02–1.28× against NVFP4, and R=0.64–0.78× against weaker rivals like MXFP4 or row-wise INT8). After exponentiation, a spiky attention row concentrates most of its probability mass on one or two keys per 4-key group, so keeping the top 2 of every 4 logits in P acts like a local temperature sharpener—zeroing out background noise and slightly improving RULER 16K single-needle retrieval over row-wise INT8 and MXFP4 (Qin, Figure 3).
Why is 2:4 on P (or Q,K) still a capability trap?
First, when attention is relatively flat or diffuse—in early layers, induction/aggregation heads, or across multi-clause evidence—dropping 2 of every 4 logits in a contiguous 4-key window deletes up to 50% of the probability mass whenever 3 or 4 relevant keys land in the same 4-token group.
Second, even on the 15 boundary cells most favorable to 2:4 (0.7<R<1.4), 2:4 never significantly beats quantization on GSM8K multi-step chain-of-thought reasoning, and is significantly worse in 7 of those 15 cells (including 3 of the 5 cells where 2:4 won at the single-operator level). Single-needle retrieval only needs the argmax peak to survive, whereas a 256-token mathematical reasoning chain compounds every deleted secondary attention weight step after step across all 32 layers—an instance of the exact task-difficulty fragility identified by the Junk DNA Hypothesis.
Third, if you also prune Q or K along the head dimension d=128 to escape the 1.29× single-sided Amdahl ceiling (§3.4), query and key vectors are dense rotary/distributed embeddings along the head dimension—they are not spiky. Even in the single most favorable cell for Q (4× tier against weak MXFP4, where the median layer had R=0.777–0.85), Layers 0 and 1 of Llama-3.1-8B suffered 2× to 3× higher error under 2:4 pruning (Qin, Figure 9). Because errors in Layer 0 and Layer 1 corrupt the residual stream for the rest of the network, whole-model WikiText-2 perplexity jumped from 7.23 to 10.80 (vs. 9.34 for MXFP4 and 7.23 for FP8/INT8; Qin, Table 10), while RULER 16K long-context retrieval dropped by more than 10 percentage points.
By 2024–2026, the compression community itself recognized that NVIDIA’s fixed 50% 2:4 pattern sits in a dead zone: too aggressive to preserve LLM reasoning without massive retraining, yet too rigid and low-speedup (1.1×–1.3×) to justify the accuracy loss. Look at the two opposite directions researchers took to work around 2:4’s hardware rigidity—and what both reveal about the underlying hardware primitive:
Going Sparser via V:N:M Sparsity (Beyond 2:4, Zhao et al., arXiv:2410.16135):
Building on VENOM (Castro et al., SC 2023), Zhao et al. noted that 2:4 delivers only 1.1×–1.3× practical speedup and cannot accelerate any other 50% pattern (like 4:8 or 8:16) or any ratio above 50%. In V:N:M sparsity, each weight matrix is partitioned into V×M blocks (M≥5); within each block, M−4 entire columns are pruned away, and 2:4 sparsity is applied to the remaining 4 columns so the compressed block can still run on NVIDIA’s 2:4 Sparse Tensor Cores.
While 64:2:8 (75% sparsity) achieved nearly lossless accuracy on vision backbones (DeiT-base on ImageNet-1K after 600 epochs of dynamic-mask SR-STE retraining, 81.76% vs. 81.84% dense), look at what happened when Zhao et al. applied 64:2:5 sparsity (60% sparsity) to Llama2-7B using V:N:M-specific channel permutations (Hungarian algorithm) and a 3-stage LoRA fine-tuning recipe over 50,000 iterations on WikiText-2 and Alpaca (Tables 5 & 6 of Zhao et al.):
On RTX 3090, 64:2:5 lifted end-to-end speedup from 1.26× (2:4) to 1.49×.
However, WikiText-2 perplexity degraded from 5.12 (dense) to 9.97 (compared to 10.17–11.27 for training-free 2:4 SparseGPT/Wanda/RIA), and 8-task 5-shot average accuracy dropped by 8.95 points, from 61.99% (dense) to 53.04% (vs. 50.76% for Wanda 2:4). Even after 50,000 LoRA fine-tuning steps, 2:4 and V:N:M lost nearly 9 points of downstream capability.
Going Denser via (2N−2):2N Sparsity (SlideSparse, Shao et al., ICML 2026, arXiv:2603.05232):
At the opposite end, Shao et al. tested what happens to modern reasoning models under 2:4 pruning. Fine-tuning Qwen3-1.7B under identical settings in Dense, 6:8 (25% pruning), and 2:4 (50% pruning) across GSM8K, MATH-500, and HumanEval (§2.1, Figure 2 of SlideSparse) exposed a catastrophic cliff:
6:8 Sparse (25% pruned):63.0% GSM8K, 39.0% MATH-500, 53.0% HumanEval (51.6% average).
Because NVIDIA Sparse Tensor Cores and cuSPARSELt offer zero hardware support for 6:8 (or any (2N−2):2N pattern with N>2), inference engines must fall back to dense execution. To unlock Sparse Tensor Cores for (2N−2):2N weights without hardware changes, SlideSparse introduced Sliding Window Decomposition: decomposing each 2N-element weight block (containing at most 2N−2 non-zeros) into K=N−1 overlapping stride-2 windows of width 4, each holding at most 2 non-zeros (so for 6:8 with N=4, 8 elements become K=3 windows of 4 = 12 elements), while Activation Lifting duplicates the corresponding input activations inside a fused Triton per-token INT8/FP8 quantization kernel.
Now look at the mathematical price of that “computational arbitrage” (§3.4 & Appendix C.2 of SlideSparse):
Expanding 2N elements into 4(N−1) elements inflates the GEMM reduction dimension K by the expansion factor:
γ=2N4(N−1)=2−N2(γ=1.33× for 4:6,γ=1.50× for 6:8,γ=1.60× for 8:10)
Dividing the 2× Sparse Tensor Core throughput by γcaps the theoretical maximum speedup at the inverse density:
Seff≤γα=2−2/N2=N−1N=density1
For 6:8 sparsity (the pattern needed to preserve Qwen3’s reasoning accuracy), the theoretical upper bound on speedup is Smax=34=1.33× (1.33× measured on compute-bound Qwen2.5-7B/14B INT8 prefill at M=8,192 on A100; 1.18×–1.19× on RTX 4090 FP8 prefill; 1.06×–1.11× on B200 INT8 prefill; and 1.07×–1.21× in memory-bound decode).
Together, V:N:M and SlideSparse expose the fundamental bind of hardwiring 2:4 into silicon: at 50% pruning (2:4) or 60% pruning (V:N:M), LLM reasoning and downstream accuracy drop by 9 to 39 percentage points; and if you relax pruning to 25% (6:8) to save accuracy, you have to inflate GEMM work by 1.5× just to satisfy the 2:4 hardware decoder, capping your theoretical speedup at 1.33×—while dropping one dense precision step (BF16 → FP8 or FP8 → NVFP4) delivers a 2× to 4× hardware speedup with near-lossless accuracy.
4.4 What happens at the FP4 floor on Blackwell and Rubin?#
What about static linear/MLP weights at the hardware quantization floor—FP8 on Hopper (sm_90), or NVFP4 on Blackwell (sm_100/sm_120) and Rubin (sm_107)—where no lower dense Tensor Core precision exists and pruning happens offline?
On Hopper H100 (sm_90) at the FP8 floor, where sparse FP8 Tensor Cores still use standard element-wise 2:4 masks, stacking 2:4 on top of static FP8 linear weights does work—provided you pay for a massive sparse-retraining run. Using RedHat’s Sparse-Llama-3.1-8B-2of4 checkpoint (which was retrained with fixed 2:4 masks for 13 billion tokens), Qin (Table 5) measured end-to-end serving in vLLM on one H100:
Now try to take that play to the NVFP4 quantization floor on Blackwell (sm_100/sm_103/sm_120) or Vera Rubin (sm_107).
You immediately hit a wall that NVIDIA’s launch slides never mention: for FP4 data, Blackwell and Rubin Sparse Tensor Cores do not support element-wise 2:4 sparsity.
As documented in cuSPARSELt (CUSPARSELT_SPARSITY_50_PERCENT for FP4) and verified at the bit level on Blackwell silicon by both Qin (2026, §6.2 & Table 16) and the quadbit authors (quadbit: Hand-Written FP4 Tensor-Core Kernels and a Deployment Stack for Consumer Blackwell SM120, §3 & §8), the hardware mma.sp instruction for 4-bit e2m1 operands enforces pairwise 4:8 sparsity (4:8p):
Every 8 consecutive elements along the reduction axis K are grouped into four adjacent pairs(a0,a1),(a2,a3),(a4,a5),(a6,a7) (each pair packed into one e2m1x2 byte).
The Sparse Tensor Core metadata selects 2 of the 4 pairs (keeping 4 elements as two contiguous 2-element pairs), not 2 of every 4 individual elements.
Simultaneously, the block-scale granularity on the reduction axis coarsens from NVFP4’s dense 1 scale per 16 elements to 1 scale per 32 original positions (16 kept values).
Look at what that hardware-mandated pairwise 4:8 constraint does to LLM weights at the NVFP4 floor (Qin, Table 4 & Table 16, and quadbit §8–10 on Llama-3.1-8B):
NVFP4 + Element-Wise 2:4(Simulated; no HW support)
Element-wise 2:4 (scale/16)
21.74 / 2.0%
8.82 / 19.2%
8.72 / 51.6%
NVFP4 + Hardware Pairwise 4:8 (sm_100–sm_120)
Pairwise 4:8 (scale per 32)
108.83 / 2.0%
10.22 / 13.2%
Cannot reuse 2:4 ckpt (PPL=93.6)
Three facts jump out of those measurements:
Pairwise 4:8 destroys one-shot pruning and invalidates existing 2:4 checkpoints:
Forcing weights to survive in adjacent pairs removes 1.5× as much tensor energy as element-wise 2:4. Under one-shot SparseGPT at the NVFP4 floor, element-wise 2:4 gives 21.74 PPL, whereas hardware pairwise 4:8 explodes to 108.83 PPL (and Qin’s ablation in Table 16 proves that changing the scale block from 16 to 32 only moves PPL from 105.23 to 108.83—97% of the damage comes from the pairwise 4:8 mask itself). And if you try to convert an existing element-wise 2:4 model like Sparse-Llama-3.1-8B-2of4 to pairwise 4:8, pair-rounding discards a third of its trained non-zero weights and blows perplexity up to 93.6 (quadbit §8).
The Perplexity Mirage in Sparse Retraining:
Look at the 1B-token SquareHead distillation column in the table above (Figure 5b,c of Qin) alongside quadbit’s distillation tournament (§9 of quadbit):
In Qin’s 1B-token distillation run on 4× H100, WikiText-2 perplexity recovers almost completely within the first 250M tokens (108.83→10.22 for pairwise 4:8 NVFP4; 17.82→8.25 for 2:4 FP8).
Yet GSM8K chain-of-thought reasoning stalls at just 13.2% for pairwise 4:8 NVFP4 (and 30.8% for 1B-token 2:4 FP8)—less than a third of the 46.0% GSM8K that zero-shot, training-free dense NVFP4 achieves out of the box.
The quadbit team hit the exact same wall on Llama-3.1-8B-Instruct (§9): distilling their pairwise 4:8 NVFP4 model lowered serving perplexity from 10.27 to 9.10 (vs. 7.97 dense NVFP4), but ARC-Challenge and HellaSwag accuracy remained ~20 percentage points below dense NVFP4, and every single layerwise or global router-weighted STE-QAT objective on DeepSeek-V4-Flash MoE experts (§10.2) actually drove 8-task downstream accuracy below one-shot pruning (0.7259 vs. 0.7363, vs. 0.7548 dense NVFP4).
Even for Frontier MoE Decode on Blackwell, Native Dense NVFP4 Beats 2:4 Sparse Policies by 6×–8×:
In quadbit (§10.1), the authors found that the only training-free way to keep 2:4 pairwise FP4 from wrecking DeepSeek-V4-Flash (284B) and GLM-5.2 (744B) was a route-slot D2 policy: keep the top-2 highest-weight routed experts per token in dense NVFP4, and apply 2:4 sparsity only to the low-weight tail experts (or only to down_proj in the back half of the layers). While route-slot D2 preserved downstream accuracy within ~1 point (0.7304 vs. 0.7383 on DeepSeek; 0.7508 vs. 0.7603 on GLM), it requires keeping both dense NVFP4 and 2:4-sparse NVFP4 weights co-resident in HBM (+26%–27% weight memory, cutting GLM’s KV cache capacity by 62% from 607K to 241K tokens). And on a direct, CUDA-graph-captured serving comparison (quadbit §10.1, C2 SOTA board), vLLM’s native dense NVFP4 fused MoE decoded 8.1× faster on DeepSeek-V4-Flash (48.25 vs. 5.97 tok/s) and 6.3× faster on GLM-5.2 (33.81 vs. 5.37 tok/s) than the sparse route-slot policy.
4.5 Where does fine-grained sparsity actually win?#
To be completely fair to sparsity research, we should examine the two strongest pro-sparsity arguments in the recent literature—the PyTorch team’s blog post (“When Quantization Isn’t Enough: Why 2:4 Sparsity Matters”) and Sakana AI & NVIDIA’s March 2026 paper (“Sparser, Faster, Lighter Transformer Language Models”, Cetin, Peluchetti, Castillo, Naruse, Murakami, & Jones, arXiv:2603.23198)—state where they are right, and check how their mechanisms bear on attention.
Sub-4-Bit Static Weight Compression (PyTorch Blog & SLiM, Mozaffari et al., 2025):
Where they are right: When you push static weight compression below 4 bits into the nominal 2-bit regime (∼0.18×–0.25× of FP16 model size), standalone vector quantization methods like AQLM and QuIP# suffer from expensive codebook lookup/dequantization overheads on GPUs and steep accuracy losses. In the PyTorch blog’s experiments on LLaMA-2-7B (dense FP16 4-task average 63.8% across ARC-C, ARC-E, PIQA, WinoGrande) and LLaMA-3-8B (dense 70.7%), 2-bit AQLM drops to 58.6% (0.18× on LLaMA-2-7B) and 66.4% (0.25× on LLaMA-3-8B), and 2-bit QuIP# reaches 59.8% (0.18× on LLaMA-2-7B). Combining 4-bit AbsMax quantization with MaskLLM learnable 2:4 masks scores 60.3% (0.18× on LLaMA-2-7B), and adding a zero-shot low-rank adapter (SLiM-LoRA) recovers accuracy to 64.2% (r=0.1, 0.22× compression ratio on LLaMA-2-7B) and 66.8% (r=0.2, 0.25× on LLaMA-3-8B). Furthermore, on static weight matrices, predictable zeros reduce multiplier transistor switching power.
Where our argument still holds:
First, check the apples-to-apples bit accounting (Qin, 2026, §1 & §3.1): 4-bit weights with 2:4 sparsity store 2 value bits + 1 index bit + 0.125 scale bits = 3.125 bits per original elementbefore counting the SLiM-LoRA rank-r adapter weights (which raise the LLaMA-2-7B footprint from 0.18× to 0.22×, or ∼3.52 bits/element). At 3.125 bits, the equal-bit dense rival is dense INT3 (not 2-bit), and across all storage cells in Qin’s Table 7, dense INT3 beats 2:4 + INT4 (R=1.05×–1.55×) without needing MaskLLM’s expensive learnable-mask training.
Second, on Blackwell and Rubin, the hardware 4-bit Tensor Core format is W4A4 NVFP4 (where FP4 mma.sp enforces pairwise 4:8, not element-wise 2:4), whereas custom kernels like Sparse Marlin were restricted to W4A16 on Ampere (and removed from vLLM in PR #32688).
Third—and most importantly for attention—the PyTorch blog itself explicitly notes that “a persistent challenge across all aforementioned compression methods is the significant preprocessing overhead required to prepare matrices and their associated metadata. This substantial preprocessing cost inherently limits their utility primarily to static sparsity and quantization approaches, thereby substantially reducing their applicability in dynamic or adaptive compression scenarios.”
>99% Unstructured Activation Sparsity in ReLU-Gated FFNs (Sakana AI & NVIDIA, arXiv:2603.23198):
What they built and measured: Cetin et al. (Sakana AI & NVIDIA) tackled the exact problem that unstructured sparse kernels normally run slower than dense Tensor Core GEMMs on modern GPUs. Pre-training 0.5B to 2B gated Transformer++ models (hu=xWu, hg=ReLU(xWg), h=hu⊙hg, y=hWd) with ReLU gating and a mild L1=2×10−5 penalty on h, they showed that models naturally converge to over 99% unstructured activation sparsity—activating only 24 to 39 neurons out of 5,632 on average (with high-information tokens and initial sequence positions exciting hundreds of neurons while predictable web tokens like doi or gov excite almost none), with zero degradation in validation cross-entropy or 7-task downstream accuracy (48.8% vs. 49.1% dense at 2B).
How their kernels actually work: Crucially, Sakana & NVIDIA do not use 2:4 Sparse Tensor Cores at all. Instead, they introduce Tile-wise ELLPACK (TwELL): during the dense gate projection hg=ReLU(xWg) on Hopper wgmma, each CTA packs the non-zero values and 16-bit column indices into shared memory in the kernel epilogue using CTA-scoped relaxed atomics (__nv_atomic_fetch_add) and flushes them via TMA—avoiding cross-CTA synchronization. Next, a single fused warp-per-row CUDA kernel (mm_t2d_kernel) iterates only over those 24 to 39 non-zero gate indices on CUDA Cores:
y[m,:]=t=0∑NT−1c=0∑hnz[m,t]−1hv[m,t⋅CTn+c]⋅(x[m,:]⋅Wu[:,n])⋅Wd[n,:],n=hI[m,t⋅CTn+c]
computing only the <1% surviving inner products of xWu on the fly and never materializing dense hu in DRAM (and for training, routing rows into a Hybrid format combining a width-128 ELL matrix on CUDA Cores with a dense overflow tail on Tensor Cores). On 8× H100 PCIe across 0.5B–2B models, TwELL and Hybrid kernels deliver +17.0% to +20.5% faster forward execution, 11.8% to 17.0% lower energy per token, +7.1% to +21.9% faster training steps, and 19.2% to 28.1% lower peak training memory (with even larger gains on RTX PRO 6000).
Why Sakana & NVIDIA’s success proves the exact lesson for attention:
Look at whyTwELL beats dense Tensor Cores in batched FFN execution:
It operates at >99% sparsity (keeping <1% of neurons), not 50% (2:4); and
The gate projection hg=ReLU(xWg) identifies the <1% active indices first, allowing the fused kernel to skip >99% of the HBM reads and FLOPs of both xWu and hWd.
In self-attention, Rubin’s 2:4 ld.spcompress path does the exact opposite: it computes 100% of QK⊤, reads 100% of K and V, and only prunes 50% of P before PV.
What is the true attention analogue of Sakana’s “run a cheap ReLU gate first, then only touch the <1% surviving columns and rows”? Coarse token-level sparse attention (DSA, QSA, MSA)—which runs a lightweight ReLU Lightning Indexer first to select the <0.2% active tokens (k=512–2,048 out of 1M), and then skips 99.8% of QK⊤, 99.8% of softmax, and 99.8% of the main KV HBM reads.
If fine-grained 2:4 Sparse Tensor Cores are a trap for attention—because they leave QK⊤ dense (or wreck retrieval if applied to Q/K), force a 7-step TMEM-to-register-to-TMEM repack round-trip on tcgen05 (or forfeit block-scaled V_WMMA_SCALE* modes on CDNA 5), spend 70%–87% of runtime in online pruning/compression, and lose to dense FP8/NVFP4 on both speed and accuracy—how does the production inference ecosystem actually solve the long-context attention and softmax bottleneck in 2026?
Open the release notes of vLLM v0.33.0, SGLang v0.5.23, and FlashInfer v0.7.3 (all shipped this week), alongside the latest SemiAnalysis InferenceX / AgentX benchmarks across NVIDIA Hopper/Blackwell/Rubin, AMD MI355X/MI455X, and Google TPUv7 Ironwood.
Not a single production engine uses 2:4 mma.sp, ld.spcompress, or V_SWMMAC for attention. Instead, the entire industry converged on a clean two-level separation of concerns:
At the sequence level (Macro-Sparsity): Coarse Token-Level Sparse Attention (DSA, QSA, MSA) prunes 99%+ of the tokens beforeQK⊤ and Softmax ever run.
At the hardware tile level (Micro-Execution): The surviving k tokens are packed into 100% dense tiles and executed at peak FP8/NVFP4/MXFP4 Matrix Core speed using software-co-designed softmax (FA4, FlashMLA, ZYFA).
5.1 Why does dropping tokens solve what 2:4 cannot?#
Compare where 2:4 Intra-Tile Sparsity and Coarse Token-Level Sparsity (such as DeepSeek Sparse Attention / DSA in DeepSeek-V3.2, DeepSeek-V4/V4.1, GLM-5.2/5.3, and Kimi K3.1 Pro; Query Sparse Attention / QSA in Qwen3.8-Flash-Next; and MiniMax Sparse Attention / MSA in MiniMax-M3 / M3.1-Flash) sit relative to the three attention bottlenecks:
Trace the four structural reasons why coarse token-level sparsity wins on every hardware axis where 2:4 fails:
The Indexer Uses ReLU, Not Softmax—So It Never Touches the SFU (MUFU.EX2):
Look at the Lightning Indexer scoring formula in DSA:
It,s=j=1∑HIwt,jI⋅ReLU(qt,jI⊤ksI)
With HI=32 or 64 tiny heads of dimension dI=128 in FP8 or MXFP4 (such as the compact 68-byte MXFP4 indexer K cache in DeepSeek-V4/V4.1, or the 129-byte FP8 entry—128 FP8 bytes plus 1 scale byte—in GLM-5.2/5.3), the indexer is a pure low-precision matrix-vector dot product followed by a trivial ReLU clamp (max(0,x)) and weighted sum. It executes zero MUFU.EX2 / VALU exponential instructions and zero denominator divisions across the 1M-token context. (And in DeepSeek-V4.1, SGLang v0.5.23 #44403 and vLLM v0.33.0 #61039 combine length-aware decode indexer block selection and Hierarchical Sparse Indexing [HSI] with encoder/decoder SWA bounded replay, cutting 32K–64K TTFT by ~28% and saving ~850 µs per decode step at 1M context.)
It Cuts All Three Main Attention Stages (QK⊤, Softmax, and PV) Plus HBM Bandwidth by 500× to 2,000×:
At T=1,048,576 (1M) tokens, selecting k=2,048 tokens (GLM-5.3, Kimi K3.1 Pro) or k=512–2,048 tokens (DeepSeek-V4/V4.1) reduces the number of keys entering main attention by 512× to 2,048×:
QK⊤ Tensor Core FLOPs drop by 99.8% to 99.95% (whereas single-sided 2:4 cuts QK⊤ by 0%).
Main Softmax MUFU.EX2 / VALU exponentials drop by 99.8% to 99.95% (whereas 2:4 cuts them by at most 50%).
PV Tensor Core FLOPs drop by 99.8% to 99.95% (whereas 2:4 cuts them by 50%).
Main KV-cache HBM reads during decode drop by 99.8% to 99.95%—whereas 2:4 sparsity on P still has to stream 100% of the K and V cache from HBM because the dense operand B=V must still be loaded in full for the Sparse Tensor Core multiplexer to select matching entries per 4-tuple.
The Selected k Tokens Form 100% Dense, Contiguous Tensor Core Tiles:
Once token_sparse_kv_indices gathers the k=512 or 2,048 selected KV slots (an exact multiple of the 128-column tile width BLK_N = 128: just 4 or 16 dense tiles), the main attention kernel runs 100% dense FlashAttention-4 / FlashMLA / ZYFA over those 4 to 16 tiles. There are no 2-bit mdata nibbles to pack, no register-to-TMEM metadata stores, no pairwise 4:8 alignment losses, and no Amdahl bottlenecks.
It Preserves Exact Softmax Fidelity Over the Selected Support:
Instead of forcibly deleting 2 out of every 4 adjacent tokens inside a local 4-token window (which drops relevant keys whenever a phrase or code identifier spans 3+ tokens), global Top-k keeps all k highest-scoring tokens across the entire 1M context—and combines them with an exact, unpruned 128-token local Sliding Window Attention (SWA-128) branch.
How does DeepSeek-V4.1 cut the indexer’s own cost?
Coarse token sparsity still leaves one cost that grows with context: the indexer. It is cheap per key (an FP8 or MXFP4 dot product and a ReLU, no exponential), but in plain DSA every indexed layer scores every causally visible key for every query. At 1M tokens that is 1,048,576 indexer scores per query per layer. DeepSeek-V4.1-Flash’s Compressed Sparse Attention 2 (CSA2) attacks that term in two steps (DeepSeek-V4.1 technical report, “Compressed Sparse Attention 2” and “Hierarchical Sparse Indexer”):
Cross-layer modes. Each CSA2 layer is statically assigned one of three modes:
Full computes its own main KV and indexer keys and runs the indexer.
Reindex reuses the main KV and indexer keys of an earlier layer but scores them with its own indexer query, so its selection can differ.
Reuse takes the most recent Top-k indices and does no indexing at all.
Sharing the caches cuts storage; reusing indices cuts indexer evaluations.
The Hierarchical Sparse Indexer, used only in the decoder of the causal encoder–decoder.
The first decoder layer in Full mode still scans the whole visible context. Besides its own Top-k, it also assigns each block of positions the maximum indexer score inside it and keeps the highest-scoring blocks as a candidate pool. The report’s example is 2,048 blocks of 8 positions, or 16,384 candidates.
Later Reindex layers score only that pool and pick their own Top-512 inside it.
In the report’s words, for a fixed pool size this “changes the per-query cost of deeper indexers from linear in context length to constant.” The restriction is applied in post-training as well as at inference, so the deeper indexers are trained on the same search domain they use in serving.
This is the same principle carried one level further. DSA stops the main attention from touching keys that do not matter. V4.1 stops most of the indexers from touching them too, leaving one full scan per query at the first decoder Full layer instead of one per indexed layer. Hybrids now ship the plain V3.2-style indexer as well: Kimi K3.1 Pro uses it (top-2,048, 32 index heads of dimension 128) in 24 of its 93 layers, with Kimi Delta Attention in the other 69.
5.2 How do Rubin, MI355X/MI455X and TPUv7 run it today?#
Look at the actual kernel commits and hardware benchmarks across all three major accelerator ecosystems this week:
On NVIDIA Blackwell (sm_100/sm_103) and Vera Rubin (sm_107):
In FlashInfer v0.7.3, vLLM v0.33.0, and SGLang v0.5.23, NVIDIA and open-source maintainers shipped a full suite of Rubin (sm_107a) and Blackwell attention and indexer kernels—and every single one of them is built around dense tcgen05 tiles + coarse token-sparse indexing:
Coarse DSA/QSA/MSA Indexers on sm_100a, sm_103a, and Rubin sm_107a: FlashInfer v0.7.3 (#6056, #6230, #7171) ships cake_dsa_indexer for Blackwell, Blackwell Ultra, and Rubin (sm_107a), using a host-dispatched wide-kind register split (232 math registers / 40 I/O registers per lane), bulk-copy row I/O, a two-level prefix-popcount rank finalize, and an SM107 persistent two-row form for top_k <= 2048. CuDNN Frontend 1.32 likewise added native qsa_forward and qsa_indexed_forward on B200, B300, and Rubin (FlashInfer #7532).
Token-Sparse Decode + Hardware QMUL4 NVFP4 Dequantization: Instead of using tcgen05.mma.sp, FlashInfer v0.7.3 (#6215, #6420, #6536, #6931, #7410) and vLLM v0.33.0 (#55866) serve DeepSeek-V4/V4.1, GLM-5.3, and Kimi K3.1 Pro using FA4 sparse MLA decode, trtllm_batch_decode_with_kv_cache(sparse_top_k=K), and cake_rubin_mla_nvfp4_decode on sm_107a—reading only the k indexer-selected entries from an NVFP4 or FP8 paged latent cache and dequantizing NVFP4 in registers via the new PTX ISA 9.4 QMUL4 hardware instruction before feeding dense tcgen05.mma.
Prologue-Overlapped Online Softmax: In cake_sparse_mla (FlashInfer #6193, #6550), the FP8 H128 prologue rendezvous is overlapped directly with a two-chunk BF16 SWA-128 online softmax, hiding the remaining SFU latency across tiles.
On AMD Instinct MI355X (gfx950, CDNA 4) and MI455X / MI450 (gfx1250, CDNA 5):
On CDNA 4 (gfx950), vLLM v0.33.0 (#60834, #61943, #63669) and SGLang v0.5.23 (#43643, #44006) enable MXFP4 indexer K caches by default (cutting DeepSeek-V4 TTFT by up to 30.7%) alongside gfx950 fused DSA indexers and AITER cluster top-k, while ZYFA’s Lean P (1 FMA + 1 int cast) and two-wave ping-pong schedule eliminate the 896-cycle VALU softmax bottleneck on the dense attention tiles, lifting MLA attention throughput by 1.99× (2,464 vs. 1,237 TFLOP/s).
On CDNA 5 (gfx1250, MI455X / MI450), where ROCm 10.0 / 10.1 enablement landed in vLLM v0.33.0 (#58761, #58800) and SGLang v0.5.23 (#41988, #42699, #44671, #45304, #45365, #45758, #46366), the hardware is purpose-built for coarse token gather + dense block-scaled tiles:
CDNA 5’s Tensor Data Mover (TDM) Gather Mode (ISA §10.11.3.2 & Tables 66–67) accepts up to 16 16-bit or 8 32-bit row indices directly in the D# descriptor (Gather Mode = 1) and gathers non-contiguous KV cache rows from HBM4 (at 23.3 TB/s) straight into the 320 KB LDS without touching VGPRs.
Once the top-k tokens are gathered into contiguous LDS tiles, DS_LOAD_TR* loads and transposes them into the 1,024-VGPR file, and dense V_WMMA_SCALE{,16}_F32_16X16X128_F8F6F4 (20.13 PF) or V_WMMA_SCALE{,16}_F32_32X16X128_F4 (40.26 PF) executes the attention GEMMs at full block-scaled throughput—a path that V_SWMMAC cannot even access because V_WMMA_SCALE* does not support structured sparsity.
On Google TPUv7 (Ironwood):
Perhaps the cleanest architectural vindication of coarse token sparsity + dense matrix tiles comes from Google’s TPUv7 (Ironwood) on SemiAnalysis’s AgentX benchmark (published November 5, 2026).
TPUv7’s main compute engine is a massive dense 256×256 systolic array (MXU)—an architecture that has zero support for fine-grained 2:4 sparsity (in fact, even a head dimension of 64, as in Meta’s Muse Spark Open, pads 25% of the systolic array; TPUs hit peak efficiency on wide, dense 128–256 tiles).
Yet on GLM-5.2 / GLM-5.3 (744B MoE, 39B active, 1M-token context via DeepSeek Sparse Attention with k=2,048), TPUv7 in FP8 beat NVIDIA’s B200, B300, and AMD’s MI355X in FP8 by 1.2× to 2.7× in tokens per dollar across the entire 60 to 300 tok/s/user interactivity curve (while GB200/GB300 in NVFP4 still lead TPUv7 FP8 on tokens per dollar during memory-bound small-batch decode at a slight FP4 accuracy trade-off, since TPUv7 lacks native FP4 until TPUv8).
How did a rigid systolic array win on 1M-token sparse attention at equal FP8 precision?
Dedicated SparseCores for Coarse Gather, Dense MXU for Math: Each query in GLM-5.3 reads only the k=2,048 KV cache entries selected by the DSA indexer. TPUv7 offloads the scattered memory gather of those 2,048 entries to its SparseCores—purpose-built DMA/gather engines for coarse embedding and index lookups—while the dense TensorCore (MXU) runs uninterrupted dense matrix math and vector softmax over the gathered 2,048-token buffer.
Sideways Register Packing (129 B→132 B instead of 256 B): TPUv7’s vector registers are organized as 8 rows×128 lanes. Each DSA indexer key is 128 FP8 bytes plus 1 scale byte = 129 bytes—one byte wider than a 128-lane row, which naively rounded every key up to 256 bytes (wasting 49.6% of register capacity and bandwidth). By transposing the layout sideways so that tokens run along each 128-lane row and each token’s key runs vertically down 32×4-byte rows plus 1 scale row (132 bytes), Google cut wasted register capacity to just 3 bytes per key (2.3%).
Compare the three paradigms across every hardware and model metric that matters in production:
Dimension
Dense Low-Bit Attention (FA4 on B200/B300/Rubin; ZYFA on MI355X/MI455X)
6. What evidence would settle it, and what should next-gen silicon do?#
Hardware features do not survive in production because they look good on a datasheet FLOP counter; they survive only when they shorten the critical path of the end-to-end execution graph.
For the past three accelerator generations, two trends collided inside the attention block:
Low-precision matrix engines outran the rest of the core. Dropping from BF16 to FP8 and NVFP4/MXFP4 multiplied Tensor Core and Matrix Core throughput by 2× to 8×, while leaving MUFU.EX2, vector ALUs, and shared-memory bandwidth behind. That turned softmax and on-chip TMEM/SMEM/LDS traffic into the primary bottleneck—forcing FlashAttention-4 on Blackwell to offload 10%–25% of its exponentials onto FMA polynomial emulation and skip 90% of its output rescalings, forcing Zyphra’s ZYFA on MI355X to replace hardware exp2 with the 1-FMA Lean P bit-pattern trick (384 vs. 896 cycles), and pushing NVIDIA (FP32 EX2 doubled in B300, then only FP16 EX2 doubled in Vera Rubin) and AMD (transcendentals doubled in CDNA 5 / MI455X) to chase their own wider low-bit matrix engines without catching them. NVIDIA’s one chip designed around the problem, Rubin CPX, was pulled before it shipped.
Fine-grained 2:4 (and 4:2 / pairwise 4:8) sparse matrix units ended up on the wrong side of both the memory hierarchy and information theory. Above the quantization floor, dropping one dense precision step (BF16 → FP8, or FP8 → NVFP4/MXFP4) beats adding 2:4 on every operand in both speed and accuracy, because quantization error shrinks 4× per bit while 2:4 deletes a fixed fraction of tensor energy (e2:4), charges a 1-bit-per-element metadata tax, and monotonically degrades fact recall and hard reasoning tasks. Inside dynamic attention, Rubin’s tcgen05.ld.red.spcompress places compressed FP32 logits and 2-bit metadata into thread registers when tcgen05.mma.sp requires them in TMEM/SMEM (forcing a 7-step repack round-trip right onto the congested non-matmul path), while AMD’s register-resident V_SWMMAC on CDNA 5 lacks a hardware spcompress instruction, offers no K-dimension expansion over dense 16x16x128 FP8 WMMA, and is unsupported on block-scaled V_WMMA_SCALE* instructions.
If a chip vendor or kernel team wants to prove that fine-grained hardware sparsity (2:4, 4:2, or pairwise 4:8) has a legitimate future in attention—rather than being a benchmark artifact used to double the “Sparse PFLOPS” number on launch slides—four concrete pieces of evidence would settle the question:
An Apples-to-Apples Benchmark at Equal Matrix Tiers on B200, B300, Rubin (sm_107), and MI455X (gfx1250):
Compare a fully fused PTX 9.4 tcgen05.ld.red.spcompress + tcgen05.mma.sp attention kernel (or a CDNA 5 V_SWMMAC kernel) against dense FlashAttention-4 / ZYFA at equal nominal matrix tiers—that is, 2:4-BF16 vs. dense FP8, and 2:4-FP8 vs. dense NVFP4/MXFP4—reporting wall-clock milliseconds (not “effective dense TFLOPs” that credit multiplied zeros) across 16K–1M contexts. The same bar applies to Rubin’s “adaptive compression”: publish the pattern it accepts and whether it runs on attention operands, then compare its 50 PF “inference” mode against the 35 PF dense mode on wall-clock time and on the accuracy tests in item 3.
Instruction-Level Cycle Profiling of the On-Chip Staging Loop on sm_107a and gfx1250:
Following the microbenchmarking methodology of Luo et al. (Dissecting the NVIDIA Hopper Architecture, arXiv:2501.12084), measure the exact cycle latency of tcgen05.ld.red.spcompress, register dtype conversion, A-layout and b2 metadata swizzling, tcgen05.st, and tcgen05.wait::st on Rubin sm_107a (and VALU top-2-of-4 selection + SRC2 index packing on CDNA 5 gfx1250), and show whether that staging chain actually takes fewer cycles than the 64 to 256 cycles saved by halving a single PV MMA tile.
Fact Recall, Long-Horizon Reasoning, and Agentic Evals—Never WikiText-2 Perplexity Alone:
Because token-level perplexity stays flat up to 50% sparsity and recovers within 250M retraining tokens while closed-book fact recall (Jin et al., 2024; Jaiswal et al., 2024) and difficult multi-step reasoning (Yin et al., 2024; Shao et al., 2026; Qin, 2026) remain broken, evaluate any dynamically 2:4-pruned attention mechanism (Psp and especially dual-side Qsp,Ksp) on FreebaseQA, GSM8K, MATH-500, AIME 2026, LiveCodeBench, and SemiAnalysis AgentX (1M-context multi-turn coding trajectories).
Sustained-Clock Measurements on Real Model Activations (TFLOP/J and Effective MHz):
Following Zyphra’s ZYFA methodology on MI355X, benchmark on captured real-model activations over thousands of launches at sustained thermal/power clocks—tracking whether non-zero block-scaled probabilities and metadata multiplexing trigger the ~23% bit-toggle DVFS clock drop observed on MI355X.
Until someone clears those four bars, the engineering rules for long-context attention are straightforward:
Do not use 2:4 Sparse Tensor Cores to prune inside a tile what a coarse token indexer can skip across the sequence. Use a ReLU-based FP8/MXFP4 indexer (DSA, QSA, MSA) to pick the top k tokens out of a million, eliminating 99.8% of the matmuls, 99.8% of the SFU exponentials, and 99.8% of the HBM reads in one stroke, and use hardware gather DMA (TPUv7 SparseCores, NVIDIA TMA, or CDNA 5 TDM Gather Mode) to pack the surviving tokens into contiguous pages.
Keep the surviving tiles 100% dense, drop to the lowest block-scaled dense precision the model tolerates (FP8/MXFP8 or NVFP4/MXFP4), and co-design the softmax in software. Whether through FlashAttention-4’s dual-path FMA polynomial emulation and conditional rescaling on Blackwell/Rubin or ZYFA’s Lean P bit-pattern trick and native block-scaled V_CVT_SCALEF32 / V_WMMA_SCALE* pipelines on MI355X/MI455X, software math on dense tiles beats hardware 2:4 sparsity every time.
Xiuyi Qin, Is 2:4 Sparsity Still Worth It? Semi-Structured Sparsity versus Quantization in LLM Inference, arXiv:2610.28947 (October 2026) & PuppyQ08/24_quant_compare.
AMD, Introducing AMD CDNA 5 Architecture: Enabling the Future of Frontier AI With the AMD Helios Rackscale Solution (Whitepaper, 2026) & “CDNA5” Instruction Set Architecture Reference Guide (Preliminary, July 27, 2026).
Chips and Cheese, Scrying the AMD GFX1250 LLVM Tea Leaves (2026); Coelacanth’s Dream, GFX1250 / MI450 Expandable Addressable VGPRs to 1024 via S_SET_VGPR_MSB (March 2026).
Andrey Kuzmin, Markus Nagel, Mart van Baalen, Arash Behboodi, & Tijmen Blankevoort, Pruning vs Quantization: Which is Better?, Advances in Neural Information Processing Systems (NeurIPS 2023), arXiv:2307.02973.
Ajay Jaiswal, Zhe Gan, Xianzhi Du, Bowen Zhang, Zhangyang Wang, & Yinfei Yang, Compressing LLMs: The Truth is Rarely Pure and Never Simple (LLM-KICK), International Conference on Learning Representations (ICLR 2024), arXiv:2310.01382.
Lu Yin, Ajay Jaiswal, Shiwei Liu, Souvik Kundu, & Zhangyang Wang, Junk DNA Hypothesis: Pruning Small Pre-Trained Weights Irreversibly and Monotonically Impairs “Difficult” Downstream Tasks in LLMs, International Conference on Machine Learning (ICML 2024), arXiv:2310.02277.
Tian Jin, Nolan Clement, Xin Dong, Vaishnavh Nagarajan, Michael Carbin, Jonathan Ragan-Kelley, & Gintare Karolina Dziugaite, The Cost of Down-Scaling Language Models: Fact Recall Deteriorates before In-Context Learning, International Conference on Learning Representations (ICLR 2024), arXiv:2310.04680.
Hanyong Shao, Yingbo Hao, Ting Song, Yan Xia, Di Zhang, Shaohan Huang, Xun Wu, Songchen Xu, Le Xu, Li Dong, Zewen Chi, Yi Zou, & Furu Wei, SlideSparse: Fast and Flexible (2N−2):2N Structured Sparsity, Proceedings of the 43rd International Conference on Machine Learning (ICML 2026), PMLR 306:40420–40477, arXiv:2603.05232.
Kang Zhao, Tao Yuan, Zhenfeng Su, Han Bao, Chang Gao, Zhaofeng Sun, Zichen Liang, Liping Jing, & Jianfei Chen, Beyond 2:4: Exploring V:N:M Sparsity for Efficient Transformer Inference on GPUs, arXiv:2410.16135 (2024).
Edoardo Cetin, Stefano Peluchetti, Emilio Castillo, Akira Naruse, Mana Murakami, & Llion Jones (Sakana AI & NVIDIA), Sparser, Faster, Lighter Transformer Language Models, arXiv:2603.23198 (March 2026) & SakanaAI/sparser-faster-llms.
PyTorch Team, When Quantization Isn’t Enough: Why 2:4 Sparsity Matters, PyTorch Blog; Mohammad Mozaffari, Amir Yazdanbakhsh, & Maryam Mehri Dehnavi, SLiM: One-Shot Quantization and Sparsity with Low-Rank Approximation for LLM Weight Compression, ICML 2025.
vitali87, quadbit: Hand-Written FP4 Tensor-Core Kernels and a Deployment Stack for Consumer Blackwell (SM120), github.com/vitali87/quadbit (2026).
NVIDIA, Inside NVIDIA Rubin GPU Architecture: Powering the Era of Agentic AI & PTX ISA Version 9.4 (CUDA 13.4 Developer Preview) (2026); NVIDIA Technical Blog, Making Softmax More Efficient with NVIDIA Blackwell Ultra & jamieliNVIDIA/mufu_ex2_bench (2026).
X. Yu, R. Fan, Z. Li, W. Luo, G. Gong, & X. Chu, DynSpAttn: Efficient Attention via Dual-Side Dynamic Sparsity on Sparse Tensor Cores, Proceedings of the 40th ACM International Conference on Supercomputing (ICS 2026).
SemiAnalysis, TPU Strikes the King: First Official TPUv7 AgentX Benchmarks Across GLM-5.2/5.3, Qwen3.5, Muse Spark Open, and Kimi K3 (November 5, 2026).
NVIDIA Technical Blog, Inside the NVIDIA Rubin Platform: Six New Chips, One AI Supercomputer (January 2026): Rubin compute table (SFU EX2 32 FP32 / 64 FP16 ops/clk/SM; NVFP4 50 PF Transformer Engine / 35 PF dense; FP32 vector 67 / 80 / 130 TFLOPS for Hopper / Blackwell / Rubin) and “adaptive compression.”
NVIDIA, NVIDIA Unveils Rubin CPX: A New Class of GPU Designed for Massive-Context Inference (press release, September 9, 2025); SemiAnalysis, Another Giant Leap: The Rubin CPX Specialized Accelerator & Rack (September 2025); Glenn K. Lockwood, processor notes on Rubin, Rubin Ultra and Rubin CPX.
Inside Deep Tech, NVIDIA Rubin CPX: Full Guide to Specs, Status and Redesign (October 30, 2026) and NVIDIA Rubin vs Rubin Ultra vs Feynman (November 2026): CPX withdrawal at GTC 2026, the unconfirmed HBM4 redesign report, Rubin Ultra’s 2025 spec and the reported two-die change, and NVL naming.
AMD, AMD Instinct MI455X GPU datasheet (structured-sparsity peaks for FP16/BF16/INT8; FP64 5 TFLOPS); AMD Instinct MI400 Series product pages and AAI 2026: AMD Launches AMD Instinct MI400 Series GPUs (July 23, 2026); Tom’s Hardware, AMD touts Instinct MI430X, MI440X, and MI455X (CES, January 2026); Aquanode, AMD MI400, MI450 and Helios Guide (October 2026) for the MI450 naming history.