Skip to content

feat(rocke): in-tree sweep and defaults report for gfx950 GDN/KDA decode - #14632

Merged
cgmillette merged 20 commits into
developfrom
users/avirgoel/rocke/gdn-decode-tools
Nov 7, 2026
Merged

cgmillette merged 20 commits into
developfrom
users/avirgoel/rocke/gdn-decode-tools

Conversation

@AviralGoelAMD

@AviralGoelAMD AviralGoelAMD commented Oct 29, 2026 •

Copy link
Copy Markdown
Contributor

ISSUE ID : AICK-2556

Follows #14353 (measured per-mode auto defaults), which has merged. This PR is based on develop and also carries the row-load-order knob (#14720, a separate reviewed PR merged into this branch on Oct 31 as f652bb86125, not into develop); see "The row-load knob" below. develop has since been merged in, and the branch records the golden hashes at every flavor develop records.

What this adds

The gfx950 GDN/KDA decode auto table (AUTO_DEFAULTS) was chosen with a sweep that ran outside the repo, so nobody could repeat it after a kernel or knob change. This PR brings the method in tree: a sweep tool, a report tool, one shared cold-memory timing helper and one fp32 gate. It removes tune.py. No auto selection changes, and no golden hash that develop records changes.

What changed

Area / files Crux of change
benchmarks/gfx950/gdn/decode_table_sweep.py Per decode shape: lists registered configurations, checks each against the fp32 reference, times the ones that pass in cold memory (stage 1 alone, stage 2 interleaved with auto), writes JSON rows. Shards long runs. Fails closed.
benchmarks/gfx950/gdn/decode_defaults_report.py Reads the rows, shows how far auto is from the fastest, proposes a default by the ALGORITHM.md §4.6 rule. Advisory; runs on CPU.
builders/gfx950/gdn/gdn_decode.py One cold-memory timing helper (--rotate-mb) and one NaN-safe fp32 gate, used by the sweep, both benchmarks, --bench and the GPU numeric tests. The tensor code stays here; the gate's pass test and the buffer-set arithmetic are imported from dispatch/gdn/gate_rules.py.
dispatch/gdn/ dispatch_gdn_decode_all / gdn_sweep_space take sweep_level, tuning_sample, seed, as attention does. The argument decides; they no longer follow an ambient level. New stdlib-only cli_args.py holds the shared flag parsers; new stdlib-only gate_rules.py holds the fp32 pass test (Gate, TOL) and the cold-copy-count arithmetic, so they can be tested without torch.
tests, docs, CMake, pyproject New CPU tests for both tools and the helpers; tune.py and its test removed; two console scripts; docs name the new regen path.
  • Coverage is bounded by --sweep-level: production lists waves_per_eu 0 and 4 only; full needs --tuning-sample N and times a random sample per tile.
  • The tools regenerate the evidence for AUTO_DEFAULTS from rocKE's own registry. They do not reproduce any external comparison.

Why it works

The sweep gates every configuration on disjoint read/write slots before timing it, so a wrong or NaN result is never ranked. Timing rotates input buffers so one cycle touches at least 1 GiB; a smaller rotation is labelled partly warm and the report withholds a proposal from it. Every row records the walk, toolchain and source sha, so a proposal can be traced to the run that produced it.

How we validated

Gate Result
GPU (gfx950, ROCm 7.13, Python lowerer) No later than 07db71b5 (the author-run head; its newest commit only adds golden entries, checked on CPU). Commits after it (744ea9b3 to 90fd19df) change the sweep, the report and dispatch/gdn and were run on CPU only, so the results below do not cover them: GDN, fused, KDA and knobs numeric suites, timing, sweep, report, KDA benchmark, golden, load-order, dispatch/gdn (including the new torch-free gate tests) and the tuning template pass with 0 failures. The shipped tools run end to end with exit code 0 and every row ok: sweep stage 1 and stage 2 on a plain and a fused shape, the report on those rows, both benchmarks (one with --sweep-tiles) and --bench. A gate forced to pass makes the verdict tests fail, and a gate forced to fail makes the sweep and the benchmark exit non-zero with nothing timed. An earlier head also passed a --bases-only run, a production --shard and a full sample on kda fused f32 32/32.
CPU GDN/KDA dispatch, sweep, report, timing, tuning-template and layering suites pass at 90fd19df, with and without torch installed. The pass test, the rotation sizing and what the sweep and both benchmarks do with a failing verdict are tested without torch, so they run in CI; the tensor reductions inside gate() run only where torch is installed (no CI lane has it). The earlier Windows-lane fix stands (a usage error prints the file path as given, not its repr; the tests use a backslash path so they also fail on Linux with the old text).
IR / ABI No default change: with the knob at its default the kernel name and IR are unchanged, and no golden hash that develop records changes (0 of 1,173 differ; 192 entries are added, all knob_row_loads_*). The golden file gains entries only: the 48 knob_row_loads_* cases of the row-load knob, recorded at llvm20, llvm22 and llvm23, are also recorded at llvm24, the flavor develop records. The knob's own entries were re-recorded at d656a266cd7 (188 of the 192), after develop's lowering change in #13652 moved their hashes; the golden test passes with them at that commit on CPU. The C++ parity test (library/tests/test_gdn_decode_ir_cpp_parity.py, 341 cases per flavor, 48 of them knob_row_loads_*, at llvm20, llvm22, llvm23 and llvm24) passed at 5f0837ff with rocke_engine built from platform/cpp/bindings; it is not registered in a CI lane and skips where the engine is not built.
Review rocKE checklist graded on the review-response diff (every section, A to J, every item); the sections that cover the final delta of tests and comments (C, E, G) were re-graded on it. It predates the commits after 07db71b5, which are not re-graded. The Nov 6 automated checklist review at 3e6822d1 lists 4 HIGH, 3 MEDIUM and 1 LOW; each is being answered on its thread.

The row-load knob

The branch also contains the row_loads spec field from #14720 (auto, first or late). It adds no kernel by default: only a forced order changes the kernel name (a tag) and its IR. Against develop this adds 48 golden cases per flavor (the forced orders, plus their auto twins, whose IR matches the pre-knob emitter), the knob's axis in the GDN tuning space, and the matching support in the shared tuning template.

Tuning ids. row_loads joins the GDN spec defaults, so the config_key of every GDN decode configuration changes; only the readable stem before @ is unchanged. No GDN tuning_id is stored in this tree. A stored id from before this PR is refused with PinRefused; the refusal reports the old id and the candidate's current default, and never substitutes it. The migration path is to re-sweep and validate before publishing new ids; a downstream tuning store should drop its old GDN ids. TUNING_ID_VERSION is not bumped: the defaults fingerprint already separates the old and new ids, as for gfx942 dense attention (library/dispatch/AGENTS.md).

Notes

  • Not changed or not measured here: the in-tree sweep has not been run end to end for every AUTO_DEFAULTS case, and gfx942 is out of scope.
  • Measured results stay in the internal performance record; this PR makes no performance claim.
  • The comparison harness for the external-baseline table in perf(rocke): measured per-mode defaults for gfx950 GDN/KDA decode #14353 is still out of tree.

Base automatically changed from users/avirgoel/rocke/gdn-decode-defaults to develop October 29, 2026 16:27
@therock-pr-bot

therock-pr-bot Bot commented Oct 29, 2026 •

Copy link
Copy Markdown

✅ All Checks Passed — Ready for Review

Check Status Details
📝 PR Description ✅ Pass —
⛔ Forbidden Files ✅ Pass —
🧪 Unit Test ✅ Pass —
🔎 pre-commit ✅ Pass —
🚫 Draft PR 🔜 To Be Enabled —
🚩 Feature Flag 🔜 To Be Enabled —
📊 Code Coverage 🔜 To Be Enabled —
🤖 therock-pr-bot ✅ Pass —

🎉 All checks passed! This PR is ready for review.

📖 Need help? See the Policy FAQ for details on every check and how to fix failures.

🙋 Wish to Override Policy?

@therock-pr-bot

therock-pr-bot Bot commented Oct 29, 2026 •

Copy link
Copy Markdown

🎉 All checks passed! This PR is ready for review.

@AviralGoelAMD AviralGoelAMD self-assigned this Oct 29, 2026
@AviralGoelAMD
AviralGoelAMD force-pushed the users/avirgoel/rocke/gdn-decode-tools branch from 6b7d577 to d9e5b7a Compare October 29, 2026 17:46
@AviralGoelAMD
AviralGoelAMD marked this pull request as ready for review October 29, 2026 17:46
@AviralGoelAMD
AviralGoelAMD requested review from a team as code owners October 29, 2026 17:46
@AviralGoelAMD
AviralGoelAMD requested a balanced review from Copilot October 29, 2026 20:14

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot was unable to review this pull request because the user who requested the review has insufficient remaining quota.

@cgmillette

Copy link
Copy Markdown
Contributor

Automated review: Model - qwen3.6:35b-a3b-coding-mtp-q4_K_M, effort: max

PR #14632 — in-tree sweep and defaults report for gfx950 GDN/KDA decode (AviralGoelAMD, AICK-2556) — 🔴 First-round: blocking — the two new missing-file tests fail on both Windows gfx110X shards (the tools print the path repr-quoted); the rest checks out

Prior item Status
Reviewers 🟢 None yet: no human reviews or threads; Copilot (10-29 20:14Z) could not review (quota)
AviralGoelAMD (body, 10-29): no kernel, golden hash or auto default change; the CPU suites pass; the GPU suites pass at this head (author-run, gfx950) 🟢 No-change claim confirmed. Nothing under library/kernels/ or platform/python/ changes and no golden file changes. The AUTO_DEFAULTS rows are untouched (the axes.py edits are comments). The host driver's launch geometry moves verbatim into launch_config() (gdn_decode.py:601) (read). On the merge, the differential golden shows 0 changed and 0 missing (ran), and the three golden lanes pass on all four CI shards (read: CI logs). The CPU claim holds on Linux only (N1). The gate and timing tests need torch, so CI never runs them (N2). The GPU suites are author-run: CI has no gfx950 test job
Bots / CI 🔴
• Policy bot pass (10-29). At head d9e5b7a6: pre-commit, Component CI, both hipDNN superbuilds, the Multi-Arch ASAN summary and base freshness pass. The red Multi-Arch CI Summary comes from the Windows shards.
• Linux gfx94X hipkernelprovider, shards 1/2 and 2/2: 49/49 each, finished 23:20–23:22Z. rocke_library_gdn_pytest: 826 passed, 347 skipped, including the two tests below.
• Windows gfx110X, shards 1/2 and 2/2 (attempt 1): rocke_library_gdn_pytest fails this PR's own test_unreadable_or_non_schema_inputs_are_usage_errors and test_unreadable_or_non_sweep_input_is_a_usage_error; the other 824 GDN tests pass (N1).
• Shard 1/2 also fails rocke_pytest and rocke_library_conv_pytest, but not because of this PR. Each hit the 60 s per-test limit: test_hip_device_properties_layout waiting on its compile subprocess, and test_smallc_is_served_from_the_cache opening a kernel-cache JSON. This PR touches neither, and both lanes pass on shard 2/2 and on Linux at this head.
• The 23:26Z re-run (attempt 2) stopped in setup on both Windows shards before any test ran: Chocolatey's ninja download returned HTTP 429. N1 fails on every Windows run, so a re-run cannot clear it (read: CI logs)
Our checks 🟢
• Merge (ran): clean with develop 3866fb55 (18 behind, 1 ahead; merge 342ea9f0). Native build OK, ctest 33/33 (1 skip). Differential golden OK at llvm20/22/23/24 and canonical: 0 changed and 0 missing. Its 180 NEW are develop's own, since this PR emits no IR. The PR's 10 remaining test files on CPU: 274 passed, 7 skipped. Rules 1–3 clean: the one perf-pattern hit is a mocked value inside a test, not a measurement. The added lines and the commit message carry no tracker IDs, timings or product names.
• Dispatch API (ran): called with no arguments, dispatch_gdn_decode_all and gdn_sweep_space list the same configurations on develop and at head. The probe covered 72 GDN/KDA requests (plain and fused, three state dtypes, two batches, three head pairs): 274,176 rows, identical digests. The new keywords default to production, which was the old ambient default. Develop's only ambient-level user was test_tuning_contract.py (with sweep_level("full")). It now passes sweep_level=, and :555 pins that the argument wins over an ambient level. No other caller exists at head, on develop or on the merge, and the new sweep passes all three keywords (ran: git grep).
• tune.py removal (ran: git grep): nothing at head or on the merge still imports, documents or enrolls it. Develop's only importer, benchmark_kda_decode.py, is rewritten here. The CMake GDN lane drops its test and enrolls the four new test files plus test_kda_decode_benchmark.py, which was in no lane before. Both console scripts point at packaged modules (benchmarks* is in packages.find).
• Sweep safety (read): both stages time a configuration only after gate(...).passed (decode_table_sweep.py:937, called at :1003 and :1038). A configuration that fails is recorded as a gate failure and never timed. passed needs every error to be finite and within TOL, and no write to a slot the kernel was not told to write. The errors fold through nan_safe_max (gdn_decode.py:680), so a NaN cannot hide behind a finite error. That also closes a hole in the old check(), whose plain max() dropped a NaN state error. cold_copies (:790) uses at least 2 buffer sets, enough for one cycle to reach the --rotate-mb target (default 1 GiB). It counts touched bytes low, so it errs colder. A smaller rotation is labelled partly warm, and the report withholds its proposal from warm or mixed rows. Any failed, raised or untimed row fails the run; CI runs those fake-driver tests
# Sev file:line Finding
N1 🔴 benchmarks/gfx950/gdn/decode_table_sweep.py:1504, :1510, :1516; decode_defaults_report.py:446 Problem: both tools report an unreadable input with ap.error(str(exc)). For an OSError, str(exc) embeds repr(filename), and on Windows repr doubles every backslash. The new tests assert str(path) in stderr (test_gdn_decode_table_sweep.py:769, test_gdn_decode_defaults_report.py:311), so the missing-file case fails on Windows. The $ in the runner's temp dir plays no part. The JSON and schema errors embed {path} directly and are unaffected.
Consequence: rocke_library_gdn_pytest fails on both Windows gfx110X shards at this head, and after merge it would fail on every Windows run. Each test stops at its first case, so CI shows only --summarize and the report's input, but --stage1-json and --shapes fail the same way. A probe called both tools' main() with a missing backslash path: all four entry points fail the tests' check. With a / path containing $, all four pass (ran). Windows users also see the doubled backslashes.
Fix: catch OSError on its own and print the path as given, for example ap.error(f"{exc.filename}: {exc.strerror}"), at the four sites (or in one cli_args.py helper). Keep the tests as they are; the probe shows that message contains the raw path in both path styles
N2 🟡 tests/test_gdn_decode_timing.py:19, test_gdn_decode_table_sweep.py:662, test_kda_decode_benchmark.py:92 Problem: every test that drives the real fp32 gate or the rotation sizing needs torch. That covers the whole timing module (the rotation guarantee, the warm labels, a NaN state failing check(), both benchmarks and --bench), the gate test for a kernel that reads its write slot, and the KDA benchmark's NaN test. CI has no torch, so all four hipkernelprovider shards skip them ("could not import 'torch'"), as the new comment at platform/CMakeLists.txt:743 says (read: CI logs).
Consequence: the PR's main claim, that a wrong or NaN result is never ranked, is author-run only. CI covers only nan_safe_max and the flows on a fake driver, so a later edit to Gate.passed, gate() or cold_copies can break the claim while CI stays green.
Fix: move Gate and the copy-count arithmetic of cold_copies into the torch-free cli_args.py, and test NaN, inf, over-TOL, spill and the rotation sizes there

Utility: 🟢 Positive — in-tree, fail-closed sweep makes gfx950 GDN/KDA defaults reproducible; nothing shipped changes.


Legend: 🔴 blocking · 🟠 should-fix · 🟡 minor nit · 🟢 info/good · ⚪ retracted

First-round review: a local qwen3.6 model made the independent first pass, and the orchestrator (Claude Opus 5.5) verified it. On a clean merge with develop, it ran the native build and ctest, the differential golden checks and the PR's 10 test files on CPU. It read all six Windows and Linux hipkernelprovider job logs at head. It reproduced the Windows failure on Linux with a probe that calls both tools with a backslash path. It also compared the no-argument GDN dispatch listing on develop and at head, and searched head, develop and the merge for callers of the changed API and for tune.py. GPU behaviour is author-run. The orchestrator owns this merge-worthiness call. It flags whether a closer look is needed; it is not an approval or a rejection.

@cgmillette

Copy link
Copy Markdown
Contributor

Automated review: Model - qwen3.6:35b-a3b-coding-mtp-q4_K_M, effort: max

PR #14632 — in-tree sweep and defaults report for gfx950 GDN/KDA decode (AviralGoelAMD, AICK-2556) — 🟡 Follow-up: our 🔴 is fixed — usage errors now print the path as given at all four sites, and the PR's tests pass when replayed with the Windows runner's own path (ran); the Windows gfx110X shards have not run at this head yet, and our N2 torch-coverage nit is still open

Prior item Status
Reviewers 🟢 None yet: no human reviews, threads or replies since our first round; Copilot (10-29 20:14Z) could not review (quota). Reviews are requested from rocke-lib and rocke-platform (read: gh)
Ours (10-29) N1 🔴: ap.error(str(exc)) repr-quotes the path, so both Windows gfx110X shards fail the missing-file tests 🟢 FIXED 3142f9c4 — fixed at all four sites, as proposed.
• Code (ran: git diff): decode_table_sweep.py:1505, :1511, :1517 and decode_defaults_report.py:447 now call ap.error(usage_error_text(exc)). The new shared helper (cli_args.py:56) prints an OSError that names a file as path: reason, with the path as the tool opened it: the argument as given, or the file a glob matched. Any other error keeps str(exc), and the JSON and schema errors still embed {path} directly. No file-reading ap.error(str(exc)) is left; the only other parser.error(str(exc)) in the PR's tools (benchmark_kda_decode.py:382) reports a bad --variants value (ran: grep).
• Windows simulation (ran: probe on the merge): we replayed the PR's own tests without pytest, with a tmp_path whose directory name is the Windows runner's temp dir from the failed log (C:\Windows\Temp\pytest-of-<runner>$\pytest-3: backslashes and $). The two original missing-file tests, the four new backslash cases and the helper's unit test pass 7/7. Given the exact path from the failed log, the four entry points (--summarize, --stage1-json, --shapes and the report's input) exit 2 and print it as given (4/4). As a control, with the old str(exc) patched back in, all 7 replays and all 4 entry points fail, reproducing the Windows failure.
• Tests (ran): on the merge, test_cli_args.py, test_gdn_decode_table_sweep.py and test_gdn_decode_defaults_report.py give 216 passed, 1 skipped (torch). The new tests build a backslash path on every OS, so a regression now fails the Linux lanes too, as the control shows. All three files are in the GDN lane's list (platform/CMakeLists.txt:753, :754, :759), which runs on every hipkernelprovider shard (read).
• Not yet proven in CI: the Windows gfx110X shards have not run at this head (see Bots / CI)
Ours (10-29) N2 🟡: every test of the fp32 gate and the rotation sizing needs torch, so CI skips them 🟡 OPEN — unchanged, no reply. The push touches none of N2's files. Gate, gate() and cold_copies are still in the torch module (gdn_decode.py:668, :698, :779). The timing module and the KDA benchmark's NaN test still importorskip("torch") (read), and the write-slot gate test (test_gdn_decode_table_sweep.py:662) skips in our run as in CI (ran). So the "never ranked" claim is still author-run only → as proposed, move Gate and the copy-count arithmetic of cold_copies into the torch-free cli_args.py and test them there
AviralGoelAMD (body, 10-30): the last commit changes only CLI error text and CPU tests, not re-run on GPU 🟢 Confirmed. The push touches no builder, kernel, selection, golden, CMake or doc file (see Our checks), so the author's GPU runs at d9e5b7a6 still cover every GPU path. The no-change claim still holds: the differential golden shows 0 changed (ran)
Bots / CI 🟡
• At head 3142f9c4 (force-pushed 01:30Z): the policy bot, pre-commit, clang-tidy, Component CI, the Multi-Arch ASAN summary, base freshness and both hipDNN superbuilds (Linux, Windows) pass. The one cancelled check is a duplicate Libraries PR Bot run, stopped within 10 s; its twin passed.
• TheRock Multi-Arch CI is still running at 02:38Z. Math-libs for Linux gfx94X, gfx950 and gfx125X are built, and the Linux gfx94X hipkernelprovider shards 1/2 and 2/2 started at 02:37Z. The Windows gfx110X math-libs stage is still building (since 01:56Z), so the two Windows hipkernelprovider shards, where N1 failed, have not started. gfx950 and gfx125X run no test shard on PR CI. No CI proof of the fix yet; the evidence so far is the probe and the Linux runs above.
• GitHub: BLOCKED (no approval yet, CI still running); auto-merge off (read: gh)
Our checks 🟢
• The push (ran: git): 3142f9c4 amends the single commit on the same base 8f987da1, with the same commit message, so there is no rebase to separate out. Exactly 6 files differ from d9e5b7a6 (+59/−10): the four call sites, the helper and its docstring in cli_args.py, and three CPU test files. Its added lines carry no links, tracker IDs or timings.
• Merge 6c1518af (head + develop 587f9942; 22 behind, 1 ahead, 0 conflicts): native build OK and ctest 33/33 (1 skip); differential golden OK at llvm20/22/23/24 and canonical (0 changed, 0 missing; the unblessed NEW configs are develop's own, since this PR emits no IR); the PR's 10 remaining test files on CPU: 279 passed, 7 skipped (ran).
• Develop since our first round: 4 commits. Only d730d162 (docs) touches rocke/, and none touches this PR's files. On the merge, nothing imports tune.py, and every caller of dispatch_gdn_decode_all / gdn_sweep_space is either the PR's own or a no-argument call (ran: git grep).
• Rules 1–3: no tracker IDs or environment reads. The one perf-pattern hit is a fake timing fixture in an output-format assertion (test_kda_decode_benchmark.py:217), not a measurement; it is unchanged since our first round (ran)

Net-new: none.

Utility: 🟢 Positive — in-tree, fail-closed sweep makes gfx950 GDN/KDA defaults reproducible; nothing shipped changes.


Legend: 🔴 blocking · 🟠 should-fix · 🟡 minor nit · 🟢 info/good · ⚪ retracted

Follow-up review: a local qwen3.6 model made the independent first pass, and the orchestrator (Claude Opus 5.5) verified it. It diffed the amended commit against d9e5b7a6 file by file. A probe on the merge replayed the PR's missing-file tests with the Windows runner's temp path from the failed log, once with the fix and once with the old message builder as a control, and called all four entry points with that path. On a clean merge with develop, it ran the native build and ctest, the differential golden checks, the PR's test files on CPU (plus a second run of the three CLI test files) and the rule scan. It searched the merge for tune.py and for callers of the changed API. CI at head and the GitHub activity since our first round were read. GPU behaviour is author-run. The orchestrator owns this merge-worthiness call. This review flags whether a closer look is needed; it is not an approval or a rejection.

@cgmillette

Copy link
Copy Markdown
Contributor

Please address remaining open items for approval

@CongMa13

Copy link
Copy Markdown
Contributor

I reviewed this PR again. The following review threads are still unresolved, or comments have no author reply:

If you have already fixed these, please reply on each comment to say so and resolve the threads.

The method that chose the gfx950 GDN/KDA decode AUTO_DEFAULTS ran out of
tree. This brings it in as two tools, puts every GDN/KDA decode timing
and correctness tool on one cold-memory helper and one fp32 gate (the GPU
numeric tests use that gate, except where a test injects a fault,
compares two launches, needs a relative state error, a skip lane the
gate does not model, or a pool too large to copy), and retires tune.py.
No kernel, golden hash or
default changes.

- benchmarks/gfx950/gdn/decode_table_sweep.py (rocke-gdn-decode-table-
  sweep): per decode shape (gate kind, plain / fused, state dtype, Hk/Hv,
  head dim, batch; from flags or --shapes FILE) it walks
  dispatch_gdn_decode_all, gates every configuration once against the
  fp32 reference on disjoint read / write slots (output, written state
  and conv-state slots, untouched slots bit-exact) and times it cold on
  in-place slots. Stage 1 times each configuration on its own; stage 2
  re-times the --top-k fastest plus auto together, interleaved, order
  alternating per round and per run, --runs runs, the median of the run
  medians. auto is always timed. --stage1-only, --bases-only,
  --tuning-ids, --sweep-level / --tuning-sample / --seed, --shard I/N,
  --offset / --limit, --stage1-json (stage 2 from saved rows, --shard
  splitting shapes), --list-only, --output-json (rows carry shape,
  spec_id, tile, tuning_id, knobs, status, errors, median, run medians,
  sha, device, toolchain), --summarize. The sweep covers every registered
  configuration at --sweep-level only: production lists waves_per_eu 0
  and 4; full needs --tuning-sample N, times a random sample per tile and
  refuses --bases-only (a sample keeps only the bases it draws).
  It fails closed: any row of any stage that failed, raised or could not
  be timed, and a run that times nothing, fail the run and --summarize; a
  --tuning-ids entry the walk does not list or an empty list, a
  stage-2-from-files shape with no timed row or stage-1 rows of different
  walks, conflicting or empty --shapes keys and flags a mode would ignore
  are errors, as is an unreadable or malformed input file (bad row
  keys or values exit 2 naming the row). decode_shapes.json holds
  the shape grid ALGORITHM.md section 4.6 documents for each
  AUTO_DEFAULTS case.
- benchmarks/gfx950/gdn/decode_defaults_report.py (rocke-gdn-decode-
  defaults-report): from those rows, per case, auto and the proposal
  against each shape's fastest configuration, auto's score and worst
  shape, and the proposal by the AUTO_DEFAULTS rule (score, near-tie on
  worst shape, fewer non-default knobs, score), naming the step that
  decided, with a ready-to-paste AUTO_DEFAULTS row and a re-time line:
  the stage-1 walk flags and a --tuning-ids shortlist (top candidates,
  the proposal, each shape's fastest). A shape with no timed row or a
  failing auto is listed and fails the report. Rows not timed in cold
  memory or with mixed --rotate-mb fail it and withhold every proposal;
  a case whose rows come from different walks is withheld alone. It
  prints the walk and the toolchain the rows were swept with. Advisory:
  it changes nothing.
- builders/gfx950/gdn/gdn_decode.py: one cold-memory timing helper
  (cold_value_sets, cold_copies, capture_cold / ColdGraph, device_us,
  eager_us, timing_label, ROTATE_MB): buffer sets rotated so one cycle
  touches at least --rotate-mb MiB (a set is reused after at least that
  less one set), HIP-graph median; --rotate-mb 0, or below the 1 GiB
  cold target, is labelled warm; a
  capture failure keeps its cause. One fp32 gate (reference, gate,
  gate_launch; check() returns its verdict, disjoint_writes included)
  that a NaN in the output or the state cannot pass.
  benchmark_gdn_decode.py, benchmark_kda_decode.py and gdn_decode.py
  --bench gate and time through them and take --rotate-mb; the GPU
  numeric tests assert the same verdict. benchmark_kda_decode.py keeps
  loading torch and the driver only when it runs, so its CPU paths
  import without them.
- dispatch/gdn/cli_args.py (stdlib only): the --batches and --rotate-mb
  parsers, the NaN-safe max and the fastest-row order, shared by the
  tools, both benchmarks and gdn_decode.py.
- dispatch/gdn/gate_rules.py (stdlib only): the rules gdn_decode.py's
  tensor code feeds, so they run without torch: the fp32 pass test (Gate,
  TOL: finite, within TOL, no spill) behind gate(), and the buffer-set
  count (cold_copy_count, touched_bytes_of) behind cold_copies() and
  touched_bytes(). The driver keeps the tensors and imports both; its
  behaviour is unchanged.
- dispatch_gdn_decode_all / gdn_sweep_space take sweep_level,
  tuning_sample and seed, as attention's iter_dispatch_attention_all.
  The argument decides: they no longer follow a caller's ambient sweep
  level (default production; no in-tree caller relied on it).
- tune.py and its tests are removed, and the installed GDN CTest entry
  runs the new tools' CPU tests instead. benchmark_kda_decode.py
  --sweep-tiles now runs the sweep's stage 1 on every tile's base
  configuration plus auto. README, ALGORITHM.md section 4.6 (the regen
  path and the tie band) and section 8 (the in-tree sweep follow-up is
  done), axes.py and dsl_docs/instances/gdn.md name the new regen path.

Tests: CLI parsing and every refusal, shard / offset / limit partitions,
stage-2 picks and interleaving order, median aggregation, stage flows on
a fake driver, a stage-1 failure failing the run after stage 2 (one
process and --summarize), a kernel reading its write slot rejected by
the gate, unknown --tuning-ids, stage 2 from files with nothing timed,
JSON round trip, summary, every step of the rule and a case where it
differs from every shape's best, unscored shapes, the re-time line, the
printed rows rebuilding every shipped default, the rotation guarantees,
the warm warning, the gate, and a NaN state behind a finite output
failing check(), both benchmarks and --bench. Without torch (as in CI):
the pass test (NaN in each slot and behind finite errors, inf, over TOL,
a spill at zero error), the rotation sizing (at least two sets, a cycle
reaches --rotate-mb, warm measures nothing), the touched-byte count, the
driver delegating instead of keeping a copy and using no undefined name,
and the sweep and both benchmarks never timing or ranking a launch that
fails the gate.
@AviralGoelAMD
AviralGoelAMD force-pushed the users/avirgoel/rocke/gdn-decode-tools branch from 3142f9c to 7436d04 Compare October 30, 2026 17:35
@AviralGoelAMD

Copy link
Copy Markdown
Contributor Author

@cgmillette Thanks. N2 is addressed in 7436d045f77.

  • The fp32 pass test (Gate, TOL) and the buffer-set arithmetic behind cold_copies and touched_bytes now live in a stdlib-only dispatch/gdn/gate_rules.py. The driver keeps the tensor code and imports them.
  • CI (no torch) now runs tests for: NaN in each error slot and behind finite errors, inf, over TOL, and a spill at zero error; the rotation sizing (at least two sets, one cycle reaches --rotate-mb, warm measures nothing); and what the sweep and both benchmarks do with a failing verdict (never timed or ranked, and the run fails). Mutating each rule fails the intended test.
  • One part stays torch-only: the tensor reductions inside gate(). CI cannot run those. They run where torch is installed and in the GPU numeric suites, and the README and CMake comment say so.
  • The branch is also rebased onto current develop. The only conflict was platform/CMakeLists.txt.
  • The GPU suites and the shipped tools (sweep, report, both benchmarks, --bench) were re-run on gfx950 at this head: all pass. A gate forced to pass makes the verdict tests fail, and a gate forced to fail makes the sweep and benchmark exit non-zero with nothing timed.

The Windows shards have not run at this head yet.

@AviralGoelAMD
AviralGoelAMD enabled auto-merge (squash) October 30, 2026 19:13
@cgmillette

Copy link
Copy Markdown
Contributor

Automated review: Model - qwen3.6:35b-a3b-coding-mtp-q4_K_M, effort: max

PR #14632 — in-tree sweep and defaults report for gfx950 GDN/KDA decode (AviralGoelAMD, AICK-2556) — 🟡 Follow-up: N2 fixed, CI running

Prior item Status
Reviewers 🟢 None yet
• no approval yet; rocke-lib, rocke-platform requested
• Copilot (10-29): quota, no review
Our 10-29 N1 🔴: Windows repr-quoted paths fail missing-file tests 🟢 FIXED 7436d045
• fix sites unchanged since 3142f9c4 (ran: git diff)
• Windows gfx110X shards passed both tests at 3142f9c4 (read: CI logs)
• lane now Linux-only (develop PR 14710); backslash cases still run
Our 10-29 N2 🟡: gate and rotation tests need torch, CI skips 🟢 FIXED 7436d045
• Gate, TOL, copy count now stdlib gate_rules.py; tensor reductions still torch (read)
• no torch: 59 ✓ + 20 verdict tests ✓; 3 rule mutants caught (ran)
• GDN lane enrolls them (CMakeLists.txt:782); first CI run pending
cgmillette, CongMa13 (10-30): reply to our open items 🟢 Answered
• author replied 18:16Z: N2 done, nothing else open
AviralGoelAMD (10-30): GPU suites and tools re-run at head 🟢 Reviewed
• no kernel, golden or default change: golden 0 changed (ran)
• torch on CPU: driver tensor tests 41 ✓ (ran); GPU runs author-reported
Bots / CI 🟡 running
• 22 ✓ · 4 running · 0 ✗; 2 PR Bot runs cancelled, latest ✓
• running: Multi-Arch math-libs; hipkernelprovider shards not started
• merge: blocked (no approval); auto-merge on (author, 19:13Z)
Our checks 🟢 Clean
• merge vs 8c41584a: clean, 8 behind (ran)
• build + ctest 33/33 (1 skip); differential golden 0 changed (ran)
• PR tests 358 ✓ / 7 skip (torch, GPU); rules 1–3 clean (ran)

Net-new: none.

Utility: 🟢 Positive — in-tree, fail-closed gfx950 GDN/KDA defaults sweep; gate rules now torch-free.


Legend: 🔴 blocking · 🟠 should-fix · 🟡 minor nit · 🟢 info/good · ⚪ retracted

Follow-up review: first pass by a local qwen3.6 model, verified by the orchestrator (Claude Opus 5.5). Checks: range-diff vs 3142f9c4, merge with develop, build + ctest, differential golden, PR tests without torch, gate-rule mutants, torch CPU tests, CI at head. Flags whether a closer look is needed; not an approval or rejection.

@cgmillette cgmillette left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

The defaults report merged timings of one case, shape and tuning_id taken at
different source shas, although a tuning_id does not identify the code. It now
withholds the proposal when the scored rows mix shas.

Stage 2 of the sweep let a replay failure escape before its rows were marked
or its graphs and value sets were closed. A failing replay now marks the run's
rows ERROR, every cleanup step is tried, and a failed cleanup marks the
affected rows ERROR so the sweep exits non-zero.
@therock-pr-bot

therock-pr-bot Bot commented Nov 2, 2026

Copy link
Copy Markdown

Pre-commit check failed

⛔ pre-commit failed

Please run locally:

  • python -m pip install pre-commit
  • pre-commit install
  • pre-commit run --all-files --show-diff-on-failure

This repo uses .pre-commit-config.yaml.

…by sha and compiler

Stage 2 from --stage1-json stamped its own sha, toolchain and rotation on
every row, so the report never saw what ranked the shortlist: stage-1 shards
from different commits, nodes or a --rotate-mb 0 debug run reached it as
clean stage-2 rows. It now refuses stage-1 rows of more than one build, warm
or mixed-rotation rows, and rows ranked by another build than the run that
re-times them (--source-sha skips only the sha comparison).

A build is the source sha with llvm_version, llvm_flavor and backend, which
the report now withholds on: at one sha another LLVM or lowering backend is
another binary under the same tuning_id. The -dirty marker is a hash of
git diff HEAD plus the untracked .py files, so two different edits on one
commit are two shas and a new unadded module marks the tree dirty.

The README names the new withhold and refusal rules.
retime reloads the stage-1 files, so main's earlier check validated another
snapshot and a direct retime call accepted rows from an old sha or compiler.
retime now checks the snapshot it loads against its meta; main maps the
ValueError to a usage error (exit 2).
@cgmillette

Copy link
Copy Markdown
Contributor

Automated review: Model - qwen3.6:35b-a3b-coding-mtp-q4_K_M, effort: max

PR #14632 — in-tree sweep and defaults report for gfx950 GDN/KDA decode (AviralGoelAMD, AICK-2556) — 🔴 Follow-up: knob goldens need re-record

Prior item Status
Earlier rows: our 10-29 N1, N2; 10-30/31 replies; knob squash 🟢 FIXED, carried
• the 11-02 commits keep both fixes (ran: git diff)
• gate and CLI tests ✓ in CI at head (read: logs)
cgmillette (10-30) APPROVED at 7436d045 🟢 APPROVED 7436d045
• older head; still counts on develop
• predates 14720's knob code and the 11-02 fixes
• rocke-lib code-owner review still missing (read)
Our 10-31 N1 🟡: body tracks the head 🟡 OPEN again
• body unedited since 11-01 (read)
• says the golden test passes; GPU row predates the 11-02 code
Our 10-31 N2 🔴: 48 knob_row_loads_* cases lack llvm24 🟢 FIXED 07db71b5
• all 4 flavors recorded, 341 cases each (ran)
• their hashes now predate develop's 13652: N1
CongMa13 (11-02) ×2: stage-2 replay failures; mixed-sha scoring 🟠 OPEN, valid: 3 sites left
• replay and its cleanup → ERROR rows, 744ea9b3 (ran)
• failing drain/release at decode_table_sweep.py:1037, :1040, :1061 still escapes; rows lost (ran)
• mixed shas withheld, widened to builds in 34d4bd6f (ran)
dlangbe (11-02) ×2: stage-1 provenance bypass; dirty-sha and toolchain mixes 🟠 OPEN, valid: one gap
• refusals, build key, dirty hash, README: 34d4bd6f, 72c8fc1d (ran)
• --source-sha skips the sha check instead of supplying it (ran)
• fix: compare the given sha (:1338); test :1178 pins the skip
Bots / CI 🔴 Failing
• fails: gfx94X hipkernelprovider ×2 — GDN golden drift (N1), so Multi-Arch CI Summary (read: logs)
• 42 ✓ · 3 ✗ · 50 skipped; pre-commit ✓ since 3f8e3ca2
• merge: blocked (code-owner review, CI); auto-merge off
Our checks 🔴 Fails: GDN golden
• merge vs cee1e23b: clean, 8 behind (ran)
• build + ctest 34 ✓ / 1 skip; parity, golden gate, differential ✓ ×4 (ran)
• tests: GDN golden ✗ (N1); 1 ✗ = issue 14736, develop too; GDN C++ = Python IR ✓ (ran)
Code quality 🟠 Should-fix
• DRY: comparability rules in 3 places (N2); GDN facts restated (N3) (ran)
• --source-sha skips a check; cleanup covers 1 of 4 sites (rows above) (ran)
• good: knob has one home; fixes have failing-first tests (ran)
# Sev file:line Finding
N1 🔴 library/tests/golden/gdn_decode_gfx950_ir_sha256.json 47 knob cases per flavor keep their pre-13652 hashes
• impact: GDN golden test fails at head and on the merge; required CI red
• fix: from rocke/: python3 library/tests/test_gdn_decode_golden.py --write; only those 188 entries change, then 7 ✓ (ran)
N2 🟠 gdn/decode_table_sweep.py:830, :1300; gdn/decode_defaults_report.py:403 One comparability rule set is coded in 3 places; summarize() has drifted
• impact: --summarize ranks mixed builds or rotations, exit 0, no warning (ran)
• fix: one comparability_problems(rows) for report, stage 2 and summarize; fix :381's "withholds nothing" (ran)
N3 🟠 gdn/decode_table_sweep.py:81, :179 Sweep restates the kernel's STATE_DTYPES and dispatch's fused rule
• impact: a new state dtype or one-flag mode is skipped or mis-keyed silently
• fix: import STATE_DTYPES; auto_key via an auto_case(req) split from auto_default (ran)

Utility: 🟢 Positive — repeatable in-tree GDN/KDA defaults sweep, replacing an out-of-tree method.


Legend: 🔴 blocking · 🟠 should-fix · 🟡 minor nit · 🟢 info/good · ⚪ retracted

Follow-up review: first pass by a local qwen3.6 model, verified by the orchestrator (Claude Opus 5.5). Checks: range-diff vs 07db71b5, both develop merges, GDN decode golden at head (re-record vs CI's hashes, 13652 reverted as a control), GDN C++/Python IR parity, the new tests on the pre-fix code, merge with develop, build + ctest, parity, goldens, PR tests, CI logs at head, code quality. Flags whether a closer look is needed; not an approval or rejection.

@CongMa13

CongMa13 commented Nov 3, 2026

Copy link
Copy Markdown
Contributor

I reviewed this PR again. The following review threads are still unresolved, or comments have no author reply:

If you have already fixed these, resolve each thread or reply with a clear statement that it is addressed.

@AviralGoelAMD
AviralGoelAMD enabled auto-merge (squash) November 3, 2026 20:04
@cgmillette
cgmillette disabled auto-merge November 3, 2026 23:25
@cgmillette

cgmillette commented Nov 3, 2026 •

Copy link
Copy Markdown
Contributor

Please fix high sev review feedbacks first. These are develop breakages.

…op's knob lowering change

The row-load knob cases kept hashes taken before develop changed the knob
lowering, so the GDN decode golden test failed at head and on the merge. Only
the knob_row_loads entries change (47 cases x 4 flavors); no kernel source
changes in this PR.
…, share the dispatcher's case

- Stage 1's per-row drain and release, and stage 2's per-pick drain, could
  still raise out of the sweep and lose the shape's rows. A failed cleanup now
  marks the row ERROR (first cause kept) and the sweep exits non-zero.
- comparability_problems() is the one place the build / cold-memory / rotation
  rules live: the report withholds on it, stage 2 refuses stage-1 rows with it
  and --summarize, which ranked mixed builds without a word, now warns.
- --source-sha supplies the run's sha, which stage 2 compares with the stage-1
  sha, instead of skipping the comparison.
- The sweep imports STATE_DTYPES from the kernel and keys a shape by the new
  dispatch.gdn.gfx950.auto_case(req), which auto_default now uses, instead of
  restating the state dtypes and the fused rule.
--summarize ranked mixed builds or rotations and exited 0. It now ranks each
shape's stage-2 rows (stage 1 when it has none) and, when those rows mix
builds or --rotate-mb, prints WITHHELD, ranks nothing and exits 1, by the same
comparability_problems() rules as the report. A deliberate warm run, comparable
with itself, still only warns. The tests mutate the rows that are ranked, not
the stage-1 rows beside them.
@cgmillette
cgmillette enabled auto-merge (squash) November 5, 2026 23:01
@cgmillette

Copy link
Copy Markdown
Contributor

Automated review: Model - qwen3.6:35b-a3b-coding-mtp-q4_K_M, effort: max

PR #14632 — in-tree sweep and defaults report for gfx950 GDN/KDA decode (AviralGoelAMD, AICK-2556) — 🟡 Follow-up: fixes verified; body outdated

Prior item Status
Earlier rows: our 10-29 N1, N2; 10-30/31 items; 10-31 N2 🟢 FIXED, carried
• delta leaves the gate, CLI and llvm24 fixes in place (ran: git diff)
• gate 59 ✓, CLI 19 ✓ on both gfx94X shards (read: logs)
cgmillette (10-30) APPROVED at 7436d045 🟢 APPROVED 7436d045
• older head; still counts on develop
• predates 14720's knob code and the 11-02/11-05 fixes
• ready to merge from our side; waits on a rocke-lib code-owner approval (read)
cgmillette (11-03): fix the high-severity items first 🟢 FIXED d656a266, 47c932aa
• the golden 🔴 and both 🟠 rows below are fixed (ran)
Our 10-31 N1 🟡: body tracks the head 🟡 OPEN
• GPU row says "the newest commit only adds golden entries": not at this head (read)
• so its GPU runs predate the 11-02 and 11-05 sweep code
• auto-merge is armed: this body becomes the squash message
Our 11-03 N1 🔴: knob cases keep pre-13652 hashes 🟢 FIXED d656a266
• GDN golden ✓ at all 4 flavors on the merge with today's develop (ran)
• only the 188 knob entries moved; the old fixture fails there (ran)
• C++ and Python IR match for every case (ran)
Our 11-03 N2 🟠: comparability rules in 3 places 🟢 FIXED 47c932aa, 3e6822d1
• one home, comparability_problems(): report, stage 2, --summarize (ran)
• --summarize withholds mixed builds or rotations, exit 1 (ran)
• dropping one rule fails a test in each consumer (ran: mutants)
Our 11-03 N3 🟠: sweep restates STATE_DTYPES, fused rule 🟢 FIXED 47c932aa
• imports the kernel's STATE_DTYPES; auto_key calls dispatch's auto_case (ran)
• a change to dispatch's state rows reaches the sweep's key (ran: mutant)
CongMa13 (11-02) ×2: stage-2 replay failures; mixed-sha scoring 🟢 FIXED 47c932aa
• last 3 drain/release sites mark rows ERROR; rows kept (ran)
• removing any one guard fails a new test (ran: mutants)
• the per-row mark itself is untested: N4
dlangbe (11-02) ×2: stage-1 provenance bypass; dirty-sha and toolchain mixes 🟢 FIXED 47c932aa
• --source-sha now supplies the sha that is compared (ran)
• another sha refused; the stage-1 sha accepted (ran)
• skipping the sha compare fails 3 tests (ran: mutant)
Reviewers since 11-03 🟢 None new
• no reviews or threads; 4 of 4 threads resolved (read)
• CongMa13's 11-03 nudge: answered by the 11-05 commits, no reply posted
Bots / CI 🟢 Green
• 44 ✓ · 53 skipped · 0 ✗, all attempt 1; required ✓ (read 08:07Z)
• GDN lane ✓ on both gfx94X shards; the 5 new tests pass (read: logs)
• merge: blocked on a rocke-lib code-owner approval; auto-merge armed
Our checks 🟢 Pass
• merge vs 542a7f35: clean, 142 behind (ran)
• build + ctest 51 ✓ / 1 skip; parity, golden gate, differential ✓ ×4 (ran)
• PR tests 968 ✓, installed 853 ✓; 1 ✗ = issue 14736, develop too (ran)
• rule scan: a fake timing, a doc env name, ASCII text I/O; none holds (read)
Code quality 🟡 Minor
• N2, N3 fixed: one rule-set home; each rule's mutant fails every consumer (ran)
• auto_key test passes a restated key: patch dispatch's AUTO_STATE_ROW in it (ran)
• --summarize rebuilds a shape's summary once per row, not per shape (decode_table_sweep.py:874) (ran)
• optional: a GateKind home for the restated GATE_KINDS (:82) (read)
# Sev file:line Finding
N4 🟡 tests/test_gdn_decode_table_sweep.py:531; gdn/decode_table_sweep.py:1061, :1098, :1129 Two cleanup claims have no test: the per-row drain's ERROR mark and "first cause kept"
• impact: silencing either drain's mark, or overwriting the first cause, keeps all 226 tests green; release() drains again and re-marks every row (ran)
• fix: a fake drain that fails once (row 0 error, row 1 ok, both stages); a compile-failure row keeps its cause after a failing drain

Utility: 🟢 Positive — repeatable in-tree GDN/KDA defaults sweep; review fixes verified by mutants


Legend: 🔴 blocking · 🟠 should-fix · 🟡 minor nit · 🟢 info/good · ⚪ retracted

Follow-up review: first pass by a local qwen3.6 model, verified by the orchestrator (Claude Opus 5.5). Checks: range-diff vs ed6263a3, GDN golden on today's merge at 4 flavors (pre-fix fixture as control), GDN C++/Python IR parity, mutants of each review fix, saved probes, merge with develop, build + ctest, parity, goldens, changed tests (source and installed), CI logs at head, code quality. Flags whether a closer look is needed; not an approval or rejection.

@yraparti yraparti left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

rocKE checklist review

ROCm/rocm-libraries#14632 · 3e6822d18874 · model gemini-4-argon, fallback gpt-5.5

PASS · graded 238/238 · BLOCKER 0, HIGH 4, MEDIUM 3, LOW 1, NEEDS-INFO 32

The diff was truncated before grading. Items that needed a missing hunk are NEEDS-INFO.

Findings

  • HIGH §D · dnn-providers/hip-kernel-provider/rocke/library/builders/gfx950/gdn/CASE_STUDY.md:382 · Put the knob on the KernelSpec and delete the environment read.
  • HIGH §E · dnn-providers/hip-kernel-provider/rocke/library/tests/test_kda_decode_benchmark.py:310 · Remove the absolute figure. Keep code comments qualitative.
  • HIGH §K · dnn-providers/hip-kernel-provider/rocke/library/kernels/gfx950/gdn_decode.py:746 · State the tuning-store migration for the re-keyed GDN decode tuning_ids in the PR description (or document that no stored GDN pins exist in tree / how external pins are migrated).
  • HIGH §K · dnn-providers/hip-kernel-provider/rocke/library/dispatch/gdn/rules.py:263 · Remove outer_dependent_knobs from KnobSpace and do not read waves_per_eu (outer_knob) inside inert() / base_value().
  • MEDIUM §C · dnn-providers/hip-kernel-provider/rocke/library/kernels/gfx950/gdn_decode.py:230 · Land the row_loads knob and its golden/tuning-space changes in their own PR (#14720) and rebase this sweep/report tools PR on top of it.
  • MEDIUM §E · dnn-providers/hip-kernel-provider/rocke/library/benchmarks/gfx950/gdn/decode_table_sweep.py:1277 · Query the device through rocke.runtime.hip_module instead of importing torch.
  • MEDIUM §R · dnn-providers/hip-kernel-provider/rocke/library/benchmarks/gfx950/gdn/decode_table_sweep.py:1 · Add a checked-in entry for the new GDN decode sweep/report tool to platform/dsl_docs/optimization/utilities/README.md or the dsl_probes README, and link it from the relevant runbook lesson section if it captures a new optimization lesson.
  • LOW §E · dnn-providers/hip-kernel-provider/rocke/library/kernels/gfx950/gdn_decode.py:746 · Land the row_loads knob (#14720) in its own PR before or separate from the sweep/report tools PR.

Needs info

  • §E.7 Diffs for ALGORITHM.md, CASE_STUDY.md, README.md, and platform/dsl_docs/instances/gdn.md are omitted from the prompt, so doc synchronization with the new row_loads knob and tools cannot be verified from the provided hunks.
  • §E.10 The diff for dnn-providers/hip-kernel-provider/rocke/library/tests/golden/gdn_decode_gfx950_ir_sha256.json and dnn-providers/hip-kernel-provider/rocke/platform/CMakeLists.txt are omitted, and open PR overlap cannot be verified from the diff alone.
  • §E.11 dnn-providers/hip-kernel-provider/rocke/library/pyproject.toml:44 and the file list show only deliverable tools, tests, and required docs (ALGORITHM.md, CASE_STUDY.md, README.md, gdn.md) are committed. — no diff line supports this verdict
  • §E.15 dnn-providers/hip-kernel-provider/rocke/library/benchmarks/gfx950/gdn/decode_table_sweep.py is truncated at line 880 (out of 1746 lines), so parameter usage across all functions cannot be verified.
  • §F.6 Need local pre-commit output or CI evidence; the diff does not show that pre-commit ran green before push.
  • §F.7 Need the bot/Copilot review threads and resolutions; those review-thread records are not present in the diff.
  • §F.8 Need PR workflow/bot-check status and self-check evidence for policy.yml; the diff does not show whether the merge-readiness bot ran or was bypassed on a stacked feature branch.
  • §F.11 Need evidence from gh api or gh pr view showing the actual persisted body/title fields; the diff does not contain that API verification.

Section notes

  • §A: GDN/KDA decode is a documented Python-only kernel family on gfx950, and the dispatch/tuning changes are in the Python-only dispatch layer.
  • §E: Multiple diffs were truncated or omitted from the prompt (including decode_table_sweep.py and several test/doc files), so items requiring full-diff inspection are marked NEEDS-INFO where appropriate.
  • §G: Items 1-17 of 34 in section G
  • §G: Items 18-34 of 34
  • §H: No new or modified device-side bounds, masks, indirections, or SRD resource sizing in this PR: kernels/gfx950/gdn_decode.py only adds the row_loads load-order scheduling knob (choosing between existing first vs late load placement without changing pointer arithmetic, bounds, or masks), and builders/gfx950/gdn/gdn_decode.py adds host-side cold-memory rotation and fp32 gate helpers (capture_cold checks v['batch_size'] != batch on the host).
  • §J: Shapes: | Equation / Location | Operands | Inner Dims | Result vs Declared | |---|---|---|---| | ALGORITHM.md, CASE_STUDY.md, README.md, gdn.md | (diff omitted) | (diff omitted) | (diff omitted) | | platform/python/rocke/dispatch/README.md:227-232 | None | None | Prose only | Symbols: | Symbol | Defined at | Domain | |---|---|---| | outer_dependent_knobs | platform/python/rocke/dispatch/README.md:228 | frozenset[str] of knob names | | waves_per_eu | platform/python/rocke/dispatch/README.md:229 | Integer occupancy floor ([0, 8]) | | row_loads | platform/python/rocke/dispatch/README.md:228 | {"auto", "first", "late"} | | (other symbols) | ALGORITHM.md, CASE_STUDY.md, README.md | (diff omitted) | Novelty: | Claim | Location | Status | |---|---|---| | outer_dependent_knobs hook on KnobSpace | platform/python/rocke/dispatch/README.md:227-230 | Added in platform/python/rocke/dispatch/tuning/space.py:57 | | (other claims) | ALGORITHM.md…

Graded with the rocKE PR checklist, one model pass per section. FAIL rows that sit on a diff line are inline comments.

§A graded 14/14
# Verdict Evidence
1 PASS dnn-providers/hip-kernel-provider/rocke/library/kernels/gfx950/gdn_decode.py:345 (GDN decode is an existing documented Python-only family on gfx950; no new kernel family is introduced and no GEMM/conv/attention kernel emitter is modified)
2 N/A No core IR (core/ir) or lowering (core/lower_*) files are modified in this PR.
3 PASS dnn-providers/hip-kernel-provider/rocke/library/dispatch/gdn/init.py:76 and dnn-providers/hip-kernel-provider/rocke/platform/python/rocke/dispatch/tuning/space.py:57 (changes are in the Python-only rocke.dispatch / library/dispatch layer and Python-only GDN spec)
4 N/A No C++ kernel twin exists for the gfx950 GDN/KDA decode kernel modified in this PR.
5 PASS dnn-providers/hip-kernel-provider/rocke/library/tests/test_gdn_decode_golden.py:201 (the representative IR golden is unchanged, and gdn_decode_gfx950_ir_sha256.json only adds new knob_row_loads_* entries without modifying existing hashes)
6 PASS dnn-providers/hip-kernel-provider/rocke/library/tests/test_gdn_decode_golden.py:391 (PR description and test changes explicitly distinguish the GDN IR golden test from the C++ parity gate)
7 PASS dnn-providers/hip-kernel-provider/rocke/library/kernels/gfx950/gdn_decode.py:455 (late_row_inputs returns auto_late_row_inputs(spec) when spec.row_loads == "auto" or not row_loads_applies(spec), preserving identical IR on all existing default specs)
8 N/A No C++ code or C++-backed kernel is modified in this PR.
9 N/A No shared op-handler or lowerer changes are made in this PR.
10 PASS dnn-providers/hip-kernel-provider/rocke/library/tests/test_gdn_decode_golden.py:391 (_row_loads_cases adds golden hash coverage for the new row_loads knob across gdn/kda, state dtypes bf16/f32/f16, head dims 64/128/256, and waves_per_eu floors; gdn_decode_gfx950_ir_sha256.json adds 768 lines for all LLVM flavors)
11 N/A No new IR op is added in this PR.
12 N/A core/backend.py and ROCKE_BACKEND handling are not touched in this PR.
13 N/A LLVM .ll emission and debug location handling are not modified in this PR.
14 N/A No classic helpers under rocke/helpers/ or platform/cpp/helpers/ are modified in this PR.
§B graded 6/6
# Verdict Evidence
1 PASS New row_loads validation in dnn-providers/hip-kernel-provider/rocke/library/kernels/gfx950/gdn_decode.py:926-927 rejects only invalid enum values outside ROW_LOADS, and dnn-providers/hip-kernel-provider/rocke/library/dispatch/gdn/gfx950.py:233-239 rejects stored tuning_ids whose knobs are inert on the requested shape rather than introducing an implementation shortcut.
2 PASS dnn-providers/hip-kernel-provider/rocke/library/dispatch/gdn/rules.py:268-269 delegates GdnDecodeSpace.validate directly to is_valid_spec(kernel, arch=self.arch) defined in dnn-providers/hip-kernel-provider/rocke/library/kernels/gfx950/gdn_decode.py:926.
3 PASS No AUTO_DEFAULTS selection changes (dnn-providers/hip-kernel-provider/rocke/library/dispatch/gdn/axes.py:147), and invalid stored tuning_id pins refuse loudly with "no fallback was selected" in dnn-providers/hip-kernel-provider/rocke/library/dispatch/gdn/gfx950.py:233-239.
4 PASS dnn-providers/hip-kernel-provider/rocke/library/kernels/gfx950/gdn_decode.py:236-240 and 926-927 validate row_loads with strict type(value) is str and value in ROW_LOADS, and dnn-providers/hip-kernel-provider/rocke/library/benchmarks/gfx950/gdn/decode_table_sweep.py:157-170 and 233-376 reject malformed Shape and JSON row inputs with type(value) is int / type(value) is bool checks instead of coercing.
5 PASS The newly opened row_loads configurations are covered in dnn-providers/hip-kernel-provider/rocke/library/tests/test_gdn_decode_golden.py:391-453, dnn-providers/hip-kernel-provider/rocke/library/tests/test_gdn_decode_fused.py:303-309, and dnn-providers/hip-kernel-provider/rocke/library/tests/dispatch/gdn/test_tuning_contract.py:350-391.
6 PASS dnn-providers/hip-kernel-provider/rocke/library/kernels/gfx950/gdn_decode.py:923-927 checks only functional enum membership in _knob_error (which feeds is_valid_spec), explicitly leaving spill/performance trade-offs to dispatch and the sweep.
§C graded 10/10
# Verdict Evidence
1 PASS Repeated CLI parsing, fp32 gate rules, cold-memory timing, and HSACO resource compilation were consolidated into shared helpers in dnn-providers/hip-kernel-provider/rocke/library/dispatch/gdn/cli_args.py:21, dnn-providers/hip-kernel-provider/rocke/library/dispatch/gdn/gate_rules.py:39, dnn-providers/hip-kernel-provider/rocke/library/builders/gfx950/gdn/gdn_decode.py:675, and…
2 PASS No bespoke shape-class builders or forked IR harnesses are introduced; the row-load order is parameterized as a spec knob on GdnDecodeSpec in dnn-providers/hip-kernel-provider/rocke/library/kernels/gfx950/gdn_decode.py:746 and benchmarks/sweeps invoke the shared driver and registry in dnn-providers/hip-kernel-provider/rocke/library/benchmarks/gfx950/gdn/decode_table_sweep.py:591.
3 PASS kernel_name() in dnn-providers/hip-kernel-provider/rocke/library/kernels/gfx950/gdn_decode.py:856 only appends codegen knob tokens ('rlf'/'rll' from _ROW_LOADS_TOKEN) and never workload sizes.
4 PASS Arch-independent tuning space logic lives in dnn-providers/hip-kernel-provider/rocke/platform/python/rocke/dispatch/tuning/space.py:57 while gfx950-specific kernel, builder, and benchmark code remains under gfx950 directories such as dnn-providers/hip-kernel-provider/rocke/library/kernels/gfx950/gdn_decode.py:345.
5 FAIL The PR bundles two separable changes into a 48-file diff: the row_loads kernel/tuning knob (from #14720) in dnn-providers/hip-kernel-provider/rocke/library/kernels/gfx950/gdn_decode.py:230 and dnn-providers/hip-kernel-provider/rocke/platform/python/rocke/dispatch/tuning/space.py:57 alongside the new in-tree sweep/report tools in dnn-providers/hip-kernel-provider/rocke/library/benchmarks/gfx950/gdn/decode_table_sweep.py:1.
6 PASS The PR extracts torch-free rules (dnn-providers/hip-kernel-provider/rocke/library/dispatch/gdn/gate_rules.py:1) and generalizes KnobSpace.outer_dependent_knobs (dnn-providers/hip-kernel-provider/rocke/platform/python/rocke/dispatch/tuning/space.py:57) cleanly rather than monkey-patching callers, allowing test_gdn_decode_fused.py to drop mock.patch in dnn-providers/hip-kernel-provider/rocke/library/tests/test_gdn_decode_fused.py:303.
7 PASS Removing obsolete builders/gfx950/gdn/tune.py and deduplicating gate/timing helpers across benchmarks and tests preserves existing default kernel names and IR hashes while adding new knob coverage in dnn-providers/hip-kernel-provider/rocke/library/tests/test_gdn_decode_golden.py:198.
8 PASS The PR reuses existing platform helpers such as iter_at_level and sample_count from rocke.dispatch.tuning.walk in dnn-providers/hip-kernel-provider/rocke/library/dispatch/gdn/init.py:30 and analyze_hsaco / compile_kernel in dnn-providers/hip-kernel-provider/rocke/library/tests/_gdn_decode_compile.py:31.
9 PASS NaN-unsafe error comparisons and warm-cache timing were treated as bug classes and replaced across the driver, sweep, benchmarks, and numeric tests via Gate.passed and cold_copy_count in dnn-providers/hip-kernel-provider/rocke/library/dispatch/gdn/gate_rules.py:48 and dnn-providers/hip-kernel-provider/rocke/library/benchmarks/gfx950/gdn/benchmark_gdn_decode.py:100.
10 PASS Widening GdnDecodeSpec and AXES with row_loads and KnobSpace with outer_dependent_knobs updated all consumers across kernel validation, naming, dispatch scope checks, tuning space stream/is_valid, golden tests, and docs in dnn-providers/hip-kernel-provider/rocke/library/dispatch/gdn/rules.py:154, dnn-providers/hip-kernel-provider/rocke/platform/python/rocke/dispatch/tuning/space.py:185, and…
§D graded 21/21
# Verdict Evidence
1 FAIL dnn-providers/hip-kernel-provider/rocke/library/builders/gfx950/gdn/CASE_STUDY.md:382 reads the environment
2 PASS Coverage constants ROW_LOADS, STATE_HINTS, and _MAX_WAVES_PER_EU are imported directly from kernels.gfx950.gdn_decode in dnn-providers/hip-kernel-provider/rocke/library/dispatch/gdn/axes.py:42-47 rather than transcribed.
3 PASS scope_check in dnn-providers/hip-kernel-provider/rocke/library/dispatch/gdn/gfx950.py:223-240 runs cheap checks first (wanted == "auto" or not req.tuning_knobs) and returns a specific invariant reason without re-checking Capability fields.
4 PASS Selection in dispatch_gdn_decode and out_of_scope_knobs reads arch=req.arch from the request (dnn-providers/hip-kernel-provider/rocke/library/dispatch/gdn/__init__.py:201-207) and dispatch_gdn_decode_all takes explicit sweep_level, tuning_sample, and seed arguments (__init__.py:76-82).
5 PASS kernel_name() adds the rlf/rll token only when row_loads_overrides(self) is True (dnn-providers/hip-kernel-provider/rocke/library/kernels/gfx950/gdn_decode.py:856-859), and GdnDecodeSpace.inert drops row_loads when _restates_auto(kernel) is True (dnn-providers/hip-kernel-provider/rocke/library/dispatch/gdn/rules.py:263-266), keeping emitted body, symbol, and canonical spec identity aligned.
6 N/A This PR does not add or modify cohort routing.
7 N/A This PR does not modify heuristic/override ordering in selectors.
8 PASS The applicability and override predicates row_loads_applies and row_loads_overrides are defined once in dnn-providers/hip-kernel-provider/rocke/library/kernels/gfx950/gdn_decode.py:345-351,460-464 and imported by dnn-providers/hip-kernel-provider/rocke/library/dispatch/gdn/rules.py:30-31.
9 N/A This PR does not register a new KernelCandidate or architecture.
10 PASS The new row_loads spec field is reachable from GdnDecodeRequest.tuning_knobs through GdnDecodeSpace (dnn-providers/hip-kernel-provider/rocke/library/dispatch/gdn/rules.py:132,263) and tested through dispatch_gdn_decode and dispatch_gdn_decode_all in dnn-providers/hip-kernel-provider/rocke/library/tests/dispatch/gdn/test_tuning_contract.py:350-392.
11 PASS Adding ROW_LOADS_AXIS and the sweep/report tools does not change AUTO_DEFAULTS selection (dnn-providers/hip-kernel-provider/rocke/library/dispatch/gdn/axes.py:147-185).
12 N/A No candidate priorities, candidate names, or custom rankers are added or modified in this PR.
13 PASS Pinned requests and tuning pins refuse without fallback via scope_check in dnn-providers/hip-kernel-provider/rocke/library/dispatch/gdn/gfx950.py:223-240 and are tested for PinRefused in dnn-providers/hip-kernel-provider/rocke/library/tests/dispatch/gdn/test_tuning_contract.py:409-413, 479-494, 735-739.
14 PASS GdnDecodeSpec.kernel_name() includes a distinct token for invalid or overriding row_loads values so launchers cannot collide in _LAUNCHER_CACHE (dnn-providers/hip-kernel-provider/rocke/library/kernels/gfx950/gdn_decode.py:835-860), and no kernarg ABI layout changed.
15 N/A No new dispatch candidate or architecture module is added in this PR.
16 PASS dispatch_gdn_decode_all and gdn_sweep_space short-circuit on invalid requests and delegate to GDN_REGISTRY with sweep_level, tuning_sample, and seed in dnn-providers/hip-kernel-provider/rocke/library/dispatch/gdn/init.py:76-171.
17 PASS The new row_loads tuning axis and sweep-level sampling are covered by CPU dispatch routing and tuning contract tests in dnn-providers/hip-kernel-provider/rocke/library/tests/dispatch/gdn/test_tuning_contract.py:329-494, 681-723.
18 N/A No registry ratchet flags (require_build, require_binding, require_torch_binding) or exempt sets are modified in this PR.
19 N/A This PR concerns GDN/KDA decode tooling and tuning axes, not unified attention dispatch or run_unified_attention_torch.
20 N/A This PR does not change auto selection or any selector with a C++ consumer.
21 N/A This PR adds an explicit tuning knob (row_loads) and sweep/report tools without altering default selection or changing the emitter to work around a selector issue.
§E graded 17/17
# Verdict Evidence
1 PASS dnn-providers/hip-kernel-provider/rocke/platform/python/rocke/dispatch/tuning/space.py:47 shows platform code and tests do not import library modules.
2 FAIL dnn-providers/hip-kernel-provider/rocke/library/benchmarks/gfx950/gdn/decode_table_sweep.py:1277 adds import torch
3 PASS dnn-providers/hip-kernel-provider/rocke/library/dispatch/gdn/gate_rules.py:23 and dnn-providers/hip-kernel-provider/rocke/library/tests/dispatch/gdn/test_gate_rules.py:172 keep gate/CLI rules torch-free so CPU tests run without torch.
4 PASS dnn-providers/hip-kernel-provider/rocke/library/tests/dispatch/gdn/test_gate_rules.py:187 and dnn-providers/hip-kernel-provider/rocke/library/builders/gfx950/gdn/gdn_decode.py:39 verify downward-only imports (benchmarks -> builders -> dispatch -> kernels).
5 PASS dnn-providers/hip-kernel-provider/rocke/library/tests/_gdn_decode_compile.py:39 uses Python tempfile and pathlib rather than hardcoded /tmp or shell scripts.
6 PASS dnn-providers/hip-kernel-provider/rocke/library/kernels/gfx950/gdn_decode.py:852 preserves existing emitter handles and golden hashes (only adding new row_loads cases in test_gdn_decode_golden.py:201).
7 NEEDS-INFO Diffs for ALGORITHM.md, CASE_STUDY.md, README.md, and platform/dsl_docs/instances/gdn.md are omitted from the prompt, so doc synchronization with the new row_loads knob and tools cannot be verified from the provided hunks.
8 PASS dnn-providers/hip-kernel-provider/rocke/library/kernels/gfx950/gdn_decode.py:227 and dnn-providers/hip-kernel-provider/rocke/library/benchmarks/gfx950/gdn/decode_defaults_report.py:1 contain no tracking IDs, reviewer handles, or PR numbers in visible code.
9 FAIL dnn-providers/hip-kernel-provider/rocke/library/kernels/gfx950/gdn_decode.py:746 bundles the unmerged row_loads spec knob feature (#14720) into the in-tree sweep and defaults report tools PR.
10 NEEDS-INFO The diff for dnn-providers/hip-kernel-provider/rocke/library/tests/golden/gdn_decode_gfx950_ir_sha256.json and dnn-providers/hip-kernel-provider/rocke/platform/CMakeLists.txt are omitted, and open PR overlap cannot be verified from the diff alone.
11 NEEDS-INFO dnn-providers/hip-kernel-provider/rocke/library/pyproject.toml:44 and the file list show only deliverable tools, tests, and required docs (ALGORITHM.md, CASE_STUDY.md, README.md, gdn.md) are committed. — no diff line supports this verdict
12 PASS dnn-providers/hip-kernel-provider/rocke/library/benchmarks/gfx950/gdn/benchmark_kda_decode.py:54 scopes the GDN/KDA decode tools to ARCH = 'gfx950' and the PR description explicitly scopes out gfx942.
13 PASS dnn-providers/hip-kernel-provider/rocke/library/builders/gfx950/gdn/tune.py:1 is deleted along with its test file test_gdn_decode_tune.py and its references in benchmark_kda_decode.py:43.
14 PASS dnn-providers/hip-kernel-provider/rocke/library/kernels/gfx950/gdn_decode.py:345 retains upstream comments and logic while extending late_row_inputs to auto_late_row_inputs without dropping upstream notes.
15 NEEDS-INFO dnn-providers/hip-kernel-provider/rocke/library/benchmarks/gfx950/gdn/decode_table_sweep.py is truncated at line 880 (out of 1746 lines), so parameter usage across all functions cannot be verified.
16 N/A Severity honesty applies to review reporting rather than the code changes in the pull request diff.
17 FAIL dnn-providers/hip-kernel-provider/rocke/library/tests/test_kda_decode_benchmark.py:310 contains an absolute performance figure
§F graded 11/11
# Verdict Evidence
1 PASS branch users/avirgoel/rocke/gdn-decode-tools uses the users// prefix
2 PASS title feat(rocke): in-tree sweep and defaults report for gfx950 GDN/KDA decode matches type(scope): summary and is 72 characters
3 PASS description is at least 30 characters and contains an issue reference
4 PASS test file dnn-providers/hip-kernel-provider/rocke/library/tests/dispatch/gdn/test_cli_args.py is in the diff
5 PASS no key, certificate, or secret filename in the diff
6 NEEDS-INFO Need local pre-commit output or CI evidence; the diff does not show that pre-commit ran green before push.
7 NEEDS-INFO Need the bot/Copilot review threads and resolutions; those review-thread records are not present in the diff.
8 NEEDS-INFO Need PR workflow/bot-check status and self-check evidence for policy.yml; the diff does not show whether the merge-readiness bot ran or was bypassed on a stacked feature branch.
9 N/A No PR-size-cap split or trimming is indicated in the provided context.
10 PASS The added tests exercise concrete helper behavior, including batch parsing at dnn-providers/hip-kernel-provider/rocke/library/tests/dispatch/gdn/test_cli_args.py:19 and gate failure cases at dnn-providers/hip-kernel-provider/rocke/library/tests/dispatch/gdn/test_gate_rules.py:58.
11 NEEDS-INFO Need evidence from gh api or gh pr view showing the actual persisted body/title fields; the diff does not contain that API verification.
§G graded 34/34
# Verdict Evidence
1 PASS Correctness is verified independently of parity via the fp32 reference gate in dnn-providers/hip-kernel-provider/rocke/library/builders/gfx950/gdn/gdn_decode.py:675 and dnn-providers/hip-kernel-provider/rocke/library/dispatch/gdn/gate_rules.py:57.
2 PASS On-silicon numeric tests against the fp32 reference with bf16 tolerance (TOL = 1e-2) are implemented in dnn-providers/hip-kernel-provider/rocke/library/dispatch/gdn/gate_rules.py:35 and exercised in dnn-providers/hip-kernel-provider/rocke/library/tests/test_gdn_decode_gfx950_numeric.py:76.
3 PASS Golden IR hashes for the new knob cases are updated in dnn-providers/hip-kernel-provider/rocke/library/tests/test_gdn_decode_golden.py:391 and torch-free CPU dispatch tests are added in dnn-providers/hip-kernel-provider/rocke/library/tests/dispatch/gdn/test_gate_rules.py:49.
4 PASS New behavior is pinned by falsifiable tests in dnn-providers/hip-kernel-provider/rocke/library/tests/dispatch/gdn/test_tuning_contract.py:350 and dnn-providers/hip-kernel-provider/rocke/library/tests/test_gdn_decode_defaults_report.py:66.
5 PASS Tests drive shipped public entry points (dispatch_gdn_decode, report.main, Gate.passed) and explicitly verify gate falsifiability in dnn-providers/hip-kernel-provider/rocke/library/tests/test_gdn_decode_gfx950_numeric.py:76.
6 NEEDS-INFO Prose files ALGORITHM.md, CASE_STUDY.md, and README.md are omitted from the diff, and decode_table_sweep.py is truncated after line 865.
7 NEEDS-INFO The diffs for ALGORITHM.md, CASE_STUDY.md, and README.md are omitted from the prompt.
8 PASS Harnesses and tools strictly validate state_dtype and dtypes without silent fallback in dnn-providers/hip-kernel-provider/rocke/library/benchmarks/gfx950/gdn/decode_table_sweep.py:139.
9 PASS Spill/scratch byte checks compile through comgr and inspect the HSACO via analyze_hsaco in dnn-providers/hip-kernel-provider/rocke/library/tests/_gdn_decode_compile.py:28.
10 PASS Benchmark and sweep scripts record device and toolchain provenance, gate on the fp32 reference before timing, and report ratios in dnn-providers/hip-kernel-provider/rocke/library/benchmarks/gfx950/gdn/benchmark_kda_decode.py:397 and dnn-providers/hip-kernel-provider/rocke/library/benchmarks/gfx950/gdn/decode_defaults_report.py:376.
11 PASS The new row_loads knob is wired through the dispatcher and tuning space in dnn-providers/hip-kernel-provider/rocke/library/dispatch/gdn/axes.py:66 and tested via dispatch_gdn_decode in dnn-providers/hip-kernel-provider/rocke/library/tests/dispatch/gdn/test_tuning_contract.py:350.
12 N/A This PR modifies the Python-only GDN decode dispatcher, benchmarks, and kernel builder without introducing a cross-engine gap.
13 N/A No new LLVM intrinsic overload symbols or TableGen (.td) files are touched or recommended in this PR.
14 N/A This PR adds sweep and reporting tools and makes no bottleneck classification claims.
15 N/A This is a review process meta-instruction and the diff is provided directly in the prompt.
16 PASS Shared symbols and layering are verified by AST and bytecode inspection tests in dnn-providers/hip-kernel-provider/rocke/library/tests/dispatch/gdn/test_gate_rules.py:206.
17 PASS Shipped CLI entry points (main) are invoked in tests such as dnn-providers/hip-kernel-provider/rocke/library/tests/test_gdn_decode_defaults_report.py:328 and verified end-to-end on gfx950 per the validation table.
18 NEEDS-INFO gate documents its blind spots (in-place read==write and -1 skip lanes) in dnn-providers/hip-kernel-provider/rocke/library/builders/gfx950/gdn/gdn_decode.py:678-683, is wired into benchmarks/sweep (dnn-providers/hip-kernel-provider/rocke/library/benchmarks/gfx950/gdn/benchmark_gdn_decode.py:100-110, dnn-providers/hip-kernel-provider/rocke/library/benchmarks/gfx950/gdn/benchmark_kda_decode.py:255-266), and is proven to pass exact launches and fail on perturbed outputs, written state, NaNs, and 1-ULP untouched-slot spills in dnn-providers/hip-kernel-provider/rocke/library/tests/test_gdn_decode_gfx950_numeric.py:76-129 and…
19 PASS gate requires spare pool slots (make_inputs provides 2 * batch + 1 in dnn-providers/hip-kernel-provider/rocke/library/builders/gfx950/gdn/gdn_decode.py:687-689), callers assert spare slots exist (dnn-providers/hip-kernel-provider/rocke/library/tests/test_gdn_decode_gfx950_numeric.py:119-122, 176-179), and inline gates for skip-sentinel and relative-state paths separately check untouched slots and NaN-safe bounds…
20 N/A This PR does not add or modify a claim-ban detector or regex lint rule.
21 PASS decode_table_sweep.py and decode_defaults_report.py validate and propagate every input/row field (dnn-providers/hip-kernel-provider/rocke/library/benchmarks/gfx950/gdn/decode_table_sweep.py:86-119, 338-381), explicitly distinguish measured vs unmeasured/modelled bounds (dnn-providers/hip-kernel-provider/rocke/library/benchmarks/gfx950/gdn/decode_defaults_report.py:87-91…
22 NEEDS-INFO The diff for dnn-providers/hip-kernel-provider/rocke/library/tests/golden/gdn_decode_gfx950_ir_sha256.json is omitted (+768 -0 lines), so it cannot be verified from the diff alone that every new golden entry carries bytes and sha256 for every flavor without build error entries.
23 NEEDS-INFO This PR makes no performance speedup claims, and its sweep/benchmark tools label every configuration axis (SHAPE_FIELDS and WALK_FIELDS in dnn-providers/hip-kernel-provider/rocke/library/benchmarks/gfx950/gdn/decode_table_sweep.py:74-88), gate both auto and candidate routes against the fp32 reference (dnn-providers/hip-kernel-provider/rocke/library/benchmarks/gfx950/gdn/benchmark_gdn_decode.py:98-110), and report absolute times alongside ratios (dnn-providers/hip-kernel-provider/rocke/library/benchmarks/gfx950/gdn/benchmark_kda_decode.py:333-348, dnn-providers/hip-kernel-provider/rocke/library/benchmarks/gfx950/gdn/decode_table_sweep.py:665-685). — no diff line supports this…
24 N/A No existing golden hashes are re-blessed or modified; only new golden cases for the opt-in row_loads knob are added (dnn-providers/hip-kernel-provider/rocke/library/tests/test_gdn_decode_golden.py:195-204…
25 N/A This PR adds benchmarking/sweep tools and an opt-in tuning knob (row_loads, which is a no-op at default auto), rather than shipping a default codegen micro-optimization.
26 N/A This PR makes no performance benchmark claims and does not change any default kernel selection.
27 PASS The row_loads knob toggles only the single-wave fuse_conv load order (dnn-providers/hip-kernel-provider/rocke/library/kernels/gfx950/gdn_decode.py:452-465) and is tested in isolation against its auto counterpart (dnn-providers/hip-kernel-provider/rocke/library/tests/test_gdn_decode_fused.py:303-309, dnn-providers/hip-kernel-provider/rocke/library/tests/test_gdn_decode_golden.py:391-453).
28 PASS Forced row_loads values that match auto's load order are explicitly treated as 0-delta (row_loads_overrides returns False, emitting the exact auto kernel name and dropping the redundant knob in dnn-providers/hip-kernel-provider/rocke/library/kernels/gfx950/gdn_decode.py:460-465, 855-859 and dnn-providers/hip-kernel-provider/rocke/library/dispatch/gdn/rules.py:147-152, 263-266).
29 N/A This PR does not swap any guarded math primitive for a fast math primitive.
30 PASS Spill verification compiles the kernel to HSACO via comgr and inspects code-object .scratch_bytes metadata with analyze_hsaco (dnn-providers/hip-kernel-provider/rocke/library/tests/_gdn_decode_compile.py:28-53, dnn-providers/hip-kernel-provider/rocke/library/tests/test_gdn_decode_fused.py:190-192, 305-309, dnn-providers/hip-kernel-provider/rocke/library/tests/test_kda_decode_resources.py:25-30, 68-69).
31 N/A This PR does not claim to fix a performance defect against a manufactured baseline.
32 PASS Every sweep row records and checks reproducible provenance (sha, device, llvm_version, llvm_flavor, backend, rocm_version, torch_version, rotate_mb, cold_target_mb, and WALK_FIELDS in dnn-providers/hip-kernel-provider/rocke/library/benchmarks/gfx950/gdn/decode_table_sweep.py:86-119, 598-639 and dnn-providers/hip-kernel-provider/rocke/library/benchmarks/gfx950/gdn/decode_defaults_report.py:367-410), and benchmarks…
33 PASS late_row_inputs is split into auto_late_row_inputs (preserving the exact default rule) and row_loads override (dnn-providers/hip-kernel-provider/rocke/library/kernels/gfx950/gdn_decode.py:354-386, 452-465), and test_tuning_contract.py exhaustively tables the resulting knob sets across conv_once and waves_per_eu for both production and full sweep levels…
34 N/A This PR does not add or modify an opt-in kernel output flag.
§H graded 5/5
# Verdict Evidence
1 N/A This PR does not add or modify any hardware/resource bounds (such as buffer-SRD num_records) derived from spec fields.
2 N/A This PR does not add or modify any device-side indirection table reads or physical index calculations; kernels/gfx950/gdn_decode.py only adds the row_loads scheduling order knob.
3 N/A This PR does not add or modify any device-side hot-loop integer div or mod operations.
4 N/A This PR does not add or modify any device-side mask or bound built from runtime length inputs.
5 N/A This PR does not add or modify any kernel launch inputs that feed device-side bounds or masks.
§I graded 6/6
# Verdict Evidence
1 PASS dnn-providers/hip-kernel-provider/rocke/library/benchmarks/gfx950/gdn/decode_table_sweep.py:553 and dnn-providers/hip-kernel-provider/rocke/library/benchmarks/gfx950/gdn/decode_defaults_report.py:286 walk the full registered configuration space alongside auto and report the auto/fastest ratio.
2 PASS dnn-providers/hip-kernel-provider/rocke/library/dispatch/gdn/rules.py:241, dnn-providers/hip-kernel-provider/rocke/library/dispatch/gdn/gfx950.py:233, and dnn-providers/hip-kernel-provider/rocke/library/benchmarks/gfx950/gdn/decode_defaults_report.py:401 canonicalize/drop out-of-scope knobs for unpinned auto requests while loudly rejecting malformed or non-comparable pins/rows with explicit reasons.
3 PASS dnn-providers/hip-kernel-provider/rocke/library/tests/test_gdn_decode_golden.py:391 and dnn-providers/hip-kernel-provider/rocke/library/tests/dispatch/gdn/test_tuning_contract.py:379 combine curated golden cases and generated sweep-space enumeration across tiles, knobs, and waves_per_eu levels.
4 PASS dnn-providers/hip-kernel-provider/rocke/library/benchmarks/gfx950/gdn/decode_table_sweep.py:766 and dnn-providers/hip-kernel-provider/rocke/library/benchmarks/gfx950/gdn/decode_defaults_report.py:286 print both shipped (auto_us, auto/fastest) and achievable (best_us, fastest tuning_id, proposal/fastest) columns side by side.
5 PASS dnn-providers/hip-kernel-provider/rocke/library/dispatch/gdn/axes.py:143 and dnn-providers/hip-kernel-provider/rocke/library/benchmarks/gfx950/gdn/decode_defaults_report.py:394 explicitly document AUTO_DEFAULTS as a static snapshot, mark the report tool advisory, and provide the in-tree decode_table_sweep.py + decode_defaults_report.py regeneration path.
6 N/A This PR adds tuning/benchmark tools and a high-level row_loads scheduling knob (auto/first/late), not a DSL op or API named after a hardware instruction.
§J graded 7/7
# Verdict Evidence
1 NEEDS-INFO The diffs for dnn-providers/hip-kernel-provider/rocke/library/builders/gfx950/gdn/ALGORITHM.md, CASE_STUDY.md, README.md, and platform/dsl_docs/instances/gdn.md are omitted from the truncated diff, so equations and operand shapes in those files cannot be inspected.
2 NEEDS-INFO The diffs for dnn-providers/hip-kernel-provider/rocke/library/builders/gfx950/gdn/ALGORITHM.md, CASE_STUDY.md, README.md, and platform/dsl_docs/instances/gdn.md are omitted from the truncated diff, so symbol definitions and domains cannot be verified.
3 NEEDS-INFO The diffs for dnn-providers/hip-kernel-provider/rocke/library/builders/gfx950/gdn/ALGORITHM.md, CASE_STUDY.md, README.md, platform/dsl_docs/instances/gdn.md, platform/python/rocke/dispatch/ARCHITECTURE.md, and rocke_dispatcher_workflow.md are omitted from the truncated diff, so algorithm restatements across docs cannot be checked.
4 NEEDS-INFO While platform/python/rocke/dispatch/README.md:227-230 matches the newly added outer_dependent_knobs in platform/python/rocke/dispatch/tuning/space.py:57, the diffs for ALGORITHM.md, CASE_STUDY.md, builders/gfx950/gdn/README.md, gdn.md, ARCHITECTURE.md, and rocke_dispatcher_workflow.md are omitted from the truncated diff.
5 NEEDS-INFO The diffs for dnn-providers/hip-kernel-provider/rocke/library/builders/gfx950/gdn/ALGORITHM.md, CASE_STUDY.md, and README.md are omitted from the truncated diff, so any scaling or complexity claims in those documents cannot be verified.
6 NEEDS-INFO The diffs for dnn-providers/hip-kernel-provider/rocke/library/builders/gfx950/gdn/ALGORITHM.md, CASE_STUDY.md, README.md, and benchmarks/gfx950/gdn/decode_shapes.json are omitted from the truncated diff, so constant provenance and model tables cannot be checked.
7 N/A No new design or algorithm Markdown files are added in this PR; all touched .md files (ALGORITHM.md, CASE_STUDY.md, README.md, gdn.md, ARCHITECTURE.md, rocke_dispatcher_workflow.md) are modifications to…
§K graded 13/13
# Verdict Evidence
1 PASS dnn-providers/hip-kernel-provider/rocke/library/tests/dispatch/gdn/test_tuning_contract.py:44-103 updates the contract test table (_REFUSED, representative cases with other_requests and default_knobs) for GdnDecodeSpace over make_tuned_candidate.
2 PASS dnn-providers/hip-kernel-provider/rocke/library/dispatch/gdn/axes.py:55-79 declares ROW_LOADS_AXIS ordered after its prerequisite CONV_ONCE_AXIS, and dnn-providers/hip-kernel-provider/rocke/library/dispatch/gdn/rules.py:91-93 asserts all fields of GdnDecodeSpec are classified.
3 FAIL dnn-providers/hip-kernel-provider/rocke/library/kernels/gfx950/gdn_decode.py:746 adds row_loads: RowLoads = "auto" to GdnDecodeSpec, which enters _SPEC_DEFAULTS (dnn-providers/hip-kernel-provider/rocke/library/dispatch/gdn/rules.py:101-105) and re-keys every configuration's config_key via defaults(), but the PR description does not state the tuning-store migration (or explicitly state that no persistent GDN tuning store exists yet and which stored pins are invalidated).
4 PASS dnn-providers/hip-kernel-provider/rocke/library/dispatch/gdn/rules.py:101-105 defines _SPEC_DEFAULTS from problem-independent FIELD_DEFAULTS excluding PROBLEM_FIELDS | TILE_FIELDS.
5 FAIL dnn-providers/hip-kernel-provider/rocke/library/dispatch/gdn/rules.py:263-266 implements inert(self, base, kernel) calling _restates_auto(kernel), which calls auto_late_row_inputs (dnn-providers/hip-kernel-provider/rocke/library/kernels/gfx950/gdn_decode.py:389) and reads spec.waves_per_eu (the outer_knob), and dnn-providers/hip-kernel-provider/rocke/platform/python/rocke/dispatch/tuning/space.py:53-57 adds outer_dependent_knobs to permit inert() to read outer_knob, directly violating the checklist rule that inert() and base_value() must not read outer_knob.
6 PASS dnn-providers/hip-kernel-provider/rocke/library/dispatch/gdn/rules.py:268-269 delegates validate(self, base, kernel) to is_valid_spec(kernel, arch=self.arch) (dnn-providers/hip-kernel-provider/rocke/library/kernels/gfx950/gdn_decode.py:926), gating both sweeps and pins without resizing specs.
7 PASS dnn-providers/hip-kernel-provider/rocke/library/dispatch/gdn/gfx950.py:225 builds base = make_spec(req, tile) purely from request fields and tile tuple without device probes or live state.
8 PASS dnn-providers/hip-kernel-provider/rocke/platform/python/rocke/dispatch/tuning/space.py:464-467 (typed_knobs) and dnn-providers/hip-kernel-provider/rocke/library/dispatch/gdn/rules.py:174-176 coerce JSON scalars losslessly to axis types and refuse invalid types (test_tuning_contract.py:45-46).
9 NEEDS-INFO dnn-providers/hip-kernel-provider/rocke/library/benchmarks/gfx950/gdn/decode_table_sweep.py:665-678 (config_row) records spec_id, tuning_id, and knobs, but spec_hash is not in ROW_KEYS (decode_table_sweep.py:86-107) and the stage-2 replay hunk of decode_table_sweep.py is truncated after line 868.
10 NEEDS-INFO dnn-providers/hip-kernel-provider/rocke/platform/python/rocke/dispatch/tuning/space.py:458-462 keeps KnobSpace.find unchanged (searching only production stream). — no diff line supports this verdict
11 PASS dnn-providers/hip-kernel-provider/rocke/library/dispatch/gdn/init.py:76-111 scopes sweep_level via iter_at_level and validates tuning_sample via sample_count, and dnn-providers/hip-kernel-provider/rocke/library/benchmarks/gfx950/gdn/decode_table_sweep.py:596-604 loops over dispatch_gdn_decode_all once.
12 PASS dnn-providers/hip-kernel-provider/rocke/library/dispatch/gdn/axes.py:147-185 leaves AUTO_DEFAULTS unchanged and row_loads defaults to 'auto', which emits identical IR and kernel names to pre-PR develop (dnn-providers/hip-kernel-provider/rocke/library/kernels/gfx950/gdn_decode.py:455-464).
13 PASS dnn-providers/hip-kernel-provider/rocke/library/benchmarks/gfx950/gdn/decode_table_sweep.py:594-621 takes configurations directly from dispatch_gdn_decode_all and decode_defaults_report.py:5-6 states that the report is advisory only and does not drive auto selection.
§L graded 10/10
# Verdict Evidence
1 N/A This PR does not add or modify any gfx architecture target or ISA backend.
2 N/A This PR does not add or modify any MMA/WMMA op_id, fragment info, or arch_specs.json entry.
3 N/A The GDN/KDA decode kernel and tools touched by this diff do not select, emit, or modify MMA/MFMA atoms or layouts.
4 N/A This PR does not touch ArchTarget.wave_size or introduce cross-target wave-size logic.
5 N/A All kernel and benchmark changes in this PR are scoped to gfx950 GDN/KDA decode and do not share or leak recipes across gfx942 or gfx1250.
6 N/A This PR does not touch ArchTarget, core/arch/, or instance policy modules, nor does it import CK Tile's dispatcher.
7 N/A This PR does not add or change any logical dtype, bit-packing routine, instruction fragment, or FP8 dialect handling.
8 N/A This PR does not touch scaled-MMA contracts, WMMA op ids, or MfmaAtom.emit_scaled().
9 N/A This PR does not add a new gfx architecture target.
10 N/A This PR does not touch intrinsic_arch_domain..json artifacts or LLVM flavor membership lists.
§M graded 10/10
# Verdict Evidence
1 PASS dnn-providers/hip-kernel-provider/rocke/library/kernels/gfx950/gdn_decode.py:452 — row_loads_applies, auto_late_row_inputs, and late_row_inputs operate purely on host-time GdnDecodeSpec attributes (bool/str/int), never SSA Values.
2 N/A The diff does not touch legalize_for_target, core/, or any ISA backend.
3 N/A The diff does not touch ck.dsl.ir/v1 serialization in core/ir_serialize.py or cpp/core/ir/serialize.cpp.
4 N/A The diff does not touch portable IR (rocke.ir/v1, rocke.recipe/v1, rocke.bundle/v1), recipe_expand.py, or recipe_vm.cpp.
5 N/A The diff does not touch AsyncTileLoader or LdsLayout.
6 N/A The diff does not emit or modify kernel barriers, memory load instructions, or cross-lane XOR shuffles.
7 N/A The diff does not touch ISABackend.buffer_rsrc_word3, buffer-resource construction, or TemporalHint lowering.
8 N/A The diff does not add LLVM intrinsic declarations or modify lowering backend selection precedence.
9 N/A The diff does not touch C++ codegen entry points or headers under cpp/include/rocke/.
10 N/A The diff does not touch !dbg metadata emission, Debug Info Version module flags, or DWARF consumers.
§N graded 18/18
# Verdict Evidence
1 N/A This PR does not add or modify any files under platform/python/rocke/helpers/.
2 N/A This PR does not change kernel use of helpers, MFMA atoms, TensorView, or transform DAGs.
3 N/A This PR does not add or modify any SoftwarePipeline usage.
4 N/A This PR does not add or modify EpilogueOp or graph fusion patterns.
5 N/A This PR does not add or modify any public tiling APIs under rocke.helpers.tiling.
6 N/A This PR does not add or modify front-door/toolbox tiling helpers or LayoutStyle classes.
7 N/A This PR does not touch tiling layout overrides or MMA soundness validation.
8 N/A This PR does not touch tiling LDS memory allocation, stores, reads, or global load predication.
9 N/A This PR does not touch N-D tensor axis roles, batch reductions, or FlowStage labels in tiling.
10 N/A This PR does not change tiling emit, LDS staging, or MMA issue logic.
11 N/A This PR does not touch tiling MMA traits, lds_swizzle policies, or derive_sched_group_counts.
12 N/A This PR makes no LDS bank-conflict or global memory coalescing claims.
13 N/A This PR does not build WarpDistributionEncoding, call make_tile_desc, or touch RegisterMapper.
14 N/A This PR does not use tiling data-movement verbs or add a new LDS pipeline variant.
15 N/A This PR does not modify tiling allocation or bounds checks on transformed address ranges.
16 N/A This PR does not use optimize_layout or evaluate_transform.
17 N/A This PR does not touch the tiling recorder, round-trip analysis, or visualization.
18 N/A This PR does not touch interleaved tiling layouts or demo kernels under helpers/tiling/kernels/.
§O graded 16/16
# Verdict Evidence
1 N/A This PR does not touch core/verify.py, cpp/core/verify.cpp, or either lowerer.
2 N/A This PR does not modify scf.for structure, verifier rules, or block terminators.
3 N/A This PR does not modify core IRBuilder SSA naming, intrinsic declaration tables, or metadata slot numbering.
4 N/A This PR does not touch IR type definitions, SmemType, or IR parsers.
5 N/A This PR does not touch core/passes.py, cpp/core/passes.cpp, or opcode purity tables.
6 N/A This PR does not modify constant folding in either engine.
7 N/A This PR does not modify core kernel attribute contracts, codegen_policy.py, or cluster dimension checks.
8 N/A This PR does not touch CodegenPolicy, SchedulerStrategy, or scheduler strategy application.
9 N/A This PR does not touch waitcnt encoding, barrier lowering, or optimization_barrier.
10 N/A This PR does not modify Python or C++ lowerer attribute validation or parameter lowering.
11 N/A This PR does not touch ArchTarget or architecture target resolution in core/arch/.
12 N/A This PR does not modify core target catalogs, vector-load caps, or codegen arch defaults.
13 N/A This PR does not touch any public C structs, enums, or ABI versions under cpp/include/rocke/.
14 NEEDS-INFO platform/CMakeLists.txt is modified in this PR, but its diff is omitted from the prompt so compiler flag and build changes cannot be verified.
15 N/A This PR does not touch C++ engine fallback handling, flavor resolution, or debug lowerers.
16 N/A This PR does not touch the C++ library, known_gaps.md, or gfx1250 lowering/builders.
§P graded 14/14
# Verdict Evidence
1 PASS dnn-providers/hip-kernel-provider/rocke/library/kernels/gfx950/gdn_decode.py:746 adds row_loads: RowLoads = "auto" as a defaulted field on GdnDecodeSpec without altering build_gdn_decode(spec, arch=ARCH) (seen at dnn-providers/hip-kernel-provider/rocke/library/tests/test_gdn_decode_fused.py:192).
2 N/A The PR does not modify kernel argument signatures, argument packing, or GEMM/convolution ABI orders.
3 PASS dnn-providers/hip-kernel-provider/rocke/library/builders/gfx950/gdn/gdn_decode.py:604-608 defines launch_config using grid=gdn_decode_grid(batch, spec) and block=(spec.block_size, 1, 1), and tests use result.grid and result.block (dnn-providers/hip-kernel-provider/rocke/library/tests/test_gdn_decode_gfx950_numeric.py:172).
4 N/A The PR does not add or modify LDS capacity gates or LDS allocation sizing.
5 N/A The PR does not touch WMMA/RDNA GEMM, GemmMultiD, or GemmMultiAbd paths.
6 N/A The PR does not touch Stream-K, MoE sorting, fused MoE, or split-K caller-zeroed workspaces.
7 N/A The PR does not modify Stream-K, persistent GEMM, GroupedGemmLauncher, or SUPPORT_MATRIX.md.
8 N/A The PR does not add or modify quantization helpers or MX GEMM scale decoding.
9 PASS dnn-providers/hip-kernel-provider/rocke/library/dispatch/gdn/gate_rules.py:48-58 and dnn-providers/hip-kernel-provider/rocke/library/tests/dispatch/gdn/test_gate_rules.py:56-91 test the fp32 gate at NaN, Inf, tolerance boundary (nextafter), and untouched-slot bit-exact spill edges.
10 N/A The PR does not touch helpers/manifest.py or add a runtime manifest kind.
11 PASS dnn-providers/hip-kernel-provider/rocke/library/builders/gfx950/gdn/gdn_decode.py:806-864 (ColdGraph.replay_us, capture_cold, device_us) keeps value_sets alive across graph capture and replay, times replays with torch.cuda.Event(enable_timing=True) outside compilation, and calls drain() (synchronize_and_release) in finally.
12 N/A The PR does not modify COMGR or HIP library loading or fix a hipError launch failure.
13 PASS dnn-providers/hip-kernel-provider/rocke/library/kernels/gfx950/gdn_decode.py:855-859 and dnn-providers/hip-kernel-provider/rocke/library/dispatch/gdn/rules.py:169-180 update kernel naming and knob canonicalization for row_loads, with tests in dnn-providers/hip-kernel-provider/rocke/library/tests/dispatch/gdn/test_tuning_contract.py:329-424 and numeric tests in…
14 N/A The PR does not touch examples/, expected.json, platform/python/rocke/instances/, or promote helpers to platform/python/rocke/helpers/.
§Q graded 7/7
# Verdict Evidence
1 NEEDS-INFO The diff for dnn-providers/hip-kernel-provider/rocke/platform/CMakeLists.txt is omitted (+15 -4 lines), and ROCKE_ENGINE_test_categories_external.yaml is not shown, so we cannot verify that added tests (test_cli_args.py, test_gate_rules.py, test_gdn_decode_defaults_report.py, test_gdn_decode_table_sweep.py, test_gdn_decode_timing.py) are registered and test_gdn_decode_tune.py is removed.
2 N/A This PR does not add a new platform kernel family or variant; it adds GDN/KDA library decode sweep/report tools and a row_loads knob on the existing Python library GDN decode kernel…
3 PASS Gates and golden checks are graded for what they prove, with numeric validation separated into fp32 reference gates (dnn-providers/hip-kernel-provider/rocke/library/dispatch/gdn/gate_rules.py:39, dnn-providers/hip-kernel-provider/rocke/library/builders/gfx950/gdn/gdn_decode.py:675) and golden IR hashes treated as tripwires (dnn-providers/hip-kernel-provider/rocke/library/tests/test_gdn_decode_golden.py:391).
4 NEEDS-INFO The diff for dnn-providers/hip-kernel-provider/rocke/library/tests/golden/gdn_decode_gfx950_ir_sha256.json is omitted (+768 -0 lines), so we cannot verify in the diff that all entries in LLVM_FLAVORS were recorded.
5 PASS New CPU tests are torch-free and GPU-free (dnn-providers/hip-kernel-provider/rocke/library/tests/dispatch/gdn/test_cli_args.py:72, dnn-providers/hip-kernel-provider/rocke/library/tests/dispatch/gdn/test_gate_rules.py:172), Windows backslash paths are handled cleanly (dnn-providers/hip-kernel-provider/rocke/library/tests/test_gdn_decode_defaults_report.py:350), and toolchain-dependent compile helpers skip cleanly…
6 N/A This PR does not refactor any platform IR/lowering gate or differential harness.
7 N/A This PR does not change platform C++/Python backend rejection contracts or ROCKE_BACKEND / ROCKE_CPP_STRICT fallback behavior.
§R graded 11/11
# Verdict Evidence
1 NEEDS-INFO The diff adds a new emitted-code load-order lever via row_loads in dnn-providers/hip-kernel-provider/rocke/library/kernels/gfx950/gdn_decode.py:739 and a sweep tool that can enumerate registry configurations in dnn-providers/hip-kernel-provider/rocke/library/benchmarks/gfx950/gdn/decode_table_sweep.py:5, but it does not include the actual correctness-pruned sweep rows or name the best existing baseline for the target shapes.
2 NEEDS-INFO row_loads is documented as a new tuning axis in dnn-providers/hip-kernel-provider/rocke/library/dispatch/gdn/axes.py:26, but the relevant documentation hunks are truncated, so I cannot verify every changed lever is mapped to runbook sections, the matching op checklist, and gfx950-specific guidance with any anti-pattern/failure-mode rationale.
3 NEEDS-INFO The row_loads lever changes where late row inputs load in dnn-providers/hip-kernel-provider/rocke/library/kernels/gfx950/gdn_decode.py:342, but the available diff does not show a utilities-skill citation or measured justification against the relevant load/prefetch and launch-shape skills; omitted documentation hunks may contain it.
4 NEEDS-INFO The intended primitive can change because row_loads affects kernel naming and emitted order in dnn-providers/hip-kernel-provider/rocke/library/kernels/gfx950/gdn_decode.py:852, but the diff does not include before/after probe_occupancy.py, probe_regs.py, intrinsic/ISA inspection, or lowering-compare evidence.
5 NEEDS-INFO The new row_loads path changes global load order through late_row_inputs in dnn-providers/hip-kernel-provider/rocke/library/kernels/gfx950/gdn_decode.py:449, but the diff does not include analyze_coalescing, vector transaction, CoalescingReport summary, or assert_asm_backed evidence for the changed accesses.
6 N/A The visible diff changes load order, tuning enumeration, and timing/report tooling, not LDS or MMA layouts.
7 N/A The visible diff does not make a bottleneck claim such as memory-bound, LDS-bound, barrier-bound, or latency-bound.
8 N/A The visible diff does not change wait instructions, barriers, or scheduler hints.
9 N/A The visible diff is not presented as a perf-regression fix and does not change an auto default or dispatch heuristic that trades one shipped shape family against another.
10 PASS The methodology code records comparable builds and withholds mixed or non-cold rows in dnn-providers/hip-kernel-provider/rocke/library/benchmarks/gfx950/gdn/decode_table_sweep.py:871, and the timing helper uses replay medians rather than a lucky minimum in dnn-providers/hip-kernel-provider/rocke/library/builders/gfx950/gdn/gdn_decode.py:870.
11 FAIL The PR registers new sweep/report console tools in dnn-providers/hip-kernel-provider/rocke/library/pyproject.toml:41 and adds the sweep tool in dnn-providers/hip-kernel-provider/rocke/library/benchmarks/gfx950/gdn/decode_table_sweep.py:1, but the changed files do not include the required optimization utilities README or dsl_probes README entry for the new tool.
§S graded 8/8
# Verdict Evidence
1 NEEDS-INFO rocke/dispatch/tuning/__init__.py:87 adds typed_knobs and space.py:57 adds outer_dependent_knobs, and kernels/gfx950/gdn_decode.py:147-151 exports new row_loads helpers; while library/tests/dispatch/gdn/test_tuning_contract.py:309-372 and library/tests/dispatch/gdn/test_gate_rules.py:1 are visible, the diffs for platform/tests/dispatch/dispatch_tests/tuning/test_tuning_template.py, platform/CMakeLists.txt, library/tests/test_gdn_decode_table_sweep.py, and library/tests/test_gdn_decode_timing.py are omitted.
2 PASS Existing API changes (dispatch_gdn_decode_all signature in library/dispatch/gdn/__init__.py:76 and gdn_decode.check return type in library/builders/gfx950/gdn/gdn_decode.py:646-648) update callers and expectations across library/tests/dispatch/gdn/test_tuning_contract.py:683-723, library/tests/test_gdn_decode_gfx950_numeric.py:137-138, and library/tests/test_gdn_decode_fused_gfx950_numeric.py:114-115.
3 PASS The removed library/builders/gfx950/gdn/tune.py and renamed late_row_inputs -> auto_late_row_inputs (keeping late_row_inputs as the public wrapper in library/kernels/gfx950/gdn_decode.py:354,452) update import sites in library/benchmarks/gfx950/gdn/benchmark_kda_decode.py:43 and are stated in the PR description.
4 NEEDS-INFO platform/python/rocke/dispatch/tuning/__init__.py:43,87 and library/kernels/gfx950/gdn_decode.py:147-151 edit __all__ and resolve to real attributes (space.py:464, gdn_decode.py:230,345,354,452,460), but the diffs for platform/tests/dispatch/dispatch_tests/tuning/test_tuning_template.py and library/tests/test_gdn_decode_knobs.py are omitted so __all__ import coverage cannot be verified from the diff.
5 PASS Tests assert behavioral outputs and fail-fast negative raises with exact exception types and offending parameters in library/tests/dispatch/gdn/test_cli_args.py:19-43, library/tests/dispatch/gdn/test_gate_rules.py:49-169, library/tests/dispatch/gdn/test_tuning_contract.py:721-738, and library/tests/test_gdn_decode_defaults_report.py:66-105,328-418.
6 PASS CPU-checkable contracts (CLI parsing, gate verdict math, cold rotation copy count, tuning space rules, defaults report, and golden IR hashes) are tested without torch or a GPU in library/tests/dispatch/gdn/test_cli_args.py:72-87, library/tests/dispatch/gdn/test_gate_rules.py:172-185, library/tests/test_gdn_decode_defaults_report.py:1, and library/tests/test_gdn_decode_golden.py:198-202.
7 N/A The modified APIs are in the Python-only dispatcher/tuning layer (platform/python/rocke/dispatch/tuning/) and library GDN kernel/benchmarks (library/), which have no C++ twin or C ABI change in this diff.
8 NEEDS-INFO The PR body names the GPU arch (gfx950) and lists pytest suites run, and touched platform/python/rocke/dispatch/README.md:224-230, but does not explicitly state running PYTHONDONTWRITEBYTECODE=1 PYTHONPATH=python:../library python tests/test_rocke.py and python tests/run_all.py from rocke/platform/.

The scored-rows filter called shape_summary(shape_rows) for every row, and that
function rescans its shape, so a large stage-1 sweep scanned each shape once per
row. The summaries are now built once per shape and reused for the filter and
the printed table.
_toolchain() imported torch only to record torch.__version__. It now reads the
installed package's version through importlib.metadata, so the tool module does
not import torch for provenance and a host without torch records unknown.
…rtion

The assertion spelled out a made-up auto time. The fake stage 1 now records the
time it invents and the test compares the printed line with that value, so the
file carries no figure that reads as a latency.
…om the environment

The reproduce script read SWEEP_JOBS from os.environ only to size its worker pool.
It now reads the count from its first argument (default 32); the prose and the
command are updated to match.

@yraparti yraparti left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

rocKE checklist re-review of the fixes since 3e6822d18874

ROCm/rocm-libraries#14632 · 5f0837fff8a7 · model gemini-4-argon, fallback gpt-5.5

PASS · graded 238/238 · BLOCKER 0, HIGH 2, MEDIUM 2, LOW 1, NEEDS-INFO 30

The diff was truncated before grading. Items that needed a missing hunk are NEEDS-INFO.

Since the last review (3e6822d18874)

Resolved 4 · still open 4 · new 1

  • ✅ §D.1 was FAIL, now PASS — had asked: Put the knob on the KernelSpec and delete the environment read.
  • ✅ §E.17 was FAIL, now PASS — had asked: Remove the absolute figure. Keep code comments qualitative.
  • ✅ §K.3 was FAIL, now PASS — had asked: State the tuning-store migration for the re-keyed GDN decode tuning_ids in the PR description (or document that no stored GDN pins exist in tree / how external pins are migrated).
  • ✅ §R.11 was FAIL, now NEEDS-INFO — had asked: Add a checked-in entry for the new GDN decode sweep/report tool to platform/dsl_docs/optimization/utilities/README.md or the dsl_probes README, and link it from the relevant runbook lesson section if it captures a new optimization lesson.
  • ⏳ §C.5 still FAIL (MEDIUM): Land the row_loads knob and its golden/tuning-space changes in their own PR (#14720) and rebase this sweep/report tools PR on top of it.
  • ⏳ §E.2 still FAIL (MEDIUM): Query the device through rocke.runtime.hip_module instead of importing torch.
  • ⏳ §E.9 still FAIL (LOW): Land the row_loads knob (#14720) in its own PR before or separate from the sweep/report tools PR.
  • ⏳ §K.5 still FAIL (HIGH): Remove outer_dependent_knobs from KnobSpace (space.py:53-57) and do not read waves_per_eu (outer_knob) inside inert() / base_value() (rules.py:263-266).
  • 🆕 §Q.2 new FAIL (HIGH): Add one rocke_ir_parity_harness.py cases() entry per new row_loads variant per supported arch, or remove the new emitted-IR variant until C++ parity coverage is added.

Findings

  • HIGH §K · dnn-providers/hip-kernel-provider/rocke/library/dispatch/gdn/rules.py:263 · Remove outer_dependent_knobs from KnobSpace (space.py:53-57) and do not read waves_per_eu (outer_knob) inside inert() / base_value() (rules.py:263-266).
  • HIGH §Q · dnn-providers/hip-kernel-provider/rocke/library/kernels/gfx950/gdn_decode.py:739 · Add one rocke_ir_parity_harness.py cases() entry per new row_loads variant per supported arch, or remove the new emitted-IR variant until C++ parity coverage is added.
  • MEDIUM §C · dnn-providers/hip-kernel-provider/rocke/library/kernels/gfx950/gdn_decode.py:230 · Land the row_loads knob and its golden/tuning-space changes in their own PR (#14720) and rebase this sweep/report tools PR on top of it.
  • MEDIUM §E · dnn-providers/hip-kernel-provider/rocke/library/benchmarks/gfx950/gdn/decode_table_sweep.py:1685 · Query the device through rocke.runtime.hip_module instead of importing torch.
  • LOW §E · dnn-providers/hip-kernel-provider/rocke/library/kernels/gfx950/gdn_decode.py:746 · Land the row_loads knob (#14720) in its own PR before or separate from the sweep/report tools PR.

Needs info

  • §E.7 Full diffs for ALGORITHM.md, README.md, and platform/dsl_docs/instances/gdn.md are omitted from the prompt (only a small hunk of CASE_STUDY.md:306 is shown), so complete doc synchronization with the new row_loads knob and tools cannot be verified from the provided hunks.
  • §E.10 The diffs for dnn-providers/hip-kernel-provider/rocke/library/tests/golden/gdn_decode_gfx950_ir_sha256.json and dnn-providers/hip-kernel-provider/rocke/platform/CMakeLists.txt are omitted, and open PR overlap cannot be verified from the diff alone.
  • §E.15 dnn-providers/hip-kernel-provider/rocke/library/benchmarks/gfx950/gdn/decode_table_sweep.py is truncated after line 975 (out of 1749 lines), so parameter usage across all functions cannot be verified.
  • §F.6 The new commits (3e6822d18874..5f0837fff8a7) do not provide local pre-commit execution output or CI status confirming pre-commit passed before push.
  • §F.7 The diff and PR body do not include the GitHub review thread records to verify that all bot/Copilot threads are resolved or have filed ticket IDs for deferred items.
  • §F.11 The diff does not contain output from gh api or gh pr view --json body,title verifying that the PR body and title persisted via the API.
  • §G.6 Only the delta of CASE_STUDY.md (lines 306–385) is shown; the full diffs for ALGORITHM.md, CASE_STUDY.md, and README.md are omitted from the diff, and decode_table_sweep.py remains truncated after line 948.
  • §G.7 The diffs for ALGORITHM.md and README.md (and most of CASE_STUDY.md) are omitted from the prompt.

Section notes

  • §D: Re-reviewed items 12-21 at head 5f0837f; the new commits in decode_table_sweep.py, CASE_STUDY.md, and tests do not affect any grades in this section.
  • §E: Items 2 and 17 from the previous review are resolved by the new commits; item 9 remains a LOW failure as the row_loads knob feature is still bundled into the tools PR.
  • §G: Items 1–17 of 34 in section G, re-reviewed at head 5f0837f.
  • §H: No device-side masks, bounds, indirection table reads, or launch inputs feeding device bounds are added or modified in this PR. kernels/gfx950/gdn_decode.py only adds the row_loads scheduling knob (auto, first, late) which controls instruction ordering (LATE_ROW_INPUTS), and the commits since the previous review only update benchmark/sweep/test files.
  • §J: Shapes: | Eq / Site | Operands | Inner dims | Result vs declared | |---|---|---|---| | ALGORITHM.md, CASE_STUDY.md, builders/gfx950/gdn/README.md, gdn.md | (diff omitted) | (diff omitted) | Cannot verify; Markdown hunks for ALGORITHM.md (+140/-45), CASE_STUDY.md (+162/-5, except lines 306-384 in incremental diff), README.md (+259/-57), and gdn.md (+20/-9) are truncated | Symbols: | Symbol | Defined at | Domain | |---|---|---| | outer_dependent_knobs | platform/python/rocke/dispatch/README.md:228 | frozenset of knob names whose drop rules depend on outer_knob | | row_loads | platform/python/rocke/dispatch/README.md:228 | {"auto", "first", "late"} load-order knob | | waves_per_eu | platform/python/rocke/dispatch/README.md:229 | Outer occupancy knob (0..8) | | SWEEP_JOBS -> sys.argv[1] | library/builders/gfx950/gdn/CASE_STUDY.md:309-382 | Worker pool count (default 32) | Novelty: | Claim | Site | Status vs develop | |---|---|---| |…
  • §K: Identity table: (1) Added row_loads: RowLoads = 'auto' to GdnDecodeSpec (kernels/gfx950/gdn_decode.py:746) and ROW_LOADS_AXIS (dispatch/gdn/axes.py:66): enters _SPEC_DEFAULTS (dispatch/gdn/rules.py:101-105), which changes config_key for every GDN decode configuration via the defaults fingerprint; TUNING_ID_VERSION is not bumped (intended, since defaults fingerprint already separates old and new ids); all prior GDN decode stored pins are refused with PinRefused; PR body explicitly states this migration under 'The row-load knob -> Tuning ids'.

Graded with the rocKE PR checklist, one model pass per section. FAIL rows that sit on a diff line are inline comments.

§A graded 14/14
# Verdict Evidence
1 PASS dnn-providers/hip-kernel-provider/rocke/library/kernels/gfx950/gdn_decode.py:345 modifies only the existing documented Python-only gfx950 GDN decode family (platform/dsl_docs/development/known_gaps.md); no new kernel family is introduced and no GEMM/conv/attention…
2 N/A No core IR (core/ir) or lowering (core/lower_*) files are modified in this PR.
3 PASS dnn-providers/hip-kernel-provider/rocke/library/dispatch/gdn/init.py:76 and dnn-providers/hip-kernel-provider/rocke/platform/python/rocke/dispatch/tuning/space.py:57 touch only the Python-only rocke.dispatch / library/dispatch layer and the Python-only gfx950…
4 N/A No C++ kernel twin exists for the gfx950 GDN/KDA decode kernel modified in this PR.
5 PASS dnn-providers/hip-kernel-provider/rocke/library/tests/test_gdn_decode_golden.py:201 leaves existing golden hashes untouched and only appends new knob_row_loads_* entries to gdn_decode_gfx950_ir_sha256.json.
6 PASS dnn-providers/hip-kernel-provider/rocke/library/tests/test_gdn_decode_golden.py:391 and the PR validation notes explicitly distinguish the Python GDN IR golden hash test from the cross-engine C++ parity gate.
7 PASS dnn-providers/hip-kernel-provider/rocke/library/kernels/gfx950/gdn_decode.py:455 guards late_row_inputs so that spec.row_loads == "auto" or not row_loads_applies(spec) delegates to auto_late_row_inputs(spec), preserving identical IR on all existing default…
8 N/A No C++ code or C++-backed kernel is modified in this PR.
9 N/A No shared op-handler or lowerer changes are made in this PR.
10 PASS dnn-providers/hip-kernel-provider/rocke/library/tests/test_gdn_decode_golden.py:391 (_row_loads_cases) adds golden hash entries for the new row_loads knob across gdn/kda, state dtypes bf16/f32/f16, head dims 64/128/256, and waves_per_eu floors across all…
11 N/A No new IR op is added in this PR.
12 N/A core/backend.py and ROCKE_BACKEND handling are not touched in this PR.
13 N/A LLVM .ll emission and debug location handling are not modified in this PR.
14 N/A No classic helpers under rocke/helpers/ or platform/cpp/helpers/ are modified in this PR.
§B graded 6/6
# Verdict Evidence
1 PASS New row_loads validation in dnn-providers/hip-kernel-provider/rocke/library/kernels/gfx950/gdn_decode.py:926-927 rejects only invalid enum values outside ROW_LOADS, and dnn-providers/hip-kernel-provider/rocke/library/dispatch/gdn/gfx950.py:233-239 rejects…
2 PASS dnn-providers/hip-kernel-provider/rocke/library/dispatch/gdn/rules.py:268-269 delegates GdnDecodeSpace.validate directly to is_valid_spec(kernel, arch=self.arch) defined in dnn-providers/hip-kernel-provider/rocke/library/kernels/gfx950/gdn_decode.py:926.
3 PASS No AUTO_DEFAULTS selection changes (dnn-providers/hip-kernel-provider/rocke/library/dispatch/gdn/axes.py:147), and invalid stored tuning_id pins refuse loudly with "no fallback was selected" in…
4 PASS dnn-providers/hip-kernel-provider/rocke/library/kernels/gfx950/gdn_decode.py:236-240 and 926-927 validate row_loads with strict type(value) is str and value in ROW_LOADS, and…
5 PASS The newly opened row_loads configurations are covered in dnn-providers/hip-kernel-provider/rocke/library/tests/test_gdn_decode_golden.py:391-453, dnn-providers/hip-kernel-provider/rocke/library/tests/test_gdn_decode_fused.py:303-309, and…
6 PASS dnn-providers/hip-kernel-provider/rocke/library/kernels/gfx950/gdn_decode.py:923-927 checks only functional enum membership in _knob_error (which feeds is_valid_spec), explicitly leaving spill/performance trade-offs to dispatch and the sweep.
§C graded 10/10
# Verdict Evidence
1 PASS Repeated CLI parsing, fp32 gate rules, cold-memory timing, and HSACO resource compilation were consolidated into shared helpers in dnn-providers/hip-kernel-provider/rocke/library/dispatch/gdn/cli_args.py:21…
2 PASS No bespoke shape-class builders or forked IR harnesses are introduced; the row-load order is parameterized as a spec knob on GdnDecodeSpec in dnn-providers/hip-kernel-provider/rocke/library/kernels/gfx950/gdn_decode.py:746 and benchmarks/sweeps invoke the shared…
3 PASS kernel_name() in dnn-providers/hip-kernel-provider/rocke/library/kernels/gfx950/gdn_decode.py:856 only appends codegen knob tokens ('rlf'/'rll' from _ROW_LOADS_TOKEN) and never workload sizes.
4 PASS Arch-independent tuning space logic lives in dnn-providers/hip-kernel-provider/rocke/platform/python/rocke/dispatch/tuning/space.py:57 while gfx950-specific kernel, builder, and benchmark code remains under gfx950 directories such as…
5 FAIL Not resolved since the previous review: the PR still bundles two separable changes into a 48-file diff—the row_loads kernel/tuning knob (from #14720) in dnn-providers/hip-kernel-provider/rocke/library/kernels/gfx950/gdn_decode.py:230 and dnn-providers/hip-kernel-provider/rocke/platform/python/rocke/dispatch/tuning/space.py:57 alongside the new in-tree sweep/report tools in dnn-providers/hip-kernel-provider/rocke/library/benchmarks/gfx950/gdn/decode_table_sweep.py:1.
6 PASS The PR extracts torch-free rules (dnn-providers/hip-kernel-provider/rocke/library/dispatch/gdn/gate_rules.py:1), generalizes KnobSpace.outer_dependent_knobs (dnn-providers/hip-kernel-provider/rocke/platform/python/rocke/dispatch/tuning/space.py:57), and avoids…
7 PASS Removing obsolete builders/gfx950/gdn/tune.py and deduplicating gate/timing helpers across benchmarks and tests preserves existing default kernel names and IR hashes while adding new knob coverage in…
8 PASS The PR reuses existing platform helpers such as iter_at_level and sample_count from rocke.dispatch.tuning.walk in dnn-providers/hip-kernel-provider/rocke/library/dispatch/gdn/init.py:30 and analyze_hsaco / compile_kernel in…
9 PASS NaN-unsafe error comparisons and warm-cache timing were treated as bug classes and replaced across the driver, sweep, benchmarks, and numeric tests via Gate.passed and cold_copy_count in dnn-providers/hip-kernel-provider/rocke/library/dispatch/gdn/gate_rules.py:48 and…
10 PASS Widening GdnDecodeSpec and AXES with row_loads and KnobSpace with outer_dependent_knobs updated all consumers across kernel validation, naming, dispatch scope checks, tuning space stream/is_valid, golden tests, and docs in…
§D graded 21/21
# Verdict Evidence
1 PASS The previous FAIL is resolved: the os.environ.get("SWEEP_JOBS") read in dnn-providers/hip-kernel-provider/rocke/library/builders/gfx950/gdn/CASE_STUDY.md:382 was replaced with sys.argv[1], and the row_loads knob is declared on GdnDecodeSpec…
2 PASS Coverage constants ROW_LOADS, STATE_HINTS, and _MAX_WAVES_PER_EU are imported directly from kernels.gfx950.gdn_decode in dnn-providers/hip-kernel-provider/rocke/library/dispatch/gdn/axes.py:42-47 rather than transcribed.
3 PASS scope_check in dnn-providers/hip-kernel-provider/rocke/library/dispatch/gdn/gfx950.py:223-240 runs cheap checks first (wanted == "auto" or not req.tuning_knobs) and returns a specific invariant reason without re-checking Capability fields.
4 PASS Selection in dispatch_gdn_decode and out_of_scope_knobs reads arch=req.arch from the request (dnn-providers/hip-kernel-provider/rocke/library/dispatch/gdn/__init__.py:201-207) and dispatch_gdn_decode_all takes explicit sweep_level, tuning_sample, and…
5 PASS kernel_name() adds the rlf/rll token only when row_loads_overrides(self) is True (dnn-providers/hip-kernel-provider/rocke/library/kernels/gfx950/gdn_decode.py:856-859), and GdnDecodeSpace.inert drops row_loads when _restates_auto(kernel) is True…
6 N/A This PR does not add or modify cohort routing.
7 N/A This PR does not modify heuristic/override ordering in selectors.
8 PASS The applicability and override predicates row_loads_applies and row_loads_overrides are defined once in dnn-providers/hip-kernel-provider/rocke/library/kernels/gfx950/gdn_decode.py:345-351,460-464 and imported by…
9 N/A This PR does not register a new KernelCandidate or architecture.
10 PASS The new row_loads spec field is reachable from GdnDecodeRequest.tuning_knobs through GdnDecodeSpace (dnn-providers/hip-kernel-provider/rocke/library/dispatch/gdn/rules.py:132,263) and tested through dispatch_gdn_decode and dispatch_gdn_decode_all in…
11 PASS Adding ROW_LOADS_AXIS and the sweep/report tools does not change AUTO_DEFAULTS selection (dnn-providers/hip-kernel-provider/rocke/library/dispatch/gdn/axes.py:147-185).
12 N/A No candidate priorities, candidate names, or custom rankers are added or modified in this PR.
13 PASS Pinned requests and tuning pins refuse without fallback via scope_check in dnn-providers/hip-kernel-provider/rocke/library/dispatch/gdn/gfx950.py:223-240 and are tested for PinRefused in…
14 PASS GdnDecodeSpec.kernel_name() includes a distinct token for invalid or overriding row_loads values so launchers cannot collide in _LAUNCHER_CACHE (dnn-providers/hip-kernel-provider/rocke/library/kernels/gfx950/gdn_decode.py:835-860), and no kernarg ABI layout changed.
15 N/A No new dispatch candidate or architecture module is added in this PR.
16 PASS dispatch_gdn_decode_all and gdn_sweep_space short-circuit on invalid requests and delegate to GDN_REGISTRY with sweep_level, tuning_sample, and seed in dnn-providers/hip-kernel-provider/rocke/library/dispatch/gdn/init.py:76-171.
17 PASS The new row_loads tuning axis and sweep-level sampling are covered by CPU dispatch routing and tuning contract tests in dnn-providers/hip-kernel-provider/rocke/library/tests/dispatch/gdn/test_tuning_contract.py:329-494, 681-723.
18 N/A No registry ratchet flags (require_build, require_binding, require_torch_binding) or exempt sets are modified in this PR.
19 N/A This PR concerns GDN/KDA decode tooling and tuning axes, not unified attention dispatch or run_unified_attention_torch.
20 N/A This PR does not change auto selection or any selector with a C++ consumer.
21 N/A This PR adds an explicit tuning knob (row_loads) and sweep/report tools without altering default selection or changing the emitter…
§E graded 17/17
# Verdict Evidence
1 PASS dnn-providers/hip-kernel-provider/rocke/platform/python/rocke/dispatch/tuning/space.py:47 shows platform code and tests do not import library modules.
2 FAIL dnn-providers/hip-kernel-provider/rocke/library/benchmarks/gfx950/gdn/decode_table_sweep.py:1685 adds import torch # noqa: F401 (the driver needs it; fail early and clearly)
3 PASS dnn-providers/hip-kernel-provider/rocke/library/dispatch/gdn/gate_rules.py:23 and dnn-providers/hip-kernel-provider/rocke/library/tests/dispatch/gdn/test_gate_rules.py:172 keep gate/CLI rules torch-free so CPU tests run without torch.
4 PASS dnn-providers/hip-kernel-provider/rocke/library/tests/dispatch/gdn/test_gate_rules.py:187 and dnn-providers/hip-kernel-provider/rocke/library/builders/gfx950/gdn/gdn_decode.py:39 verify downward-only imports (benchmarks -> builders -> dispatch -> kernels).
5 PASS dnn-providers/hip-kernel-provider/rocke/library/tests/_gdn_decode_compile.py:39 uses Python tempfile and pathlib rather than hardcoded /tmp or shell scripts.
6 PASS dnn-providers/hip-kernel-provider/rocke/library/kernels/gfx950/gdn_decode.py:852 preserves existing emitter handles and golden hashes (only adding new row_loads cases in dnn-providers/hip-kernel-provider/rocke/library/tests/test_gdn_decode_golden.py:201).
7 NEEDS-INFO Full diffs for ALGORITHM.md, README.md, and platform/dsl_docs/instances/gdn.md are omitted from the prompt (only a small hunk of CASE_STUDY.md:306 is shown), so complete doc synchronization with the new row_loads knob and tools cannot be verified from the provided hunks.
8 PASS dnn-providers/hip-kernel-provider/rocke/library/kernels/gfx950/gdn_decode.py:227 and dnn-providers/hip-kernel-provider/rocke/library/benchmarks/gfx950/gdn/decode_defaults_report.py:1 contain no tracking IDs, reviewer handles, or PR numbers in visible code.
9 FAIL Unresolved from previous review: dnn-providers/hip-kernel-provider/rocke/library/kernels/gfx950/gdn_decode.py:746 still bundles the unmerged row_loads spec knob feature (#14720) into the in-tree sweep and defaults report tools PR.
10 NEEDS-INFO The diffs for dnn-providers/hip-kernel-provider/rocke/library/tests/golden/gdn_decode_gfx950_ir_sha256.json and dnn-providers/hip-kernel-provider/rocke/platform/CMakeLists.txt are omitted, and open PR overlap cannot be verified from the diff alone.
11 PASS dnn-providers/hip-kernel-provider/rocke/library/pyproject.toml:44 and dnn-providers/hip-kernel-provider/rocke/platform/python/rocke/dispatch/README.md:227 show only deliverable tools, tests, and required docs are committed.
12 PASS dnn-providers/hip-kernel-provider/rocke/library/benchmarks/gfx950/gdn/benchmark_kda_decode.py:54 scopes the GDN/KDA decode tools to ARCH = 'gfx950' and the PR description explicitly scopes out gfx942.
13 PASS dnn-providers/hip-kernel-provider/rocke/library/builders/gfx950/gdn/tune.py:1 is deleted along with its test file test_gdn_decode_tune.py and its references in dnn-providers/hip-kernel-provider/rocke/library/benchmarks/gfx950/gdn/benchmark_kda_decode.py:43.
14 PASS dnn-providers/hip-kernel-provider/rocke/library/kernels/gfx950/gdn_decode.py:345 retains upstream comments and logic while extending late_row_inputs to auto_late_row_inputs without dropping upstream notes.
15 NEEDS-INFO dnn-providers/hip-kernel-provider/rocke/library/benchmarks/gfx950/gdn/decode_table_sweep.py is truncated after line 975 (out of 1749 lines), so parameter usage across all functions cannot be verified.
16 N/A Severity honesty applies to review reporting rather than the code changes in the pull request diff.
17 PASS Resolved in dnn-providers/hip-kernel-provider/rocke/library/tests/test_kda_decode_benchmark.py:273 and 312 by documenting and formatting the fake stub input (autos[0]) as non-measured test data, and…
§F graded 11/11
# Verdict Evidence
1 PASS Branch users/avirgoel/rocke/gdn-decode-tools matches the users/<user>/... prefix (dnn-providers/hip-kernel-provider/rocke/library/pyproject.toml:44).
2 PASS title feat(rocke): in-tree sweep and defaults report for gfx950 GDN/KDA decode matches type(scope): summary and is 72 characters
3 PASS description is at least 30 characters and contains an issue reference
4 PASS test file dnn-providers/hip-kernel-provider/rocke/library/tests/dispatch/gdn/test_cli_args.py is in the diff
5 PASS no key, certificate, or secret filename in the diff
6 NEEDS-INFO The new commits (3e6822d18874..5f0837fff8a7) do not provide local pre-commit execution output or CI status confirming pre-commit passed before push.
7 NEEDS-INFO The diff and PR body do not include the GitHub review thread records to verify that all bot/Copilot threads are resolved or have filed ticket IDs for deferred items.
8 N/A The PR targets Base: develop rather than a stacked feature branch.
9 N/A No splitting or trimming for a PR-size cap is present in this PR.
10 PASS Tests added in both the initial diff and the review-response commits test real behavior, such as test_torch_version_comes_from_the_package_metadata at dnn-providers/hip-kernel-provider/rocke/library/tests/test_gdn_decode_table_sweep.py:1323 and…
11 NEEDS-INFO The diff does not contain output from gh api or gh pr view --json body,title verifying that the PR body and title persisted via the API.
§G graded 34/34
# Verdict Evidence
1 PASS Correctness is verified independently of parity via the fp32 reference gate in dnn-providers/hip-kernel-provider/rocke/library/builders/gfx950/gdn/gdn_decode.py:675 and dnn-providers/hip-kernel-provider/rocke/library/dispatch/gdn/gate_rules.py:54.
2 PASS On-silicon numeric tests against the fp32 reference with bf16 tolerance (TOL = 1e-2) are implemented in dnn-providers/hip-kernel-provider/rocke/library/dispatch/gdn/gate_rules.py:35 and exercised in…
3 PASS Golden IR hashes for the new knob cases are added in dnn-providers/hip-kernel-provider/rocke/library/tests/test_gdn_decode_golden.py:391 and torch-free CPU dispatch tests are added in…
4 PASS New behavior is pinned by falsifiable tests in dnn-providers/hip-kernel-provider/rocke/library/tests/dispatch/gdn/test_tuning_contract.py:350, dnn-providers/hip-kernel-provider/rocke/library/tests/test_gdn_decode_defaults_report.py:66, and…
5 PASS Tests drive shipped public entry points (dispatch_gdn_decode, report.main, Gate.passed) and explicitly verify gate falsifiability in dnn-providers/hip-kernel-provider/rocke/library/tests/test_gdn_decode_gfx950_numeric.py:76.
6 NEEDS-INFO Only the delta of CASE_STUDY.md (lines 306–385) is shown; the full diffs for ALGORITHM.md, CASE_STUDY.md, and README.md are omitted from the diff, and decode_table_sweep.py remains truncated after line 948.
7 NEEDS-INFO The diffs for ALGORITHM.md and README.md (and most of CASE_STUDY.md) are omitted from the prompt.
8 PASS Harnesses and tools strictly validate state_dtype and dtypes without silent fallback in dnn-providers/hip-kernel-provider/rocke/library/benchmarks/gfx950/gdn/decode_table_sweep.py:139.
9 PASS Spill/scratch byte checks compile through comgr and inspect the HSACO via analyze_hsaco in dnn-providers/hip-kernel-provider/rocke/library/tests/_gdn_decode_compile.py:28.
10 PASS Benchmark and sweep scripts record device and toolchain provenance, gate on the fp32 reference before timing, and report ratios in dnn-providers/hip-kernel-provider/rocke/library/benchmarks/gfx950/gdn/benchmark_kda_decode.py:397 and…
11 PASS The new row_loads knob is wired through the dispatcher and tuning space in dnn-providers/hip-kernel-provider/rocke/library/dispatch/gdn/axes.py:66 and tested via dispatch_gdn_decode in…
12 N/A This PR modifies the Python-only GDN decode dispatcher, benchmarks, and kernel builder without introducing a cross-engine gap.
13 N/A No new LLVM intrinsic overload symbols or TableGen (.td) files are touched or recommended in this PR.
14 N/A This PR adds sweep and reporting tools and makes no bottleneck classification claims.
15 N/A This is a review process meta-instruction and the diff is provided directly in the prompt.
16 PASS Shared symbols and layering are verified by AST and bytecode inspection tests in dnn-providers/hip-kernel-provider/rocke/library/tests/dispatch/gdn/test_gate_rules.py:206.
17 PASS Shipped CLI entry points (main) are invoked in tests such as dnn-providers/hip-kernel-provider/rocke/library/tests/test_gdn_decode_defaults_report.py:328 and verified end-to-end on gfx950 per the validation table.
18 NEEDS-INFO gate and capture_cold document their blind spots (dnn-providers/hip-kernel-provider/rocke/library/builders/gfx950/gdn/gdn_decode.py:678-683, 832-835), are wired to stop timing/ranking on failure (dnn-providers/hip-kernel-provider/rocke/library/benchmarks/gfx950/gdn/benchmark_gdn_decode.py:100-110, dnn-providers/hip-kernel-provider/rocke/library/benchmarks/gfx950/gdn/benchmark_kda_decode.py:255-266…
19 PASS gate requires spare pool slots (make_inputs provides 2 * batch + 1 in dnn-providers/hip-kernel-provider/rocke/library/builders/gfx950/gdn/gdn_decode.py:687-689), callers assert spare slots exist…
20 N/A This PR does not add or modify a claim-ban detector or regex lint rule.
21 PASS decode_table_sweep.py and decode_defaults_report.py validate and propagate every input/row field (dnn-providers/hip-kernel-provider/rocke/library/benchmarks/gfx950/gdn/decode_table_sweep.py:86-119, 338-381), explicitly distinguish measured vs…
22 NEEDS-INFO The diff for dnn-providers/hip-kernel-provider/rocke/library/tests/golden/gdn_decode_gfx950_ir_sha256.json is omitted (+768 -0 lines), so it cannot be verified from the diff alone that every new golden entry carries bytes and sha256 for every flavor without build error entries.
23 NEEDS-INFO This PR makes no performance speedup claims, and its sweep/benchmark tools label every configuration axis (SHAPE_FIELDS and WALK_FIELDS in dnn-providers/hip-kernel-provider/rocke/library/benchmarks/gfx950/gdn/decode_table_sweep.py:74-88), gate both auto and candidate routes against the fp32 reference (dnn-providers/hip-kernel-provider/rocke/library/benchmarks/gfx950/gdn/benchmark_gdn_decode.py:98-110)…
24 N/A No existing golden hashes are re-blessed or modified; only new golden cases for the opt-in row_loads knob are added…
25 N/A This PR adds benchmarking/sweep tools and an opt-in tuning knob (row_loads, which is a no-op at default auto), rather than…
26 N/A This PR makes no performance benchmark claims and does not change any default kernel selection.
27 PASS The row_loads knob toggles only the single-wave fuse_conv load order (dnn-providers/hip-kernel-provider/rocke/library/kernels/gfx950/gdn_decode.py:452-465) and is tested in isolation against its auto counterpart…
28 PASS Forced row_loads values that match auto's load order are explicitly treated as 0-delta (row_loads_overrides returns False, emitting the exact auto kernel name and dropping the redundant knob in…
29 N/A This PR does not swap any guarded math primitive for a fast math primitive.
30 PASS Spill verification compiles the kernel to HSACO via comgr and inspects code-object .scratch_bytes metadata with analyze_hsaco (dnn-providers/hip-kernel-provider/rocke/library/tests/_gdn_decode_compile.py:28-53…
31 N/A This PR does not claim to fix a performance defect against a manufactured baseline.
32 PASS Every sweep row records and checks reproducible provenance (sha, device, llvm_version, llvm_flavor, backend, rocm_version, torch_version, rotate_mb, cold_target_mb, and WALK_FIELDS in…
33 PASS late_row_inputs is split into auto_late_row_inputs (preserving the exact default rule) and row_loads override (dnn-providers/hip-kernel-provider/rocke/library/kernels/gfx950/gdn_decode.py:354-386, 452-465), and test_tuning_contract.py exhaustively tables…
34 N/A This PR does not add or modify an opt-in kernel output flag.
§H graded 5/5
# Verdict Evidence
1 N/A This PR does not add or modify any hardware/resource bounds (such as buffer-SRD num_records) derived from spec fields.
2 N/A This PR does not add or modify any device-side indirection table reads or physical index calculations…
3 N/A This PR does not add or modify any device-side hot-loop integer div or mod operations.
4 N/A This PR does not add or modify any device-side mask or bound built from runtime length inputs.
5 N/A This PR does not add or modify any kernel launch inputs that feed device-side bounds or masks.
§I graded 6/6
# Verdict Evidence
1 PASS dnn-providers/hip-kernel-provider/rocke/library/benchmarks/gfx950/gdn/decode_table_sweep.py:553 and dnn-providers/hip-kernel-provider/rocke/library/benchmarks/gfx950/gdn/decode_defaults_report.py:286 walk the registered configuration space alongside auto and report…
2 PASS dnn-providers/hip-kernel-provider/rocke/library/dispatch/gdn/rules.py:241, dnn-providers/hip-kernel-provider/rocke/library/dispatch/gdn/gfx950.py:233, and dnn-providers/hip-kernel-provider/rocke/library/benchmarks/gfx950/gdn/decode_defaults_report.py:401…
3 PASS dnn-providers/hip-kernel-provider/rocke/library/tests/test_gdn_decode_golden.py:391 and dnn-providers/hip-kernel-provider/rocke/library/tests/dispatch/gdn/test_tuning_contract.py:379 combine curated golden cases and generated sweep-space enumeration across tiles…
4 PASS dnn-providers/hip-kernel-provider/rocke/library/benchmarks/gfx950/gdn/decode_table_sweep.py:891 and dnn-providers/hip-kernel-provider/rocke/library/benchmarks/gfx950/gdn/decode_defaults_report.py:286 print both shipped (auto_us, auto/fastest) and achievable…
5 PASS dnn-providers/hip-kernel-provider/rocke/library/dispatch/gdn/axes.py:143 and dnn-providers/hip-kernel-provider/rocke/library/benchmarks/gfx950/gdn/decode_defaults_report.py:394 explicitly document AUTO_DEFAULTS as a static snapshot, mark the report tool advisory…
6 N/A This PR adds tuning/benchmark tools and a high-level row_loads scheduling knob (auto/first/late), not a DSL op or API…
§J graded 7/7
# Verdict Evidence
1 NEEDS-INFO The incremental diff only touches library/builders/gfx950/gdn/CASE_STUDY.md:306-382 (worker count CLI arg); the full diffs for library/builders/gfx950/gdn/ALGORITHM.md, CASE_STUDY.md, README.md, and platform/dsl_docs/instances/gdn.md remain omitted from the truncated diff, so equations and operand shapes cannot be inspected.
2 NEEDS-INFO The incremental diff only updates CASE_STUDY.md:306-382 to replace SWEEP_JOBS with sys.argv[1]; the full diffs for library/builders/gfx950/gdn/ALGORITHM.md, CASE_STUDY.md, README.md, and platform/dsl_docs/instances/gdn.md remain omitted from the truncated diff, so symbol definitions and domains cannot be verified.
3 NEEDS-INFO Aside from CASE_STUDY.md:306-382 and platform/python/rocke/dispatch/README.md:224-232, the diffs for library/builders/gfx950/gdn/ALGORITHM.md, CASE_STUDY.md, README.md, platform/dsl_docs/instances/gdn.md, platform/python/rocke/dispatch/ARCHITECTURE.md, and rocke_dispatcher_workflow.md remain omitted from the truncated diff, so cross-doc algorithm restatements cannot be checked.
4 NEEDS-INFO While platform/python/rocke/dispatch/README.md:227-230 accurately documents outer_dependent_knobs added in platform/python/rocke/dispatch/tuning/space.py:57, the full diffs for ALGORITHM.md, CASE_STUDY.md, builders/gfx950/gdn/README.md, gdn.md, ARCHITECTURE.md, and rocke_dispatcher_workflow.md remain omitted from the truncated diff.
5 NEEDS-INFO The incremental diff in library/builders/gfx950/gdn/CASE_STUDY.md:306-382 only changes worker-count CLI parsing; the remaining hunks of ALGORITHM.md, CASE_STUDY.md, and README.md are still omitted from the truncated diff, so scaling or complexity claims cannot be verified.
6 NEEDS-INFO The diffs for library/builders/gfx950/gdn/ALGORITHM.md, CASE_STUDY.md (outside lines 306-382), README.md, and library/benchmarks/gfx950/gdn/decode_shapes.json remain omitted from the truncated diff, so constant provenance and model tables cannot be checked.
7 N/A No new design or algorithm Markdown files are added in this PR; all touched .md files (ALGORITHM.md, CASE_STUDY.md…
§K graded 13/13
# Verdict Evidence
1 PASS dnn-providers/hip-kernel-provider/rocke/library/tests/dispatch/gdn/test_tuning_contract.py:44-103 updates the contract test table (_REFUSED, representative cases with other_requests and default_knobs) for GdnDecodeSpace over make_tuned_candidate.
2 PASS dnn-providers/hip-kernel-provider/rocke/library/dispatch/gdn/axes.py:66-79 declares ROW_LOADS_AXIS ordered after its prerequisite CONV_ONCE_AXIS, and dnn-providers/hip-kernel-provider/rocke/library/dispatch/gdn/rules.py:91-93 asserts all fields of…
3 PASS Resolved since previous review: dnn-providers/hip-kernel-provider/rocke/library/kernels/gfx950/gdn_decode.py:746 and dnn-providers/hip-kernel-provider/rocke/library/dispatch/gdn/rules.py:101-105 add row_loads: RowLoads = 'auto' to _SPEC_DEFAULTS, re-keying…
4 PASS dnn-providers/hip-kernel-provider/rocke/library/dispatch/gdn/rules.py:101-105 defines _SPEC_DEFAULTS from problem-independent FIELD_DEFAULTS excluding PROBLEM_FIELDS | TILE_FIELDS.
5 FAIL Not fixed since previous review: dnn-providers/hip-kernel-provider/rocke/library/dispatch/gdn/rules.py:263-266 implements inert(self, base, kernel) calling _restates_auto(kernel) (rules.py:147-151), which calls auto_late_row_inputs (dnn-providers/hip-kernel-provider/rocke/library/kernels/gfx950/gdn_decode.py:354-389) and reads spec.waves_per_eu (the outer_knob), and dnn-providers/hip-kernel-provider/rocke/platform/python/rocke/dispatch/tuning/space.py:53-57 adds outer_dependent_knobs to let inert() read…
6 PASS dnn-providers/hip-kernel-provider/rocke/library/dispatch/gdn/rules.py:268-269 delegates validate(self, base, kernel) to is_valid_spec(kernel, arch=self.arch) (dnn-providers/hip-kernel-provider/rocke/library/kernels/gfx950/gdn_decode.py:926), gating both sweeps…
7 PASS dnn-providers/hip-kernel-provider/rocke/library/dispatch/gdn/gfx950.py:225 builds base = make_spec(req, tile) purely from request fields and tile tuple without device probes or live state.
8 PASS dnn-providers/hip-kernel-provider/rocke/platform/python/rocke/dispatch/tuning/space.py:464-467 (typed_knobs) and dnn-providers/hip-kernel-provider/rocke/library/dispatch/gdn/rules.py:174-176 coerce JSON scalars losslessly to axis types and refuse invalid types…
9 NEEDS-INFO dnn-providers/hip-kernel-provider/rocke/library/benchmarks/gfx950/gdn/decode_table_sweep.py:665-678 (config_row) records spec_id, tuning_id, and knobs, but spec_hash is not in ROW_KEYS (decode_table_sweep.py:86-107) and decode_table_sweep.py is still truncated after line 969 before the stage-2 replay implementation.
10 PASS dnn-providers/hip-kernel-provider/rocke/platform/python/rocke/dispatch/tuning/space.py:461 (KnobSpace.find) and dnn-providers/hip-kernel-provider/rocke/library/benchmarks/gfx950/gdn/decode_table_sweep.py:596-618 (shape_configs) resolve bare tuning_ids only…
11 PASS dnn-providers/hip-kernel-provider/rocke/library/dispatch/gdn/__init__.py:76-111 scopes sweep_level via iter_at_level and validates tuning_sample via sample_count, and…
12 PASS dnn-providers/hip-kernel-provider/rocke/library/dispatch/gdn/axes.py:147-185 leaves AUTO_DEFAULTS unchanged and row_loads defaults to 'auto', which emits identical IR and kernel names to pre-PR develop…
13 PASS dnn-providers/hip-kernel-provider/rocke/library/benchmarks/gfx950/gdn/decode_table_sweep.py:594-621 takes configurations directly from dispatch_gdn_decode_all and dnn-providers/hip-kernel-provider/rocke/library/benchmarks/gfx950/gdn/decode_defaults_report.py:5-6…
§L graded 10/10
# Verdict Evidence
1 N/A This PR does not add or modify any gfx architecture target or ISA backend.
2 N/A This PR does not add or modify any MMA/WMMA op_id, fragment info, or arch_specs.json entry.
3 N/A The GDN/KDA decode kernel and tools touched by this diff do not select, emit, or modify MMA/MFMA atoms or layouts.
4 N/A This PR does not touch ArchTarget.wave_size or introduce cross-target wave-size logic.
5 N/A All kernel and benchmark changes in this PR are scoped to gfx950 GDN/KDA decode and do not share or leak recipes across gfx942 or…
6 N/A This PR does not touch ArchTarget, core/arch/, or instance policy modules, nor does it import CK Tile's dispatcher.
7 N/A This PR does not add or change any logical dtype, bit-packing routine, instruction fragment, or FP8 dialect handling.
8 N/A This PR does not touch scaled-MMA contracts, WMMA op ids, or MfmaAtom.emit_scaled().
9 N/A This PR does not add a new gfx architecture target.
10 N/A This PR does not touch intrinsic_arch_domain..json artifacts or LLVM flavor membership lists.
§M graded 10/10
# Verdict Evidence
1 PASS dnn-providers/hip-kernel-provider/rocke/library/kernels/gfx950/gdn_decode.py:452 — row_loads_applies, auto_late_row_inputs, and late_row_inputs operate purely on host-time GdnDecodeSpec attributes (bool/str/int), never SSA Values.
2 N/A The diff does not touch legalize_for_target, core/, or any ISA backend.
3 N/A The diff does not touch ck.dsl.ir/v1 serialization in core/ir_serialize.py or cpp/core/ir/serialize.cpp.
4 N/A The diff does not touch portable IR (rocke.ir/v1, rocke.recipe/v1, rocke.bundle/v1), recipe_expand.py, or recipe_vm.cpp.
5 N/A The diff does not touch AsyncTileLoader or LdsLayout.
6 N/A The diff does not emit or modify kernel barriers, memory load instructions, or cross-lane XOR shuffles.
7 N/A The diff does not touch ISABackend.buffer_rsrc_word3, buffer-resource construction, or TemporalHint lowering.
8 N/A The diff does not add LLVM intrinsic declarations or modify lowering backend selection precedence.
9 N/A The diff does not touch C++ codegen entry points or headers under cpp/include/rocke/.
10 N/A The diff does not touch !dbg metadata emission, Debug Info Version module flags, or DWARF consumers.
§N graded 18/18
# Verdict Evidence
1 N/A This PR does not add or modify any files under platform/python/rocke/helpers/.
2 N/A This PR does not change kernel use of helpers, MFMA atoms, TensorView, or transform DAGs.
3 N/A This PR does not add or modify any SoftwarePipeline usage.
4 N/A This PR does not add or modify EpilogueOp or graph fusion patterns.
5 N/A This PR does not add or modify any public tiling APIs under rocke.helpers.tiling.
6 N/A This PR does not add or modify front-door/toolbox tiling helpers or LayoutStyle classes.
7 N/A This PR does not touch tiling layout overrides or MMA soundness validation.
8 N/A This PR does not touch tiling LDS memory allocation, stores, reads, or global load predication.
9 N/A This PR does not touch N-D tensor axis roles, batch reductions, or FlowStage labels in tiling.
10 N/A This PR does not change tiling emit, LDS staging, or MMA issue logic.
11 N/A This PR does not touch tiling MMA traits, lds_swizzle policies, or derive_sched_group_counts.
12 N/A This PR makes no LDS bank-conflict or global memory coalescing claims.
13 N/A This PR does not build WarpDistributionEncoding, call make_tile_desc, or touch RegisterMapper.
14 N/A This PR does not use tiling data-movement verbs or add a new LDS pipeline variant.
15 N/A This PR does not modify tiling allocation or bounds checks on transformed address ranges.
16 N/A This PR does not use optimize_layout or evaluate_transform.
17 N/A This PR does not touch the tiling recorder, round-trip analysis, or visualization.
18 N/A This PR does not touch interleaved tiling layouts or demo kernels under helpers/tiling/kernels/.
§O graded 16/16
# Verdict Evidence
1 N/A This PR does not touch core/verify.py, cpp/core/verify.cpp, or either lowerer.
2 N/A This PR does not modify scf.for structure, verifier rules, or block terminators.
3 N/A This PR does not modify core IRBuilder SSA naming, intrinsic declaration tables, or metadata slot numbering.
4 N/A This PR does not touch IR type definitions, SmemType, or IR parsers.
5 N/A This PR does not touch core/passes.py, cpp/core/passes.cpp, or opcode purity tables.
6 N/A This PR does not modify constant folding in either engine.
7 N/A This PR does not modify core kernel attribute contracts, codegen_policy.py, or cluster dimension checks.
8 N/A This PR does not touch CodegenPolicy, SchedulerStrategy, or scheduler strategy application.
9 N/A This PR does not touch waitcnt encoding, barrier lowering, or optimization_barrier.
10 N/A This PR does not modify Python or C++ lowerer attribute validation or parameter lowering.
11 N/A This PR does not touch ArchTarget or architecture target resolution in core/arch/.
12 N/A This PR does not modify core target catalogs, vector-load caps, or codegen arch defaults.
13 N/A This PR does not touch any public C structs, enums, or ABI versions under cpp/include/rocke/.
14 NEEDS-INFO platform/CMakeLists.txt is modified in this PR (+15 -4 lines), and its diff remains omitted from the prompt so compiler flag and build changes cannot be verified.
15 N/A This PR does not touch C++ engine fallback handling, flavor resolution, or debug lowerers.
16 N/A This PR does not touch the C++ library, known_gaps.md, or gfx1250 lowering/builders.
§P graded 14/14
# Verdict Evidence
1 PASS dnn-providers/hip-kernel-provider/rocke/library/kernels/gfx950/gdn_decode.py:746 adds row_loads: RowLoads = "auto" as a defaulted field on GdnDecodeSpec without altering build_gdn_decode(spec, arch=ARCH) (seen at…
2 N/A The PR does not modify kernel argument signatures, argument packing, or GEMM/convolution ABI orders.
3 PASS dnn-providers/hip-kernel-provider/rocke/library/builders/gfx950/gdn/gdn_decode.py:600-608 defines launch_config using grid=gdn_decode_grid(batch, spec) and block=(spec.block_size, 1, 1), and tests use result.grid and result.block…
4 N/A The PR does not add or modify LDS capacity gates or LDS allocation sizing.
5 N/A The PR does not touch WMMA/RDNA GEMM, GemmMultiD, or GemmMultiAbd paths.
6 N/A The PR does not touch Stream-K, MoE sorting, fused MoE, or split-K caller-zeroed workspaces.
7 N/A The PR does not modify Stream-K, persistent GEMM, GroupedGemmLauncher, or SUPPORT_MATRIX.md.
8 N/A The PR does not add or modify quantization helpers or MX GEMM scale decoding.
9 PASS dnn-providers/hip-kernel-provider/rocke/library/dispatch/gdn/gate_rules.py:48-58 and dnn-providers/hip-kernel-provider/rocke/library/tests/dispatch/gdn/test_gate_rules.py:56-91 test the fp32 gate at NaN, Inf, tolerance boundary (nextafter), and untouched-slot…
10 N/A The PR does not touch helpers/manifest.py or add a runtime manifest kind.
11 PASS dnn-providers/hip-kernel-provider/rocke/library/builders/gfx950/gdn/gdn_decode.py:787-899 (ColdGraph.replay_us, capture_cold, device_us) keeps value_sets alive across graph capture and replay, times replays with torch.cuda.Event(enable_timing=True) outside…
12 N/A The PR does not modify COMGR or HIP library loading or fix a hipError launch failure.
13 PASS dnn-providers/hip-kernel-provider/rocke/library/kernels/gfx950/gdn_decode.py:855-859 and dnn-providers/hip-kernel-provider/rocke/library/dispatch/gdn/rules.py:169-180 update kernel naming and knob canonicalization for row_loads, with tests in…
14 N/A The PR does not touch examples/, expected.json, platform/python/rocke/instances/, or promote helpers to…
§Q graded 7/7
# Verdict Evidence
1 NEEDS-INFO The previous NEEDS-INFO is not resolved in the visible diff: the platform/CMakeLists.txt hunk is still omitted and ROCKE_ENGINE_test_categories_external.yaml is not shown, so registration/removal of the added and deleted tests and the CI lane cannot be verified.
2 FAIL A new emitted-IR variant knob is introduced via row_loads in dnn-providers/hip-kernel-provider/rocke/library/kernels/gfx950/gdn_decode.py:739 and row-load golden cases are added in dnn-providers/hip-kernel-provider/rocke/library/tests/test_gdn_decode_golden.py:388, but the diff shows no added cases in platform/tests/instances/rocke_ir_parity_harness.py to lower the new variant through the C++ engine.
3 PASS The new gate rule only passes finite fp32 errors within tolerance with no spill in dnn-providers/hip-kernel-provider/rocke/library/dispatch/gdn/gate_rules.py:51, while the defaults report explicitly remains advisory and changes nothing in…
4 NEEDS-INFO The previous NEEDS-INFO is not resolved: dnn-providers/hip-kernel-provider/rocke/library/tests/golden/gdn_decode_gfx950_ir_sha256.json is still omitted, so the added golden entries cannot be checked for every LLVM_FLAVORS; evidence is also missing that the widened row_loads spec space ran fuzz_diff.py or why it did not.
5 PASS Portable behavior is covered by skip-on-missing toolchain handling in dnn-providers/hip-kernel-provider/rocke/library/tests/_gdn_decode_compile.py:28, Windows path normalization in…
6 N/A This PR does not refactor a platform IR/lowering gate or differential harness whose per-configuration timeout, reference-hash or…
7 N/A This PR does not change the platform backend fallback rejection contract governed by ROCKE_BACKEND, ROCKE_CPP_STRICT, or…
§R graded 11/11
# Verdict Evidence
1 NEEDS-INFO The commits since the previous review do not resolve this: the PR adds the row_loads emitted-code knob (dnn-providers/hip-kernel-provider/rocke/library/kernels/gfx950/gdn_decode.py:746) and in-tree sweep tool (dnn-providers/hip-kernel-provider/rocke/library/benchmarks/gfx950/gdn/decode_table_sweep.py:1), but the diff and PR body still state the in-tree sweep has not been run end-to-end across all…
2 NEEDS-INFO The commits since the previous review only update SWEEP_JOBS to sys.argv[1] in dnn-providers/hip-kernel-provider/rocke/library/builders/gfx950/gdn/CASE_STUDY.md:382, while the main documentation hunks for ALGORITHM.md, CASE_STUDY.md, README.md, and platform/dsl_docs/instances/gdn.md remain omitted from the truncated diff, so runbook section and §13 checklist mappings for row_loads…
3 NEEDS-INFO The new commits do not add visible utilities-skill citations, and the documentation diffs (ALGORITHM.md, CASE_STUDY.md, README.md, platform/dsl_docs/instances/gdn.md) remain truncated, so alignment of row_loads (dnn-providers/hip-kernel-provider/rocke/library/kernels/gfx950/gdn_decode.py:345) with prefetch-data-load-rocke.md and isa-inspection-rocke.md cannot be verified from the visible diff.
4 NEEDS-INFO The commits since the previous review do not add probe_occupancy.py, probe_regs.py, or probe_isa_inspect.py / probe_intrinsic_counts.py output for row_loads (dnn-providers/hip-kernel-provider/rocke/library/kernels/gfx950/gdn_decode.py:857), and CASE_STUDY.md remains mostly truncated beyond the spill_sweep.py CLI tweak at…
5 NEEDS-INFO The new commits do not add analyze_coalescing, vector_transactions, CoalescingReport.summary(), or assert_asm_backed evidence for the global accesses reordered by late_row_inputs (dnn-providers/hip-kernel-provider/rocke/library/kernels/gfx950/gdn_decode.py:452).
6 N/A The diff changes global input load ordering (row_loads) and host sweep/report tooling, not LDS layouts or MMA layouts.
7 N/A The visible diff makes no bottleneck classification claim (such as memory-bound, LDS-bound, barrier-bound, or latency-bound).
8 N/A The diff does not add, remove, or modify waits, barriers, or compiler scheduling hints.
9 N/A The PR is not a performance regression fix and leaves all shipped AUTO_DEFAULTS selection rules unchanged.
10 PASS Cold-memory rotation, warmup, and median-over-replays timing hygiene are enforced in dnn-providers/hip-kernel-provider/rocke/library/builders/gfx950/gdn/gdn_decode.py:896, and mixed-build or non-cold rows are withheld in…
11 NEEDS-INFO The commits since the previous review did not touch platform/dsl_docs/optimization/utilities/README.md or the dsl_probes README; the new console sweep and report tools registered in dnn-providers/hip-kernel-provider/rocke/library/pyproject.toml:44 (decode_table_sweep.py and decode_defaults_report.py) are still not listed in the optimization utilities documentation. — no diff line supports this verdict
§S graded 8/8
# Verdict Evidence
1 NEEDS-INFO The new commits (3e6822d1..5f0837ff) add test_torch_version_comes_from_the_package_metadata in library/tests/test_gdn_decode_table_sweep.py:1323-1336, but the diffs for platform/tests/dispatch/dispatch_tests/tuning/test_tuning_template.py, platform/CMakeLists.txt, and library/tests/test_gdn_decode_timing.py remain omitted in the truncated diff, so CI lane registration and direct unit test coverage of…
2 PASS Existing API changes (dispatch_gdn_decode_all signature in library/dispatch/gdn/__init__.py:76 and gdn_decode.check return type in library/builders/gfx950/gdn/gdn_decode.py:646-648) update callers and expectations across…
3 PASS The removed library/builders/gfx950/gdn/tune.py and split late_row_inputs / auto_late_row_inputs (keeping late_row_inputs in library/kernels/gfx950/gdn_decode.py:354,452) update import sites in library/benchmarks/gfx950/gdn/benchmark_kda_decode.py:43 and…
4 NEEDS-INFO platform/python/rocke/dispatch/tuning/__init__.py:43,87 and library/kernels/gfx950/gdn_decode.py:147-151 edit __all__ and resolve to real attributes (space.py:464, gdn_decode.py:231,345,354,452,460), but the diffs for platform/tests/dispatch/dispatch_tests/tuning/test_tuning_template.py and library/tests/test_gdn_decode_knobs.py are still omitted so a test importing every listed __all__ name cannot…
5 PASS Tests assert behavioral outputs and fail-fast negative raises with exact exception types and offending parameters in library/tests/dispatch/gdn/test_cli_args.py:19-43, library/tests/dispatch/gdn/test_gate_rules.py:49-169…
6 PASS CPU-checkable contracts (CLI parsing, gate verdict math, cold rotation copy count, tuning space rules, defaults report, torch metadata lookup, and golden IR hashes) are tested without torch or a GPU in library/tests/dispatch/gdn/test_cli_args.py:72-87…
7 N/A The modified APIs are in the Python-only dispatcher/tuning layer (platform/python/rocke/dispatch/tuning/) and library GDN…
8 NEEDS-INFO The PR body names the GPU arch (gfx950) and lists pytest suites run, and touches platform/python/rocke/dispatch/README.md:224-230, but still does not state whether PYTHONDONTWRITEBYTECODE=1 PYTHONPATH=python:../library python tests/test_rocke.py and python tests/run_all.py were run from rocke/platform/.

@cgmillette
cgmillette merged commit f38c6a7 into develop Nov 7, 2026
170 of 172 checks passed
@cgmillette
cgmillette deleted the users/avirgoel/rocke/gdn-decode-tools branch November 7, 2026 02:16
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants