Repository navigation
feat(rocke): in-tree sweep and defaults report for gfx950 GDN/KDA decode - #14632
Conversation
✅ All Checks Passed — Ready for Review
📖 Need help? See the Policy FAQ for details on every check and how to fix failures. |
|
🎉 All checks passed! This PR is ready for review. |
6b7d577 to
d9e5b7a
Compare
|
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
|
| 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.
d9e5b7a to
3142f9c
Compare
|
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
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 |
|
Please address remaining open items for approval |
|
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.
3142f9c to
7436d04
Compare
|
@cgmillette Thanks. N2 is addressed in
The Windows shards have not run at this head yet. |
|
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
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 |
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.
Pre-commit check failed⛔ pre-commit failed Please run locally:
This repo uses |
…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).
|
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
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 |
|
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. |
|
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.
|
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
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 |
yraparti
left a comment
There was a problem hiding this comment.
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 decodetuning_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· Removeouter_dependent_knobsfromKnobSpaceand do not readwaves_per_eu(outer_knob) insideinert()/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 throughrocke.runtime.hip_moduleinstead 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_knobshook onKnobSpace|platform/python/rocke/dispatch/README.md:227-230| Added inplatform/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
left a comment
There was a problem hiding this comment.
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_moduleinstead 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_knobsfromKnobSpace(space.py:53-57) and do not readwaves_per_eu(outer_knob) insideinert()/base_value()(rules.py:263-266). - 🆕 §Q.2 new FAIL (HIGH): Add one
rocke_ir_parity_harness.pycases()entry per newrow_loadsvariant 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· Removeouter_dependent_knobsfromKnobSpace(space.py:53-57) and do not readwaves_per_eu(outer_knob) insideinert()/base_value()(rules.py:263-266). - HIGH §Q ·
dnn-providers/hip-kernel-provider/rocke/library/kernels/gfx950/gdn_decode.py:739· Add onerocke_ir_parity_harness.pycases()entry per newrow_loadsvariant 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 throughrocke.runtime.hip_moduleinstead 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 apiorgh pr view --json body,titleverifying 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.pyonly adds therow_loadsscheduling 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 forALGORITHM.md(+140/-45),CASE_STUDY.md(+162/-5, except lines 306-384 in incremental diff),README.md(+259/-57), andgdn.md(+20/-9) are truncated | Symbols: | Symbol | Defined at | Domain | |---|---|---| |outer_dependent_knobs|platform/python/rocke/dispatch/README.md:228|frozensetof knob names whose drop rules depend onouter_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'toGdnDecodeSpec(kernels/gfx950/gdn_decode.py:746) andROW_LOADS_AXIS(dispatch/gdn/axes.py:66): enters_SPEC_DEFAULTS(dispatch/gdn/rules.py:101-105), which changesconfig_keyfor every GDN decode configuration via the defaults fingerprint;TUNING_ID_VERSIONis not bumped (intended, since defaults fingerprint already separates old and new ids); all prior GDN decode stored pins are refused withPinRefused; 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/. |
ISSUE ID : AICK-2556
Follows #14353 (measured per-mode
autodefaults), which has merged. This PR is based ondevelopand also carries the row-load-order knob (#14720, a separate reviewed PR merged into this branch on Oct 31 asf652bb86125, not intodevelop); see "The row-load knob" below.develophas since been merged in, and the branch records the golden hashes at every flavordeveloprecords.What this adds
The gfx950 GDN/KDA decode
autotable (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 removestune.py. Noautoselection changes, and no golden hash thatdeveloprecords changes.What changed
benchmarks/gfx950/gdn/decode_table_sweep.pyauto), writes JSON rows. Shards long runs. Fails closed.benchmarks/gfx950/gdn/decode_defaults_report.pyautois from the fastest, proposes a default by theALGORITHM.md§4.6 rule. Advisory; runs on CPU.builders/gfx950/gdn/gdn_decode.py--rotate-mb) and one NaN-safe fp32 gate, used by the sweep, both benchmarks,--benchand the GPU numeric tests. The tensor code stays here; the gate's pass test and the buffer-set arithmetic are imported fromdispatch/gdn/gate_rules.py.dispatch/gdn/dispatch_gdn_decode_all/gdn_sweep_spacetakesweep_level,tuning_sample,seed, as attention does. The argument decides; they no longer follow an ambient level. New stdlib-onlycli_args.pyholds the shared flag parsers; new stdlib-onlygate_rules.pyholds the fp32 pass test (Gate,TOL) and the cold-copy-count arithmetic, so they can be tested without torch.tune.pyand its test removed; two console scripts; docs name the new regen path.--sweep-level:productionlistswaves_per_eu0 and 4 only;fullneeds--tuning-sample Nand times a random sample per tile.AUTO_DEFAULTSfrom 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
07db71b5(the author-run head; its newest commit only adds golden entries, checked on CPU). Commits after it (744ea9b3to90fd19df) change the sweep, the report anddispatch/gdnand 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 rowok: 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-onlyrun, a production--shardand afullsample onkda fused f32 32/32.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 insidegate()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 itsrepr; the tests use a backslash path so they also fail on Linux with the old text).developrecords changes (0 of 1,173 differ; 192 entries are added, allknob_row_loads_*). The golden file gains entries only: the 48knob_row_loads_*cases of the row-load knob, recorded atllvm20,llvm22andllvm23, are also recorded atllvm24, the flavordeveloprecords. The knob's own entries were re-recorded atd656a266cd7(188 of the 192), afterdevelop'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 themknob_row_loads_*, atllvm20,llvm22,llvm23andllvm24) passed at5f0837ffwithrocke_enginebuilt fromplatform/cpp/bindings; it is not registered in a CI lane and skips where the engine is not built.07db71b5, which are not re-graded. The Nov 6 automated checklist review at3e6822d1lists 4 HIGH, 3 MEDIUM and 1 LOW; each is being answered on its thread.The row-load knob
The branch also contains the
row_loadsspec field from #14720 (auto,firstorlate). It adds no kernel by default: only a forced order changes the kernel name (a tag) and its IR. Againstdevelopthis adds 48 golden cases per flavor (the forced orders, plus theirautotwins, 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_loadsjoins the GDN spec defaults, so theconfig_keyof every GDN decode configuration changes; only the readable stem before@is unchanged. No GDNtuning_idis stored in this tree. A stored id from before this PR is refused withPinRefused; 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_VERSIONis not bumped: the defaults fingerprint already separates the old and new ids, as for gfx942 dense attention (library/dispatch/AGENTS.md).Notes
AUTO_DEFAULTScase, and gfx942 is out of scope.