Repository navigation
Conversation
Merged
6 tasks done
YAMY1234
force-pushed
the
followup/qwen35-megakernel-kernels-v3-rc
branch
from
November 3, 2026 00:23
253c094 to
1a4e888
Compare
YAMY1234
marked this pull request as ready for review
November 3, 2026 03:04
Route multi-request draft CP-lite calls through a standalone plain merge-and-wait kernel equivalent to the legacy R11 implementation. Keep target verify and single-request draft calls on the existing EARLY/gate-epilogue path. The plain exact and fold variants are bitwise identical to R11 on the validated inputs. This removes about 30 us from each TEP8 B32 draft round without regressing verify.
Format the two files the pre-commit lint job flags on the current head; no code change.
Uneven KV lengths leave the equal per-request split plan waiting for its longest request. Select the existing KV-balanced plan by default and admit up to 64 requests for both verify and Q1, using the existing wide plan. Keep the equal plan available through the existing test override; add no environment switch and change no CUDA kernel arithmetic or precision. Add CPU tests for admission boundaries, complete per-rank tile coverage, and the longest CTA tile range on a ragged batch. Different split points can change floating-point accumulation order; bitwise equality is not expected. Validation: 3 CPU unit tests; 48 GPU cases against FP64 at local query heads 4/28, batches 1/8/32/64, mixed KV up to 131072; same error magnitude. Full GSM8K at T=1: 1289/1319 balanced versus 1287/1319 equal, zero empty or garbled-heuristic responses. Concurrent TEP8 c130 AgentX, one 1200s arm each: TPS/user P50 +9.57%, P90 +58.15%; TTFT P90 +3.34%. Arms ran in separate cabinets with 91.38% request-window overlap.
Keep verify batches 65..128 on the existing packed two-slot CP plan instead of falling back above 64 requests. Retain the Q1 limit of 64, the SM-count admission check, and rejection above 128. This changes plugin admission, not scheduler capacity or kernel arithmetic. Extend CPU coverage for admission boundaries and complete per-rank tile ownership at batches 65/96/128 in packed and unpacked plans. Update the runtime and step selector expectations for the new limit. Validation: four CPU tests pass; the GPU FP64-reference matrix covers 72 cases, including mixed KV lengths through 128K and batch 128. Full GSM8K with eight-way expert parallelism and max-running 128 scores 1290/1319 versus 1289/1319 with the cap-64 parent. Both use temperature 1 and have no empty responses or request errors. Runtime epoch deltas confirm batch >64 fused CP execution on all eight ranks.
Add topology.plan: the capability selection plus the slots a topology's plan turns on with the requested ones. The TP8 plan, aggregated and PD decode, now runs route_lin whenever the policy holds the slots it runs through (route, mkm, hop, gdn_push, mka, mka_push, and lowm_se with route_shared), with no environment switch. TEP8, DEP8, TP2 and TP4 keep exactly their selected slots. The numerics claim covers every slot a plan can add. Validation: on aggregated TP8 static decode with the P27 slots, route_lin takes B1 from 2996.2 to 2849.8 us/step (verify 2262.8 to 2117.8), recovering 145 of the 152 us B1 gap to the frozen TP8 reference; B32 is 11306.1 vs 11243.5 us. Router logits in serving stay at 0.989x stock's RMS error against FP64 on the same quantized operands (GDN 0.989x, attention 0.990x; tolerance 1.05x). GSM10 passes 10/10 on both arms.
Add the existing mkm_wide_bal variant to the TP8 topology plan whenever mkm_m256 or mkm_m512 is selected. Keep other topology plans unchanged and include this bitwise variant in the pre-topology numerics claim. No new environment switch or kernel change. Validation: the unchanged wide kernels passed 16/16 bitwise comparisons. Same-holder full-graph TP8 decode step time improves 3.06% at B32 and 2.35% at B64; GSM10 passes 10/10 on both arms. Focused CPU tests cover TP8 selection, unchanged TEP8 selection, and the existing numerics-plan claim.
A refusal that depends on the weights, the model's shapes or the environment (draft MoE expert layout, MTP layers, LM-head/embedding shards, FlashInfer, multicast mapping, MKD memo parity) now logs and keeps the stock path even for an explicit SGLANG_NVIDIA_MEGAKERNEL_SLOTS list. Only a server-argument contradiction (CP page size, no covered width) still raises, and only for an explicitly requested slot. MKD build refusals fall back like its other checks. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
YAMY1234
force-pushed
the
followup/qwen35-megakernel-kernels-v3-rc
branch
from
November 3, 2026 05:31
3c5caa4 to
e7ed0d7
Compare
The routed body asked the autotuner for each width's trtllm_fp4_block_scale_moe tactic, and the online cold tune's pick between near-tied tactics varies from boot to boot. moe/tactics.py now fixes the tactic of each token bucket for FlashInfer 0.7.1, SM103 and the routed experts' MoERunner signature; any other version, architecture, signature or bucket asks the autotuner as before, and the log names each width's source. Only the routed body reads the table. SGLANG_NVIDIA_MEGAKERNEL_MOE_TACTICS switches it; unset, it follows SGLANG_ENABLE_NV_MEGA_RUNTIME_OPTIMIZATION. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Upstream sgl-project/sglang#48004 stages strided prefill state at rows 1..n and reserves row 0 for padding. Keep the existing capability boundary: strided prefill returns to the native backend before writes, contiguous prefill keeps native indices, and target verification never stages prefill state. Exercise the native forward branch with CPU kernel stand-ins, compare contiguous request/state identity, and reject stage/unstage calls during target verification. Update the two mirror digests after these checks; no executable kernel or serving path changes.
…ooks sgl-project/sglang#47201 is merged; the runtime tests import HooksFactory from it. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The test compared against an SGLang FP8 reference keyword that main does not have. Check the plugin path directly: FP32 raises before any BMM, and BF16/FP16 call the BMM once with the layer dtype on the same input, weight and scales. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
YAMY1234
force-pushed
the
followup/qwen35-megakernel-kernels-v3-rc
branch
from
November 5, 2026 00:26
2a5316b to
b5c85d9
Compare
Collaborator
Author
|
All utests passed after sgl-project/sglang#47200 merge |
Merged
3 of 5 tasks
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Depends on sgl-project/sglang#47200 (runtime optimizations) and sgl-project/sglang#47201 (provider binding). The two SGLang PRs are independently based on
main, build and test without each other, and may land in either order; this plugin uses both. The local-key provider needs the sharded-verification runtime support from sgl-project/sglang#47200 and the contracts and binder from sgl-project/sglang#47201, while unsupported or absent capabilities retain the documented stock fallbacks.When the second SGLang PR is rebased after the first lands, or when both are composed before merge, the later PR must resolve
eagle_draft_cuda_graph_runner.py,eagle_draft_extend_cuda_graph_runner.py,eagle_megakernel.py,eagle_worker_v2.py, andtest_eagle_binding.pyby retaining the runtime PR's relay/static-buffer behavior and the binding PR's always-present facade.The combined SGLang stack has 28 Boolean children of
SGLANG_ENABLE_NV_MEGA_RUNTIME_OPTIMIZATION: 27 come from the sharedmainbase, and sgl-project/sglang#47200 addsSGLANG_TRTL3_EP_DEFER_FINALIZEas the 28th. sgl-project/sglang#47201 declares no child switch; itsSGLANG_NVIDIA_MEGAKERNEL_SLOTSsetting is an independent tuple selector.Motivation
Keep Qwen3.5-specific kernels, shape policy, and numerical contracts in
sgl-nvidia-mega, while SGLang exposes only model-independent runtime plumbing and data views. Every path in this PR is explicitly selected, enabled only for supported capabilities, and able to fall back to the original SGLang implementation.Modifications
Context-parallel attention slots
What and why
qwen3_5/attention/,qwen3_5/draft/attention.py, andqwen3_5/sm103/attention/q35_cp_{partial_attn,lite,fused}.pyprovideskv2_cp,draft_q1_cp, anddraft_skv2_cpfor target verification, draft-loop Q1, and draft extend. Target and draft variants build independently and agree on the requested CP configuration across ranks before allocation or early return.Compared with main
Main executes the stock attention, partial-reduction, and merge sequence. The selected slots fuse partial attention and merge work, removing separate host launches, intermediate writes, and repeated workspace setup for supported shapes.
Current placement
The Qwen3.5 CP kernels and selection policy live in plugin-owned slots, leaving only generic views and binding contracts in SGLang. This makes the CP implementation independently replaceable without adding model checks to the runtime PR.
Switch and rollback
The three slots are opt-in through
SGLANG_NVIDIA_MEGAKERNEL_SLOTS. Dtype, layout, shape, topology, workspace, or cross-rank agreement rejection removes the slot before execution and preserves stock attention.Size and evidence
The principal move is
+7,172/-31production lines and+217/-10test lines. Unit coverage exercises slot construction, independent target/draft capability, cross-rank agreement, and stock fallback; kernel coverage compares fused outputs with the native attention path.MoE and deferred draft finalization
What and why
qwen3_5/moe/route.py,sm103/moe/shared_act_quant.py,draft/finalize.py, anddraft/parts.pykeep routed-MoE, shared-expert BF16 activation/FP8 quantization, and deferred MTP finalization next to the kernels and layouts they require. Ifdraft_moecannot consume an expert layout, it is removed from the plan so SGLang MoE runs rather than raising at startup.Compared with main
Main executes routed/shared-expert operations and draft finalization as separate SGLang operations. Supported slots fuse shared activation/quantization and defer finalization, removing intermediate tensor traffic and host launches.
Current placement
Verification and MoE selection live in the plugin, scalar ModelOpt shared-expert scales are accepted, and unsupported
draft_moelayouts return to SGLang MoE. The plugin does not enable a BF16 twin or a low-precision overlay by default.Switch and rollback
draft_moe,draft_fin, and MoE/shared-expert slots are individually requested. Expert-layout, scale, dtype, shape, or backend rejection executes the corresponding SGLang operation.Size and evidence
The policy move is
+518/-25production lines and+862/-6test lines. Scalar-scale support is+6/-4production and+83/-15tests. Coverage includes unavailable-draft-MoE fallback, scalar/tensor scales, routed expert layouts, and shared-expert output parity.GDN and ReplaySSM slots
What and why
The Qwen3.5 GDN plan exposes front, core, convolution, push, and verify slots and keeps high-batch ReplaySSM verification in the fused path through 896 rows.
Compared with main
Main executes the stock GDN/ReplaySSM sequence as separate operations. The selected plugin kernels fuse compatible state, convolution, and commit work, reducing intermediate launches and copies.
Current policy
The production GDN core policy supports the fused path through 896 rows. The companion runtime PR owns its generic one-launch ReplaySSM fallback; this plugin owns Qwen3.5-specific kernels and shape policy.
Switch and rollback
GDN slots are individually opt-in. Unsupported dtype, layout, row count, state view, or backend declines to the SGLang implementation.
Size and evidence
The high-batch policy change is
+2/-2production and+2/-1tests. The mirror/output-contract update described below adds+35/-3production and+144/-1tests across GDN, attention, and low-M paths. Tests cover the 224/896 boundary and stock fallback above the supported bound.hop_midWhat and why
The tuned policy explicitly lists
hop_midalongsidehop, selecting the middle-shape communication/normalization kernel when requested.Compared with main
Main has no plugin hop kernel and executes its existing communication and normalization sequence.
hop_midselects the tuned fused kernel for its supported shape.Current policy
The explicit production slot list includes
hop_mid; it is not made an implicit shipped default.Switch and rollback
Request
hop_midinSGLANG_NVIDIA_MEGAKERNEL_SLOTS. Omitting it returns to the existinghopor stock selection.Size and evidence
The policy documentation change is
+6/-0; it reuses the already-tested kernel body. Focused slot-plan tests verify that explicit policy includeshop_midwithout enabling unrelated slots.Route kernels and policy
What and why
Qwen3.5 route projection, top-k, route-GEMM, and shared-expert policy remain next to their plugin kernels, including EP-size and engine-width guards.
Compared with main
Main launches router projection, top-k, and shared-expert preparation as separate operations. Supported plugin slots fuse or specialize those stages and reduce launch and intermediate-memory overhead.
Current policy
Qwen-specific route policy lives in the plugin rather than SGLang.
route_linremains available as an experimental plugin slot but is not requested by the production slot list; this avoids silently adding a verify kernel that is not part of the validated production policy.Switch and rollback
Route slots are explicit. EP size, engine width, dtype, layout, or shape rejection uses stock routing.
route_linis default-off.Size and evidence
Direct route implementation and policy contribute
+85/-24production and+120/-13direct kernel-test lines; shared policy/facade tests are counted with the MoE move above. Tests cover EP guards, engine widths, top-k output, and stock routing.Sharded verification local-key provider
What and why
qwen3_5/runtime/hooks.pyandruntime/executor.pyattach a Qwen3.5 local-key provider for supported verification while leaving reduction, collectives, write-back, acceptance, forced acceptance, and stock sampling in SGLang.Compared with main
Main gathers full vocabulary logits before sampling. For an eligible request, the provider produces compact rank-local keys so the dependent SGLang runtime can avoid that gather.
Current contract
The binder permits only local-key production, so the plugin cannot change collective ownership or acceptance policy.
Switch and rollback
sharded_gumbelis explicit. Seeded or unsupported sampling, penalties, watermarking, logprobs, or provider rejection use the stock sampler with unchanged RNG ordering.Size and evidence
Provider attachment is
+263/-1production and+562/-2tests. Tests cover padded vocabulary tails, greedy delegation, seeded no-RNG fallback, unseeded RNG ordering, and provider decline.FP8 / ModelOpt output dtype contract
What and why
The plugin carries the layer's original BF16/FP16 activation dtype through its mirrors and uses it when materializing prequantized E4M3 ModelOpt/FlashInfer outputs.
Compared with main
Main returns the model layer's declared output dtype. The plugin uses the original layer dtype for
_out_proj, so its output contract matches main rather than inheriting the GDN recurrence dtype.Current contract
orig_dtypeis present in all relevant mirrors, preserving the declared output dtype when recurrence state and layer output dtypes differ. Output dtypes outside explicit BF16/FP16 support are rejected.Switch and rollback
This is a correctness contract on the FP8/ModelOpt slot, not an independent performance switch. Slot validation rejects unsupported dtypes and uses the native contract.
Size and evidence
The combined mirror/output fix is
+35/-3production and+144/-1tests. Coverage checks BF16 and FP16 model outputs, recurrence/output dtype disagreement, mirror signatures, and unsupported dtype rejection.TP2 / DEP8 topology filtering
What and why
The plan derives the actual attention tensor-parallel size and offers CP-only slots only when the attention backend built a compatible CP topology.
Compared with main
Main never attempts plugin CP construction. The Qwen3.5 plugin itself supports attention TP equal to model TP at TP4 and TP8; attention TP2 on model TP4 and DEP8 are DP-attention topologies and are rejected clearly by the plugin configuration gate at startup.
Current behavior
Before that top-level gate, the CP capability filter removes
skv2_cp,draft_q1_cp, anddraft_skv2_cpon an unsupported attention topology, returning those CP slots to stock and preventing incompatible CP construction. TP4 and TP8 retain their supported CP path. This CP-slot fallback is not a claim of end-to-end plugin support for DP attention.Switch and rollback
This is an automatic capability check on
skv2_cp,draft_q1_cp, anddraft_skv2_cp; no user action is required.Size and evidence
The topology filter is
+81/-17production and+163/-2tests. Coverage models attention TP independently from model TP and checks TP2/DEP8 rejection plus supported TP4/TP8 construction.cp_multifused batch limitWhat and why
The fused CP selector uses the validated target/draft limits of
32/32. The target route also stops offering fused CP above batch 32, so larger batches use the existing SKV2/stock route instead of constructing an unvalidatedcp_multiplan.Compared with main
Main always uses its native attention selection and therefore has no plugin batch-limit mismatch. The plugin eligibility check likewise returns unsupported batch sizes to the existing route.
Current policy
The validated
32/32fused limit is enforced at both the selector and route-offer boundaries.Switch and rollback
There is no new environment variable. The limit is part of the CP slot capability check. Batches above 32 do not offer target fused CP and automatically use the existing route.
Size and evidence
The selector change is
+5/-5production and+18/-0tests. The route-offer check is+4/-1production and+15/-0tests. Boundary tests cover batches 32 and 33 and verify that the fallback route remains available.Accuracy Tests
atol=1e-6, rtol=2^-7; this state is tolerance-equivalent, not bitwise-equivalent.SGLANG_ENABLE_NV_MEGA_RUNTIME_OPTIMIZATIONenabled (runtime only; the Qwen3.5 plugin disabled) answered GSM10 10/10.GSM8K on the current head, no draft-acceptance simulation, seed 1234 (strict / flexible accuracy):
0.978 / 0.9770.988 / 0.9880.972 / 0.9720.980 / 0.9790.980 / 0.9800.968 / 0.968No empty responses in any run. TP8 also passed a 53-request long-context replay (three attempts, all 53/53, no CUDA errors).
Speed Tests and Profiling
Static decode uses identical requests and warmed, unprofiled rounds. P50/P90 TPS/user is derived from round latency; autotune selections were frozen for all measurements in both columns.
773.39 / 753.591561.443 / 1553.168+101.9% / +106.1%492.46 / 488.33657.33 / 650.93+33.5% / +33.3%410.25 / 406.68553.19 / 546.35+34.8% / +34.3%260.23 / 258.97324.28 / 323.57+24.6% / +24.9%359.99 / 357.98431.472 / 428.328+19.9% / +19.7%283.69 / 282.05351.007 / 348.592+23.7% / +23.6%201.43 / 200.51258.757 / 257.732+28.5% / +28.5%AgentX trace replay, 3600 s window, TEP8 prefill/decode disaggregation at concurrency 272, same request set and the same fixed draft acceptance length in both columns:
85.48 / 81.31129.37 / 112.92+51.3% / +38.9%-80.1% / -60.0%-47.2% / -36.3%6894680774+17.2%TP8 decode with prefill/decode disaggregation at concurrency 16, same settings:
628.25 / 521.071163.77 / 850.48+85.2% / +63.2%-1.9% / -33.1%-31.8% / -43.4%86718950+3.2%TP8 decode with prefill/decode disaggregation at concurrency 128 (1 prefill + 4 decode nodes), same settings:
369.30 / 288.71640.99 / 525.06+73.6% / +81.9%0.820 / 3.4580.860 / 3.488+4.9% / +0.9%2.542 / 7.8921.900 / 6.135-25.3% / -22.3%3293333980+3.2%TEP8 prefill/decode disaggregation at concurrency 448, same settings:
85.72 / 81.26113.30 / 106.15+32.2% / +30.6%25.93 / 30.4714.45 / 17.87-44.3% / -41.3%31.45 / 49.9318.69 / 33.26-40.6% / -33.4%6623087126+31.5%All columns of all AgentX tables completed the full window with zero errored requests.
TP8 B1 was measured before the latest plugin commit, which does not affect the single-request path; all other rows were measured on the current head. The TEP8 rows were measured on the current combined tree.
Known limitations
sglang.srt.megakernels, which upstream SGLang removed in [Refactor] kernels: Add the plugin kernel backend and split plugin contracts from their srt integration sglang#45389. Its unit tests therefore cannot be collected against current SGLang main. This is independent of the Qwen3.5 changes in this PR.Checklist
pre-commit run --all-filespasses; focused formatting, lint, and compilation checks pass.test/cover changed kernels, policies, topology checks, and stock fallbacks.mainstatic measurements, serving accuracy (GSM8K), and AgentX results.🤖 Generated with Claude Code
Update (2026-11-02): rebased on
mainc396f2ab, eight new optimizations, one per commitThe 43 earlier commits are unchanged in content (rebased; a separate style commit
6b1f5dfapplies the repository's isort/ruff formatting so every commit passespre-commit run --all-files). Eight optimizations are added, each in its own commit. Tests for the new commits were trimmed to the core cases: on/off numerical or bitwise equality against the SGLang path, fallback when unsupported, and topology selection.Measured on Qwen3.5 (GB300). AgentX = trace replay, one 1200 s run per arm, TPS/user P50 / P90, run-to-run noise ≈2% (TP8) / ≈1.4% (TEP8) at P50. Static = fixed batch decode, step time.
ec40427gdn_prefill_split_convslot for PD prefill (TP1/PP4)67cbe3092950d6a39fab21046f06fef99c9f037dfd4da6382New-commit totals (first eight): production +1099, tests +749 (before trimming 1652).
Validation: all eight new commits pass the full
test/unitsuite on two SGLang runtimes with no new failures relative tomain; every commit passespre-commit. GPU kernel tests that were reshaped during trimming were checked for syntax and format only.Appended after the first update
33aa1ecmkm_wide_bal; batch 19–73 verify); other topologies unchangedb83045b| hooks member |
13ef503| Declarespeculative_runtime_hooks = Noneon the DeepSeek-V4.1, Kimi-K3 and Qwen3.5 draft built classes, so SGLang can read it as a declared member (sglang#47201) | +3/−0 · 0 | No runtime change; should land with or before sglang#47201 || K7 |
e7ed0d7| Refusals that depend on the weights or runtime state (draft MoE weight layout, MTP depth, context length, LM-head / embedding sharding, missing kernel dependencies, multicast mapping, CP-lite head layout) log INFO and keep the stock path even for explicitly requested slots; only configuration contradictions (CP slot with--page-size≠ 64, a per-request row count with no covered width) still raise when explicit. Two draft-exchange build refusals that previously escaped are now caught and fall back to stock | +29/−26 · +59/−11 | Fixes a startup failure introduced by K6 on real weights (explicitdraft_moewith the FlashInfer TRT-LLM MoE layout). Explicit recipe slot lists for TP2 / TP4 / TP8 / TEP8 / DEP8 / PD prefill / PD decode raise nothing and select the same slots as before || fp4 MoE tactics |
4190d31| Fix the TEP8 routed body'strtllm_fp4_block_scale_moetactic per token bucket (FlashInfer 0.7.1, SM103, the routed experts' MoERunner signature); any other version, architecture, signature or bucket asks the autotuner as before, and the log names each width's source.SGLANG_NVIDIA_MEGAKERNEL_MOE_TACTICSswitches it; unset, it followsSGLANG_ENABLE_NV_MEGA_RUNTIME_OPTIMIZATION| +156/−5 · +56/−0 | Same-node back-to-back AgentX pairs, 1200 s each, all other ops tuned online in both arms: TEP8 PD c130 P50 +5.0% / P90 +1.5%; TEP8 PD c272 P50 +4.8% / P90 +4.5% and, in a repeat on other nodes with the order reversed, P50 +5.2% / P90 +2.0% (TTFT P90 −14%). TP8 points do not use the table || shared act quant |
a1a418e| On TEP8 (TP8, attention DP 1, MoE EP > 1), when every layer's ordinary shared expert is eligible, fuse its SiLU-and-mul and static FP8 input quantization fordown_projinto the plugin's existingshared_act_quantkernel, removing one BF16 activation write and read. The shared gate/up projection and gate stay stock; no new env, slot, kernel or weight copy. TP8, DEP8 and ineligible layer groups keep the stock path | +42/−6 · +75/−1 | Static decode, same nodes and frozen tuning in both arms, no profiler, AL 4.8: per-round time B64 −0.65% (mean) / −0.63% (median), B128 −0.28% (median; the mean change is within window noise). FP8 bytes match and BF16 outputs are bitwise identical to stock; GSM8K-10 10/10 || GDN 3-wave window |
f60f990| The GDN core also caps registers at 168 (three resident CTAs per SM) when the CTA count is above two waves but fits in three (2·SMs < CTAs ≤ 3·SMs; batch 39–57 at TEP8 on 152 SMs), reusing the existing 168-register variant; the rule above four waves is unchanged | +3/−3 · +19/−0 | Static decode, same nodes and frozen tuning in both arms, no profiler, AL 4.8: per-round time B40 −1.4% (mean) / −0.9% (median), B48 −1.0% / −1.1%, B54 −1.2% / −1.2%; B64 unchanged. GSM8K-10 10/10 || GDN mirror audit |
5edd8e9| sgl-project/sglang#48004 reserves state-staging row 0 as a padding sink inGDNAttnBackend.forward_extend. The GDN prefill slot rejects strided conv/temporal pools before any write and keeps the native pool indices, and target verify never takes the new staging, so both mirrors accept the new digest; tests pin the fallback, the index handling and that verify never stages | +3/−2 · +219/−0 | No runtime or numeric change. Removes the two mirror-digest failures against main after sglang#48004 |All seven commits pass
pre-commitand the fulltest/unitsuite with no new failures.