Skip to content

[CuTe] Tune B200 forward scheduling - #2741

Draft
drisspg wants to merge 1 commit into
drisspg/stack/56from
drisspg/stack/57
Draft

[CuTe] Tune B200 forward scheduling#2741
drisspg wants to merge 1 commit into
drisspg/stack/56from
drisspg/stack/57

Conversation

@drisspg

@drisspg drisspg commented Jul 27, 2026

Copy link
Copy Markdown
Collaborator

Stacked PRs:


Human Note

Agent Note

Summary

This adds the same measured-policy treatment for B200. For long, sufficiently occupied BF16 output-only attention, D64 is better with direct output instead of TMA O, and D128 is better with 1CTA instead of 2CTA. The causal D64 control was basically flat/slightly worse, so causal stays on the old policy.

B200 SM100 measured selector cells

This is a Seaborn strip plot over the archived result rows: every circle is one actually timed workload cell, color is the campaign phase, the outlined diamond/error bar is the geomean and paired-round 95% timing interval, and X is the time-weighted result. The causal controls are real measurements, not an illustrative baseline.

New choice Cells Geomean [paired 95% CI] Time-weighted Min–max W/N/L
Dense noncausal D64: TMA O → direct O 60 1.204× [1.203, 1.206] 1.191× 1.171–1.264× 60/0/0
Dense noncausal D128: 2CTA → 1CTA 72 1.205× [1.203, 1.208] 1.158× 1.105–1.560× 72/0/0
D64 causal control: rejected 12 0.993× [0.989, 0.997] 0.998× 0.994–1.007× 0/12/0

A fresh old-explicit-baseline versus config=None rerun then confirmed D64 at 1.208× and D128 at 1.211× geomean across 12 cells per rule, with 24/24 selector and direct-correctness checks passing.

The D128 campaign now spells out the resolved register allocation alongside CTA topology: the measured 2CTA baseline is (softmax=176, correction=88, other=72) and the measured 1CTA candidate is (192, 80, 48). These are not new measurements or a changed policy; they are exactly the values the old kernel-side table derived during the archived run, now made explicit so the checked campaign still reconstructs the same two binaries.

The rule is exact SM100 BF16, dense noncausal, D=DV in {64,128}, MHA or packed GQA ratios 4/8/16, packed Q > 256, K≥2048, at least 64 M-blocks, 128×128 tiles, no LSE, and no SplitKV or optional feature path. SM103, FP16/FP8, causal/local, training/Flex, paged, sparse, QV/MLA, gather, modifier, sink, packed-MHA, and underfilled cases keep their previous defaults.

Reproduction and validation

Produced on the B200 machine with:

gpu-run 0 -- python benchmarks/fwd_config_bench.py \
  --campaign benchmarks/configs/fwd_config_b200.yaml \
  --out-dir agent_space/b200_fwd_config/full
  • Hardware: NVIDIA GB200/B200, exact SM100, 152 SMs.
  • Software: PyTorch 2.14.0.dev20260708+cu132, CUDA 13.2, CUTLASS DSL 4.6.0.dev0, driver 580.126.20.
  • Campaign: 144 cells total, 22 unique fake-tensor specializations, four independent correctness representatives, seven alternating rounds × 31 fixed-pointer CUDA-graph samples per arm.
  • The plot generator reads the complete 144-cell result directly and recomputes the displayed aggregates.
  • Holdouts use independent odd lengths and unseen batch/head combinations; every retained discovery, boundary, and holdout cell won.
  • The 64-M-block floor and exact packed-layout predicate keep the production selector inside the measured region.
  • Full raw samples, manifests, excluded controls, final confirmation, environment, validation logs, and checksums are archived at evidence commit 0a9f4dc.

drisspg added a commit that referenced this pull request Jul 27, 2026
Promote two SM100 BF16 output-only regions after explicit-config discovery,
boundary, independent holdout, and config=None confirmation on an NVIDIA GB200
(152 SMs, CUTLASS DSL 4.6.0.dev0):

  policy             cells  geomean [paired-round 95% CI]  weighted    min    max       W/N/L
  D64 direct O          60   1.204x [1.203x, 1.206x]         1.191x  1.171x  1.264x    60/0/0
  D128 1CTA             72   1.206x [1.203x, 1.208x]         1.158x  1.105x  1.560x    72/0/0

Each phase used seven alternating paired rounds with 31 fixed-pointer
CUDA-graph samples per arm. D64 and D128 holdouts contained 20 and 24 cells,
respectively; every retained discovery, boundary, and holdout cell won. The
D64 causal control was rejected at 0.993x geomean with three paired intervals
wholly below 1.0.

A fresh old-explicit-baseline versus config=None confirmation covered 12 cells
per rule (four discovery, four boundary, and four holdout):

  policy             cells  geomean [paired-round 95% CI]  weighted    min    max       W/N/L
  D64 direct O          12   1.208x [1.203x, 1.212x]         1.193x  1.173x  1.261x    12/0/0
  D128 1CTA             12   1.211x [1.201x, 1.220x]         1.162x  1.112x  1.500x    12/0/0

The rules require exact SM100, dense noncausal equal-head BF16, at least 64
M-blocks, K >= 2048, packed Q > 256, MHA or packed GQA ratios 4/8/16, 128x128
tiles, and no SplitKV or optional feature paths. FP16, SM103, causal/local,
LSE-producing and training/Flex, paged, sparse, QV/MLA, gather-KV, modifiers,
sinks, and unmeasured layouts retain their previous defaults.

The intervals propagate paired-round timing variance within the frozen cells;
they measure replay repeatability rather than treating the curated grid as a
random workload sample. Full raw samples, manifests, excluded controls, and
validation logs are archived at evidence commit 0a9f4dc.

stack-info: PR: #2741, branch: drisspg/stack/57
@drisspg
drisspg force-pushed the drisspg/stack/57 branch from 8f859c8 to f771372 Compare July 27, 2026 22:54
@drisspg
drisspg marked this pull request as draft July 27, 2026 23:48
@drisspg
drisspg changed the base branch from drisspg/stack/56 to main July 28, 2026 20:26
@drisspg
drisspg changed the base branch from main to drisspg/stack/56 July 28, 2026 20:27
@drisspg
drisspg changed the base branch from drisspg/stack/56 to main July 29, 2026 01:15
@drisspg
drisspg changed the base branch from main to drisspg/stack/56 July 29, 2026 01:15
@drisspg
drisspg changed the base branch from drisspg/stack/56 to main July 29, 2026 02:40
@drisspg
drisspg force-pushed the drisspg/stack/57 branch from f771372 to 63fe68f Compare July 29, 2026 02:40
@drisspg
drisspg changed the base branch from main to drisspg/stack/56 July 29, 2026 02:40
@drisspg
drisspg changed the base branch from drisspg/stack/56 to main July 29, 2026 03:30
@drisspg
drisspg force-pushed the drisspg/stack/57 branch from 63fe68f to 6dcdbba Compare July 29, 2026 03:30
@drisspg
drisspg changed the base branch from main to drisspg/stack/56 July 29, 2026 03:30
@drisspg
drisspg changed the base branch from drisspg/stack/56 to main July 29, 2026 06:37
@drisspg
drisspg force-pushed the drisspg/stack/57 branch from 6dcdbba to e70f08c Compare July 29, 2026 06:37
@drisspg
drisspg changed the base branch from main to drisspg/stack/56 July 29, 2026 06:38
@drisspg
drisspg changed the base branch from drisspg/stack/56 to main July 29, 2026 16:41
@drisspg
drisspg force-pushed the drisspg/stack/57 branch from e70f08c to 9460987 Compare July 29, 2026 16:41
@drisspg
drisspg changed the base branch from main to drisspg/stack/56 July 29, 2026 16:41
@drisspg
drisspg changed the base branch from drisspg/stack/56 to main July 29, 2026 21:11
@drisspg
drisspg force-pushed the drisspg/stack/57 branch from 9460987 to 5a0b1c7 Compare July 29, 2026 21:11
@drisspg
drisspg changed the base branch from main to drisspg/stack/56 July 29, 2026 21:11
@drisspg
drisspg force-pushed the drisspg/stack/57 branch from 5a0b1c7 to 9069402 Compare July 30, 2026 00:55
@drisspg
drisspg force-pushed the drisspg/stack/56 branch from ad2e8f9 to c6b3100 Compare July 30, 2026 00:55
@drisspg
drisspg force-pushed the drisspg/stack/57 branch from 9069402 to c977015 Compare July 30, 2026 00:58
@drisspg
drisspg force-pushed the drisspg/stack/56 branch 2 times, most recently from 32a98fd to f58455d Compare July 30, 2026 01:16
@drisspg
drisspg force-pushed the drisspg/stack/57 branch from c977015 to 2e26120 Compare July 30, 2026 01:16
@drisspg
drisspg changed the base branch from drisspg/stack/56 to main July 30, 2026 01:36
@drisspg
drisspg force-pushed the drisspg/stack/57 branch from 2e26120 to e3dda2e Compare July 30, 2026 01:37
@drisspg
drisspg changed the base branch from main to drisspg/stack/56 July 30, 2026 01:37
@drisspg
drisspg changed the base branch from drisspg/stack/56 to main July 30, 2026 01:52
@drisspg
drisspg force-pushed the drisspg/stack/57 branch from e3dda2e to 8c21f1a Compare July 30, 2026 01:52
@drisspg
drisspg changed the base branch from main to drisspg/stack/56 July 30, 2026 01:52
@drisspg
drisspg changed the base branch from drisspg/stack/56 to main July 30, 2026 02:04
@drisspg
drisspg force-pushed the drisspg/stack/57 branch from 8c21f1a to b97daee Compare July 30, 2026 02:04
@drisspg
drisspg changed the base branch from main to drisspg/stack/56 July 30, 2026 02:05
@drisspg
drisspg changed the base branch from drisspg/stack/56 to main July 30, 2026 02:48
@drisspg
drisspg force-pushed the drisspg/stack/57 branch from b97daee to 6ad9fc9 Compare July 30, 2026 02:48
@drisspg
drisspg changed the base branch from main to drisspg/stack/56 July 30, 2026 02:49
@drisspg
drisspg changed the base branch from drisspg/stack/56 to main July 30, 2026 03:48
@drisspg
drisspg force-pushed the drisspg/stack/57 branch from 6ad9fc9 to 146cf56 Compare July 30, 2026 03:48
@drisspg
drisspg changed the base branch from main to drisspg/stack/56 July 30, 2026 03:48
@drisspg
drisspg changed the base branch from drisspg/stack/56 to main July 30, 2026 05:16
@drisspg
drisspg force-pushed the drisspg/stack/57 branch from 146cf56 to 82595ec Compare July 30, 2026 05:16
@drisspg
drisspg changed the base branch from main to drisspg/stack/56 July 30, 2026 05:16
Promote two SM100 BF16 output-only regions after explicit-config discovery,
boundary, independent holdout, and config=None confirmation on an NVIDIA GB200
(152 SMs, CUTLASS DSL 4.6.0.dev0):

  policy             cells  geomean [paired-round 95% CI]  weighted    min    max       W/N/L
  D64 direct O          60   1.204x [1.203x, 1.206x]         1.191x  1.171x  1.264x    60/0/0
  D128 1CTA             72   1.205x [1.203x, 1.208x]         1.158x  1.105x  1.560x    72/0/0

Each phase used seven alternating paired rounds with 31 fixed-pointer
CUDA-graph samples per arm. D64 and D128 holdouts contained 20 and 24 cells,
respectively; every retained discovery, boundary, and holdout cell won. The
D64 causal control was rejected at 0.993x geomean with three paired intervals
wholly below 1.0.

A fresh old-explicit-baseline versus config=None confirmation covered 12 cells
per rule (four discovery, four boundary, and four holdout):

  policy             cells  geomean [paired-round 95% CI]  weighted    min    max       W/N/L
  D64 direct O          12   1.208x [1.203x, 1.212x]         1.193x  1.173x  1.261x    12/0/0
  D128 1CTA             12   1.211x [1.201x, 1.220x]         1.162x  1.112x  1.500x    12/0/0

The rules require exact SM100, dense noncausal equal-head BF16, at least 64
M-blocks, K >= 2048, packed Q > 256, MHA or packed GQA ratios 4/8/16, 128x128
tiles, and no SplitKV or optional feature paths. FP16, SM103, causal/local,
LSE-producing and training/Flex, paged, sparse, QV/MLA, gather-KV, modifiers,
sinks, and unmeasured layouts retain their previous defaults.

The intervals propagate paired-round timing variance within the frozen cells;
they measure replay repeatability rather than treating the curated grid as a
random workload sample. Full raw samples, manifests, excluded controls, and
validation logs are archived at evidence commit 0a9f4dc.

stack-info: PR: #2741, branch: drisspg/stack/57
@drisspg
drisspg changed the base branch from drisspg/stack/56 to main July 30, 2026 16:01
@drisspg
drisspg force-pushed the drisspg/stack/57 branch from 82595ec to 111c47b Compare July 30, 2026 16:01
@drisspg
drisspg changed the base branch from main to drisspg/stack/56 July 30, 2026 16:01
@drisspg
drisspg changed the base branch from drisspg/stack/56 to main July 30, 2026 17:14
@drisspg
drisspg changed the base branch from main to drisspg/stack/56 July 30, 2026 17:15
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant