Skip to content

perf(rocke): measured per-mode defaults for gfx950 GDN/KDA decode - #14353

Merged
AviralGoelAMD merged 3 commits into
developfrom
users/avirgoel/rocke/gdn-decode-defaults
Oct 29, 2026
Merged

AviralGoelAMD merged 3 commits into
developfrom
users/avirgoel/rocke/gdn-decode-defaults

Conversation

@AviralGoelAMD

@AviralGoelAMD AviralGoelAMD commented Oct 24, 2026 •

Copy link
Copy Markdown
Contributor

ISSUE ID : AICK-2556

Builds on #14176 (tile x knob registry), merged into develop on 2026-10-28.

What was wrong

#14176 made every tile x knob configuration of the gfx950 GDN/KDA decode kernel listable and pinnable, but auto still ran each tile with every knob off: one GDN tile, a work-keyed KDA table, and one interim fused tile. None of these was measured with the knobs on.

What changed

auto now runs one measured configuration per case: gate kind x fused (fuse_conv or fuse_out_norm) x state width. Each is a registered tile plus a knob stack. Every row also streams the state (state_load_hint = state_store_hint = streaming).

Gate Mode State Tile (NW, WTK, BPV) Other knobs
GDN plain bf16 / f16 (2, 16, 8) dpp_reduce
GDN plain f32 (2, 16, 16) dpp_reduce, interleave_cols
GDN fused bf16 / f16 (4, 16, 1) dpp_reduce, stream_rows, conv_once, norm_gate_once, out_lds
GDN fused f32 (8, 16, 1) dpp_reduce, stream_rows, interleave_cols, conv_once, out_lds, waves_per_eu=4
KDA plain bf16 / f16 (1, 16, 8) dpp_reduce, waves_per_eu=4
KDA plain f32 (1, 16, 16) dpp_reduce, stream_rows, interleave_cols
KDA fused bf16 / f16 (4, 8, 1) dpp_reduce, conv_once, out_lds
KDA fused f32 (4, 8, 1) dpp_reduce, stream_rows, interleave_cols, conv_once, out_lds
  • The table is data (dispatch/gdn/axes.py AUTO_DEFAULTS). Batch and head count never select it.
  • auto resolves the stack through the tile's knob space, so it is a configuration dispatch_gdn_decode_all already lists, with its own tuning_id, and the result replays.
  • A knob the request cannot read is dropped, as for any pin. norm_gate_once drops with conv_once.
  • waves_per_eu=4 (GDN fused f32, KDA plain bf16 / f16) was measured only at DK = DV = 128, so auto applies it only there. At other head dims it drops that knob and keeps the rest of the row; with it, the GDN fused f32 row spills at DK = 256.
  • The shared tuning template gains an optional auto_knobs(req) hook beside route_auto. Other families are unchanged.
  • The KDA work table, GDN DEFAULT_TILE and the interim fused tile are removed. Pins are unchanged.

Why it works

Each row was chosen from a cold-memory sweep of every legal tile x knob configuration per case on gfx950 (ROCm 7.13 container, Python lowerer), at DK = DV = 128, bf16 I/O, three head geometries and batch 1 to 256. The leaders were re-timed interleaved over three runs, and every arm was checked against the fp32 reference in the measured run. The rule and its one override are in ALGORITHM.md §4.6, together with what was not measured (one-flag fused requests, other head dims, f16 I/O, gfx942).

How it was validated

  • Golden: no existing hash changes; 24 auto_* cases x 3 LLVM flavors are added.
  • gfx950, ROCm 7.13 container, ROCKE_BACKEND=python, on an earlier head of this PR (the changes since are docs, comments, tests, one behaviour-preserving refactor in the shared hook, and the waves_per_eu head-dim guard, which changes nothing at DK = DV = 128; CI at the current head runs their tests on gfx94X and gfx110X runners; its gfx950 test jobs are skipped): every auto configuration and the one-flag / GQA norm-only modes through dispatch against the fp32 reference; GDN 84, KDA 33, fused 143 and knob suite 296 passed (16 expected skips); pinned tuning_id launches 8, dispatched requests 30, reachability 72/72, README examples, and tune.py / both benchmark scripts end to end.
  • C++ / Python (same head as above): check_byte_identity.py GREEN on llvm20 / llvm22 / llvm23; strict in-tree parity passes; every golden case lowered by both engines, 0 mismatches; host tests 735 passed.
  • CPU: GDN/KDA, dispatch (attention included) and tuning-template suites pass with no failures; the no-spill checks read the code objects and every D128 auto configuration has 0 B scratch, and a compiled-scratch test checks that the GDN fused f32 auto row has 0 B scratch at DK / DV = 256 / 128, 256 / 256 and 128 / 256.

Comparison with AITER

Where AITER has a kernel that does the same work, the table gives AITER's time divided by this PR's auto time (above 1: auto is faster). Geomean over 9 shapes, with the smallest and largest shape in brackets.

Gate Mode State AITER kernel (shipped selection) AITER / auto
GDN plain bf16 FlyDSL flydsl_gdr_decode or Triton fused_rearrange_sigmoid_gated_delta_rule, the faster per shape 1.23x (1.15 - 1.28)
GDN plain f32 same two 1.23x (1.17 - 1.30)
GDN fused bf16, f32 none: AITER's fused GDN decode needs Hv = 2 * Hk, a packed qkvz input and a conv bias; ours needs Hk = Hv for conv n/a
KDA plain bf16 none: AITER's KDA kernels need an f32 state n/a
KDA plain f32 Gluon fused_recurrent_kda 1.34x (1.14 - 1.65)
KDA fused bf16 none: f32 state only n/a
KDA fused f32 Gluon fused_recurrent_kda_packed_decode 1.07x (1.03 - 1.17)
  • Workload: single-token decode, DK = DV = 128, bf16 I/O. Nine shapes per case: GDN plain 16/32, 4/8 and 32/32 heads (Hk/Hv), KDA 8/8, 32/32 and 96/96, each at batch 1, 16 and 128. auto is faster at all 36 shapes in the table.
  • Baseline: AITER commit 229c4a5fae65, each kernel on its own shipped selection (no config override).
  • Method: gfx950, cold memory (inputs rotate so one cycle touches at least 1 GiB), HIP graph replay, arms interleaved in one process, median of 30 rounds, three independent runs. Every arm was checked against the fp32 reference in the measured run, with no failures.
  • Which code: timed on the fork tree this table was written on. Its auto selections equal this PR's table, and the selected kernels were checked to be IR-identical to this head up to value names. They were not re-timed at this head.
  • Caveats: AITER ran its shipped selection. For KDA fused f32 only, AITER's own config overrides were also swept (84 legal configurations per shape, the top five re-timed on a restacked fork tree). Against that tuned AITER, auto is about level on geomean (AITER-tuned / auto = 1.02x) and is slower at three of the nine shapes (0.89x at 8/8 batch 16, 0.99x at 32/32 batch 16, 0.98x at 96/96 batch 1). A different comparison, our best swept configuration against tuned AITER, wins eight of nine shapes (1.08x geomean); that is not what auto ships. The comparison harness is not in this repository, so the table cannot be reproduced from this tree yet; the in-tree sweep tool is the next PR of this stack. These are bounded results at the measured configurations, not a general claim.

Notes

  • Absolute times are kept in the internal performance record, not in this public PR.
  • The sweep tool that regenerates the table in-tree is the next PR of this stack (ALGORITHM.md §8, follow-up 10).
  • Known: illegal-tile fallbacks are not footprint-aware (§8, follow-up 9).

@yraparti yraparti left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

rocKE checklist review

ROCm/rocm-libraries#14353 · 21ae09d01697 · model gemini-4-argon, fallback gpt-5.5

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

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

Findings

  • HIGH §E · dnn-providers/hip-kernel-provider/rocke/library/tests/test_gdn_decode_tune.py:109 · Remove the absolute figure. Keep code comments qualitative.
  • HIGH §G · dnn-providers/hip-kernel-provider/rocke/library/builders/gfx950/gdn/ALGORITHM.md:555 · Include the absolute measurements alongside the ratios for the A/B routing and AITER comparisons, or remove the ratio table from the PR description.

Needs info

  • §D.5 auto resolves through the candidate's knob space (resolve(stacked)), producing a canonical GdnDecodeTunedSpec with its own tuning_id and concrete kernel_spec (dnn-providers/hip-kernel-provider/rocke/platform/python/rocke/dispatch/tuning/candidate.py:173, dnn-providers/hip-kernel-provider/rocke/library/tests/dispatch/gdn/test_tuning_contract.py:178). — no diff line supports this verdict
  • §D.20 The PR explicitly documents in dnn-providers/hip-kernel-provider/rocke/library/builders/gfx950/gdn/ALGORITHM.md:1000-1003 that the GDN/KDA decode dispatch and tuning layer is Python-only with no C++ selector twin. — no diff line supports this verdict
  • §E.10 The PR body notes this branch is stacked on #14176 (base users/avirgoel/rocke/gdn-decode-registry), but merge simulation against current develop and any other open PRs touching gdn_decode_gfx950_ir_sha256.json or dispatch/gdn cannot be verified from the diff alone.
  • §F.6 Local pre-commit execution status is not visible from the PR diff alone.
  • §F.7 Bot and Copilot review thread states are not included in the prompt payload.
  • §G.2 Every auto configuration is tested on-silicon against the fp32 reference in dnn-providers/hip-kernel-provider/rocke/library/tests/test_gdn_decode_gfx950_numeric.py:817 and dnn-providers/hip-kernel-provider/rocke/library/tests/test_kda_decode_gfx950_numeric.py:130. — no diff line supports this verdict
  • §G.12 GDN/KDA decode dispatch is explicitly documented as Python-only with no C++ selector twin today in dnn-providers/hip-kernel-provider/rocke/library/builders/gfx950/gdn/ALGORITHM.md:1000. — no diff line supports this verdict
  • §K.6 routed resolves auto_knobs through the shared resolve path (platform/python/rocke/dispatch/tuning/candidate.py:171-183), and test_auto_is_its_case_stack_on_the_case_tile verifies auto.spec is in dispatch_gdn_decode_all(req) (library/tests/dispatch/gdn/test_tuning_contract.py:195-197). — no diff line supports this verdict

Section notes

  • §A: Dispatch and tuning layer changes for GDN/KDA decode defaults on gfx950, plus golden IR hash additions for the new auto configurations.
  • §D: Items 1-11 of 21 in Section D.
  • §D: Grades items 12-21 of Section D for GDN/KDA decode measured per-mode defaults PR.
  • §G: Graded items 1-17 of Section G.
  • §H: No device-side masks, bounds, indirection tables, or launch input validations are added or modified in this PR; the diff only changes static auto dispatch defaults (AUTO_DEFAULTS) and the tuning template auto_knobs hook.
  • §J: Shapes: | Equation / Item | Operands | Inner / Constraint | Result vs Declared | | --- | --- | --- | --- | | Key-lane split (ALGORITHM.md:600) | WTK lanes × VPT=8 | WTK * VPT = 128 divides DK=128 | Valid for DK=128, fails at DK=64, 192 ((1,1,1) fallback) | | Decode grid (README.md:351) | batch, num_v_heads, BPV | BPV=1 required on fused/simple paths | grid = batch * num_v_heads * BPV | Symbols: | Symbol | Defined in | Domain | | --- | --- | --- | | (NW, WTK, BPV) | ALGORITHM.md:544, CASE_STUDY.md:49 | Tile tuple (num_warps, warp_threads_k, blocks_per_v_dim) | | Hk/Hv, DK, DV | ALGORITHM.md:557-558 | Positive integer head counts and head dimensions | | AUTO_DEFAULTS | dispatch/gdn/axes.py:129, ALGORITHM.md:539 | Mapping (gate_kind, fused, state_row) -> AutoDefault(tile, knobs) | | auto_knobs(req) | candidate.py:122, ARCHITECTURE.md:2235 | Optional hook returning knob mapping for unpinned auto requests | Novelty: | Claim |…

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 N/A No kernel-body emitters are modified; library/kernels/gfx950/gdn_decode.py only updates comments and docstrings.
2 N/A No core lowering-op or op-handler files (core/lower_*, core/ir) are touched in this PR.
3 PASS Changes are confined to the Python-only dispatch registry and tuning layer (platform/python/rocke/dispatch/tuning/candidate.py:122 and library/dispatch/gdn/gfx950.py:192), which need no C++ twin by design.
4 N/A No C++ twin or IR emission order is modified in this PR.
5 PASS Existing golden hashes in library/tests/golden/gdn_decode_gfx950_ir_sha256.json:5 are untouched, while new auto_* cases are added for the newly selected default configurations.
6 PASS The PR only adds golden cases in library/tests/test_gdn_decode_golden.py:234 for dispatch defaults without changing any kernel emitter or lowering logic, and explicitly validates check_byte_identity.py in the PR test summary.
7 N/A No new kernel emitter or lowering logic is added on any hot path.
8 N/A No C++ files or cross-engine lowerers/builders are modified in this PR.
9 N/A No shared op-handler fix or lowerer arch divergence is introduced.
10 PASS Every newly dispatched auto_* configuration is added to the golden hash test in library/tests/test_gdn_decode_golden.py:218 and recorded in library/tests/golden/gdn_decode_gfx950_ir_sha256.json:5.
11 N/A No new IR op is introduced 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 helpers/ are modified in this PR.
§B graded 6/6
# Verdict Evidence
1 PASS dnn-providers/hip-kernel-provider/rocke/platform/python/rocke/dispatch/tuning/candidate.py:150
2 N/A No preflight gate or spec constructor validation rules are added or modified in this PR.
3 PASS dnn-providers/hip-kernel-provider/rocke/library/tests/dispatch/gdn/test_gfx950_wiring.py:165
4 PASS dnn-providers/hip-kernel-provider/rocke/platform/python/rocke/dispatch/tuning/candidate.py:180
5 PASS dnn-providers/hip-kernel-provider/rocke/library/tests/test_gdn_decode_gfx950_numeric.py:817
6 N/A is_valid_spec and supports_* functions are not modified in this PR; routing opinions remain in dispatch/gdn/.
§C graded 10/10
# Verdict Evidence
1 PASS Repeated tuning-pin and auto-default selection predicates are factored into named helpers carries_tuning_pin in dnn-providers/hip-kernel-provider/rocke/platform/python/rocke/dispatch/tuning/candidate.py:43 and auto_default / auto_tile / _auto_tiles in dnn-providers/hip-kernel-provider/rocke/library/dispatch/gdn/gfx950.py:56 and dnn-providers/hip-kernel-provider/rocke/library/dispatch/gdn/gfx950.py:95.
2 PASS All auto configurations route through the single build_gdn_decode(spec) builder via spec flags/knobs and dispatch (dnn-providers/hip-kernel-provider/rocke/library/tests/test_gdn_decode_golden.py:235).
3 N/A This PR does not add or rename any kernel builder functions or modify kernel_name().
4 PASS Arch-independent candidate hook logic is in dnn-providers/hip-kernel-provider/rocke/platform/python/rocke/dispatch/tuning/candidate.py:122 and dnn-providers/hip-kernel-provider/rocke/library/dispatch/gdn/common.py:68, while gfx950-specific tuning defaults live in dnn-providers/hip-kernel-provider/rocke/library/dispatch/gdn/axes.py:129 and dnn-providers/hip-kernel-provider/rocke/library/dispatch/gdn/gfx950.py:95.
5 PASS The diff is scoped strictly to the auto_knobs tuning template hook (dnn-providers/hip-kernel-provider/rocke/platform/python/rocke/dispatch/tuning/candidate.py:122), the GDN/KDA AUTO_DEFAULTS table (dnn-providers/hip-kernel-provider/rocke/library/dispatch/gdn/axes.py:129), and direct tests, golden hashes, and docs.
6 PASS Rather than special-casing auto outside the candidate template, the PR adds an optional auto_knobs hook to make_tuned_candidate (dnn-providers/hip-kernel-provider/rocke/platform/python/rocke/dispatch/tuning/candidate.py:122) and expresses per-case defaults as declarative data in dnn-providers/hip-kernel-provider/rocke/library/dispatch/gdn/axes.py:129.
7 N/A This PR intentionally changes auto dispatch selections to measured per-case configurations rather than performing a no-op cleanup.
8 PASS The change extends the existing make_tuned_candidate helper in dnn-providers/hip-kernel-provider/rocke/platform/python/rocke/dispatch/tuning/candidate.py:122 and reuses conv_once_applies from kernels.gfx950.gdn_decode in dnn-providers/hip-kernel-provider/rocke/library/dispatch/gdn/gfx950.py:31.
9 N/A This PR sets measured auto tuning defaults and is not a bug fix.
10 PASS Widening make_tuned_candidate with auto_knobs in dnn-providers/hip-kernel-provider/rocke/platform/python/rocke/dispatch/tuning/candidate.py:122 preserves opt-in and non-auto_knobs families, guards auto_knobs without route_auto (candidate.py:150), preserves caller pins (candidate.py:170), updates dnn-providers/hip-kernel-provider/rocke/platform/python/rocke/dispatch/ARCHITECTURE.md:2234, and updates all code, test, and doc…
§D graded 21/21
# Verdict Evidence
1 PASS Per-case auto defaults and knobs are declared as data over GdnDecodeSpec fields / KnobAxis axes with no os.environ reads (dnn-providers/hip-kernel-provider/rocke/library/dispatch/gdn/axes.py:85, dnn-providers/hip-kernel-provider/rocke/library/dispatch/gdn/axes.py:129).
2 PASS ARCH = "gfx950" is an explicit gfx target and kernel coverage constants (GDN_DTYPES, _MAX_WAVES_PER_EU, STATE_HINTS, STATE_DTYPES) are imported from kernels.gfx950.gdn_decode (dnn-providers/hip-kernel-provider/rocke/library/dispatch/gdn/gfx950.py:28, dnn-providers/hip-kernel-provider/rocke/library/dispatch/gdn/axes.py:39, dnn-providers/hip-kernel-provider/rocke/library/tests/dispatch/gdn/test_gfx950_wiring.py:38).
3 PASS route_auto and scope_check return specific reason strings without re-checking Capability, and tests call candidate.admits(req) (dnn-providers/hip-kernel-provider/rocke/library/dispatch/gdn/gfx950.py:180, dnn-providers/hip-kernel-provider/rocke/platform/tests/dispatch/dispatch_tests/tuning/test_tuning_template.py:554).
4 PASS auto_default, auto_tile, route_auto, and auto_knobs are pure functions of req with no device probes (dnn-providers/hip-kernel-provider/rocke/library/dispatch/gdn/gfx950.py:95, dnn-providers/hip-kernel-provider/rocke/library/dispatch/gdn/gfx950.py:192).
5 NEEDS-INFO auto resolves through the candidate's knob space (resolve(stacked)), producing a canonical GdnDecodeTunedSpec with its own tuning_id and concrete kernel_spec (dnn-providers/hip-kernel-provider/rocke/platform/python/rocke/dispatch/tuning/candidate.py:173, dnn-providers/hip-kernel-provider/rocke/library/tests/dispatch/gdn/test_tuning_contract.py:178). — no diff line supports this verdict
6 N/A This PR does not introduce or modify attention cohort routing; it updates GDN/KDA decode per-case static defaults.
7 N/A GDN/KDA decode uses a single static AUTO_DEFAULTS table per case (gate_kind, fused, state_dtype) rather than layered machine-regenerable heuristics with hand-pinned shape overrides.
8 PASS routed(req) in make_tuned_candidate is shared by support and select_spec, and auto_default(req) / auto_tile(req) is the single source of truth shared by route_auto and auto_knobs (dnn-providers/hip-kernel-provider/rocke/platform/python/rocke/dispatch/tuning/candidate.py:152, dnn-providers/hip-kernel-provider/rocke/library/dispatch/gdn/gfx950.py:180).
9 PASS Each tuned candidate is registered via make_tuned_candidate and every case's auto configuration is exercised through dispatch_gdn_decode and launched on device in the harness (dnn-providers/hip-kernel-provider/rocke/library/dispatch/gdn/gfx950.py:234, dnn-providers/hip-kernel-provider/rocke/library/tests/test_gdn_decode_gfx950_numeric.py:817).
10 PASS The new auto_knobs hook on make_tuned_candidate is wired into GDN decode dispatch and tested at the dispatcher level (dnn-providers/hip-kernel-provider/rocke/library/dispatch/gdn/gfx950.py:259, dnn-providers/hip-kernel-provider/rocke/library/tests/dispatch/gdn/test_gfx950_wiring.py:165).
11 PASS Candidates without route_auto remain opt-in (auto_knobs without route_auto raises ValueError), and promoting the per-case AUTO_DEFAULTS for auto is backed by cold-memory sweep measurements documented with each config (dnn-providers/hip-kernel-provider/rocke/platform/python/rocke/dispatch/tuning/candidate.py:150, dnn-providers/hip-kernel-provider/rocke/library/builders/gfx950/gdn/ALGORITHM.md:544).
12 PASS Priority order is defined in dnn-providers/hip-kernel-provider/rocke/library/dispatch/gdn/gfx950.py:69-76 (CONFIGURED_TILES_BY_GATE), documented in dnn-providers/hip-kernel-provider/rocke/library/builders/gfx950/gdn/ALGORITHM.md:597-604, and fallback/custom ranker behavior is tested in dnn-providers/hip-kernel-provider/rocke/library/tests/dispatch/gdn/test_gfx950_registry.py:122-128 and…
13 PASS Pinned requests and tuning pins never fall back: resolve_pinned and routed in dnn-providers/hip-kernel-provider/rocke/platform/python/rocke/dispatch/tuning/candidate.py:66-70,170-184 preserve caller pins and raise on invalid auto knobs, while pin refusal is tested in dnn-providers/hip-kernel-provider/rocke/library/tests/dispatch/gdn/test_gfx950_registry.py:119…
14 N/A This PR does not modify KernelId, compile_key, selection_key, abi_version, or kernel kernarg layouts.
15 PASS This PR intentionally updates existing GDN/KDA routing (AUTO_DEFAULTS in dnn-providers/hip-kernel-provider/rocke/library/dispatch/gdn/axes.py:129-173 and route_auto/auto_knobs in dnn-providers/hip-kernel-provider/rocke/library/dispatch/gdn/gfx950.py:180-204) and updates the routing tests accordingly in dnn-providers/hip-kernel-provider/rocke/library/tests/dispatch/gdn/test_gfx950_wiring.py:145-329.
16 N/A This PR does not introduce a new operator family; gdn is an existing family.
17 PASS CPU routing and tuning contract tests are updated and expanded in dnn-providers/hip-kernel-provider/rocke/library/tests/dispatch/gdn/test_gfx950_wiring.py:145-329, dnn-providers/hip-kernel-provider/rocke/library/tests/dispatch/gdn/test_tuning_contract.py:178-224, and dnn-providers/hip-kernel-provider/rocke/platform/tests/dispatch/dispatch_tests/tuning/test_tuning_template.py:533-572.
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 modifies GDN/KDA decode dispatch (library/dispatch/gdn/) and does not touch unified attention (run_unified_attention_torch).
20 NEEDS-INFO The PR explicitly documents in dnn-providers/hip-kernel-provider/rocke/library/builders/gfx950/gdn/ALGORITHM.md:1000-1003 that the GDN/KDA decode dispatch and tuning layer is Python-only with no C++ selector twin. — no diff line supports this verdict
21 PASS The PR changes only which spec configuration is chosen by auto via AUTO_DEFAULTS and auto_knobs (dnn-providers/hip-kernel-provider/rocke/library/dispatch/gdn/axes.py:129-173, dnn-providers/hip-kernel-provider/rocke/library/dispatch/gdn/gfx950.py:192-204) without changing kernel IR emission in library/kernels/gfx950/gdn_decode.py.
§E graded 17/17
# Verdict Evidence
1 PASS dnn-providers/hip-kernel-provider/rocke/platform/python/rocke/dispatch/tuning/candidate.py:18 and dnn-providers/hip-kernel-provider/rocke/platform/tests/dispatch/dispatch_tests/tuning/test_tuning_template.py:533 keep platform code and tests free of library imports (ARCHITECTURE.md mentions library/dispatch/gdn/axes.py only in prose).
2 PASS dnn-providers/hip-kernel-provider/rocke/library/dispatch/gdn/axes.py:35 and dnn-providers/hip-kernel-provider/rocke/library/dispatch/gdn/gfx950.py:28 add no torch imports in library code.
3 PASS dnn-providers/hip-kernel-provider/rocke/library/tests/dispatch/gdn/test_gfx950_wiring.py:18 and dnn-providers/hip-kernel-provider/rocke/library/tests/test_kda_decode_gfx950_numeric.py:36 do not introduce unconditional torch imports or use torch to locate ROCm libraries.
4 PASS dnn-providers/hip-kernel-provider/rocke/library/dispatch/gdn/axes.py:39 imports downward from kernels, and dnn-providers/hip-kernel-provider/rocke/library/builders/gfx950/gdn/tune.py:39 imports downward from dispatch and kernels.
5 PASS dnn-providers/hip-kernel-provider/rocke/platform/python/rocke/dispatch/tuning/candidate.py:18 and dnn-providers/hip-kernel-provider/rocke/platform/tests/dispatch/dispatch_tests/tuning/test_tuning_template.py:533 introduce no absolute paths, shell scripts, or /tmp/nproc/sudo usage under platform/.
6 PASS dnn-providers/hip-kernel-provider/rocke/library/kernels/gfx950/gdn_decode.py:79 and :625 only update comments/docstrings and do not remove any IR emitter handles.
7 PASS dnn-providers/hip-kernel-provider/rocke/platform/dsl_docs/instances/gdn.md:91, dnn-providers/hip-kernel-provider/rocke/platform/dsl_docs/instances/index.md:146, and dnn-providers/hip-kernel-provider/rocke/platform/python/rocke/dispatch/ARCHITECTURE.md:2230 update the reference and architecture docs in the same PR as the dispatch and tuning changes.
8 PASS dnn-providers/hip-kernel-provider/rocke/library/dispatch/gdn/axes.py:110 and dnn-providers/hip-kernel-provider/rocke/library/dispatch/gdn/gfx950.py:62 use descriptive references (ALGORITHM.md sections) with no Jira IDs, PR numbers, or usernames in code or docs; the ticket ID appears only in the PR body.
9 PASS dnn-providers/hip-kernel-provider/rocke/library/dispatch/gdn/axes.py:129, dnn-providers/hip-kernel-provider/rocke/library/dispatch/gdn/gfx950.py:192, and dnn-providers/hip-kernel-provider/rocke/platform/python/rocke/dispatch/tuning/candidate.py:122 are all scoped to per-case measured auto defaults for gfx950 GDN/KDA decode and the supporting auto_knobs hook.
10 NEEDS-INFO The PR body notes this branch is stacked on #14176 (base users/avirgoel/rocke/gdn-decode-registry), but merge simulation against current develop and any other open PRs touching gdn_decode_gfx950_ir_sha256.json or dispatch/gdn cannot be verified from the diff alone.
11 PASS dnn-providers/hip-kernel-provider/rocke/library/builders/gfx950/gdn/ALGORITHM.md:537, dnn-providers/hip-kernel-provider/rocke/library/builders/gfx950/gdn/CASE_STUDY.md:52, and dnn-providers/hip-kernel-provider/rocke/library/builders/gfx950/gdn/README.md:35 are required family deliverables updated alongside the code and tests, with no scratch files committed.
12 PASS dnn-providers/hip-kernel-provider/rocke/library/builders/gfx950/gdn/ALGORITHM.md:581 and dnn-providers/hip-kernel-provider/rocke/library/dispatch/gdn/axes.py:120 explicitly scope the measured defaults to gfx950 and state that gfx942 is not measured (and gfx950-only support is noted in dnn-providers/hip-kernel-provider/rocke/platform/dsl_docs/instances/gdn.md:188).
13 PASS dnn-providers/hip-kernel-provider/rocke/library/dispatch/gdn/gfx950.py:55 removes _TUNED_TILES_KDA, DEFAULT_TILE, FUSED_DEFAULT_TILE, work_for, and tile_for_work, and updates all callers and docs across dnn-providers/hip-kernel-provider/rocke/docs/gpu-attention-test-coverage.md:23, dnn-providers/hip-kernel-provider/rocke/library/builders/gfx950/gdn/CASE_STUDY.md:203…
14 PASS dnn-providers/hip-kernel-provider/rocke/library/dispatch/gdn/gfx950.py:66 and dnn-providers/hip-kernel-provider/rocke/library/builders/gfx950/gdn/ALGORITHM.md:601 preserve the KNOWN LIMITATION note about the (1, 1, 1) register-heavy fallback at head_k_dim 64/192 and carry it into follow-up 9 at ALGORITHM.md:1013.
15 PASS dnn-providers/hip-kernel-provider/rocke/platform/python/rocke/dispatch/tuning/candidate.py:122 uses the new auto_knobs parameter at lines 150 and 171, and dnn-providers/hip-kernel-provider/rocke/library/tests/test_kda_decode_gfx950_numeric.py:130 removes the unused max_work parameter when switching from _TUNED_TILES_KDA to _KDA_AUTO_TILES.
16 N/A Severity labeling applies to review output rather than PR diffs, and there are no FAIL items in this section.
17 FAIL dnn-providers/hip-kernel-provider/rocke/library/tests/test_gdn_decode_tune.py:109 contains an absolute performance figure
§F graded 11/11
# Verdict Evidence
1 PASS Branch users/avirgoel/rocke/gdn-decode-defaults matches users/<user>/… (and diff touches dnn-providers/hip-kernel-provider/rocke/library/dispatch/gdn/axes.py:85).
2 PASS title perf(rocke): measured per-mode defaults for gfx950 GDN/KDA decode matches type(scope): summary and is 65 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_gfx950_registry.py is in the diff
5 PASS File list and diff contain only docs, Python sources, tests, and golden JSON (dnn-providers/hip-kernel-provider/rocke/library/tests/golden/gdn_decode_gfx950_ir_sha256.json:5); no keys, certs, or secrets.
6 NEEDS-INFO Local pre-commit execution status is not visible from the PR diff alone.
7 NEEDS-INFO Bot and Copilot review thread states are not included in the prompt payload.
8 PASS Stacked PR against Base: users/avirgoel/rocke/gdn-decode-registry satisfies policy.yml rules (branch prefix, Conventional Commit title, ISSUE ID : AICK-2556, and unit tests such as dnn-providers/hip-kernel-provider/rocke/library/tests/dispatch/gdn/test_gfx950_wiring.py:145).
9 PASS PR keeps the cohesive change together across dispatch, docs, golden hashes, and tests (e.g. dnn-providers/hip-kernel-provider/rocke/library/dispatch/gdn/axes.py:129 and dnn-providers/hip-kernel-provider/rocke/library/tests/dispatch/gdn/test_gfx950_wiring.py:86).
10 PASS Added tests exercise real dispatch, tuning-template, and numeric contracts (dnn-providers/hip-kernel-provider/rocke/platform/tests/dispatch/dispatch_tests/tuning/test_tuning_template.py:540, dnn-providers/hip-kernel-provider/rocke/library/tests/test_gdn_decode_gfx950_numeric.py:817).
11 PASS The PR title and full body are populated in the fetched PR metadata (Title: perf(rocke): measured per-mode defaults for gfx950 GDN/KDA decode, ISSUE ID : AICK-2556; diff at dnn-providers/hip-kernel-provider/rocke/library/dispatch/gdn/axes.py:85).
§G graded 34/34
# Verdict Evidence
1 PASS Byte-identity is supplemented with on-silicon fp32 reference checks for every auto configuration in dnn-providers/hip-kernel-provider/rocke/library/tests/test_gdn_decode_gfx950_numeric.py:817.
2 NEEDS-INFO Every auto configuration is tested on-silicon against the fp32 reference in dnn-providers/hip-kernel-provider/rocke/library/tests/test_gdn_decode_gfx950_numeric.py:817 and dnn-providers/hip-kernel-provider/rocke/library/tests/test_kda_decode_gfx950_numeric.py:130. — no diff line supports this verdict
3 PASS Golden IR hashes for all 24 new auto_* cases across llvm20/22/23 are updated in dnn-providers/hip-kernel-provider/rocke/library/tests/golden/gdn_decode_gfx950_ir_sha256.json:5 and dnn-providers/hip-kernel-provider/rocke/library/tests/test_gdn_decode_golden.py:215, and PR body confirms byte-identity and pytest suites passed.
4 PASS New tests directly assert the new AUTO_DEFAULTS table and auto_knobs hook behavior, e.g., dnn-providers/hip-kernel-provider/rocke/library/tests/dispatch/gdn/test_gfx950_wiring.py:145 and dnn-providers/hip-kernel-provider/rocke/platform/tests/dispatch/dispatch_tests/tuning/test_tuning_template.py:540.
5 PASS Tests enter through the public dispatch entry point dispatch_gdn_decode (e.g., dnn-providers/hip-kernel-provider/rocke/library/tests/dispatch/gdn/test_gfx950_wiring.py:177) and test specific failure modes like unresolvable auto_knobs in dnn-providers/hip-kernel-provider/rocke/platform/tests/dispatch/dispatch_tests/tuning/test_tuning_template.py:549.
6 PASS The 8-row AUTO_DEFAULTS table matches identically across PR body, dnn-providers/hip-kernel-provider/rocke/library/builders/gfx950/gdn/ALGORITHM.md:544, dnn-providers/hip-kernel-provider/rocke/library/dispatch/gdn/axes.py:129, and the literal table in dnn-providers/hip-kernel-provider/rocke/library/tests/dispatch/gdn/test_gfx950_wiring.py:86.
7 PASS The fp32 reference gate is documented as the first-class correctness gate before timing in dnn-providers/hip-kernel-provider/rocke/library/builders/gfx950/gdn/ALGORITHM.md:564.
8 N/A No dtype fallback logic in test or benchmark harnesses is added or modified in this PR.
9 PASS Scratch/spill checks inspect compiled code objects via _compiled_scratch_bytes in dnn-providers/hip-kernel-provider/rocke/library/tests/test_gdn_decode_spec.py:442 and dnn-providers/hip-kernel-provider/rocke/library/tests/test_kda_decode_resources.py:67.
10 PASS Performance provenance in dnn-providers/hip-kernel-provider/rocke/library/builders/gfx950/gdn/ALGORITHM.md:555 and PR body locks the device (gfx950), container, cold-memory rotation, fp32 parity gate, and reports ratios rather than raw latencies.
11 PASS The optimized auto configurations are reachable and tested through dispatch_gdn_decode in dnn-providers/hip-kernel-provider/rocke/library/tests/test_gdn_decode_gfx950_numeric.py:831 (GDN/KDA dispatch is documented as Python-only in dnn-providers/hip-kernel-provider/rocke/library/builders/gfx950/gdn/ALGORITHM.md:1001).
12 NEEDS-INFO GDN/KDA decode dispatch is explicitly documented as Python-only with no C++ selector twin today in dnn-providers/hip-kernel-provider/rocke/library/builders/gfx950/gdn/ALGORITHM.md:1000. — no diff line supports this verdict
13 N/A This PR does not add, modify, or recommend any LLVM intrinsic symbols or .td definitions.
14 PASS dnn-providers/hip-kernel-provider/rocke/library/builders/gfx950/gdn/ALGORITHM.md:394 explicitly distinguishes static code-object load-batch counts from hardware counters.
15 N/A The PR diff is provided directly in the review prompt context.
16 N/A This is a completed implementation PR rather than an unverified planning document.
17 PASS The modified tune.py script is tested in dnn-providers/hip-kernel-provider/rocke/library/tests/test_gdn_decode_tune.py:206 and reported in the PR validation section as run end-to-end on gfx950.
18 N/A No statistical or jitter-sensitive runtime guards are added in this diff.
19 PASS dnn-providers/hip-kernel-provider/rocke/platform/tests/dispatch/dispatch_tests/tuning/test_tuning_template.py:549 constructs a fixture (tile128 x unroll: 4) that exceeds the register budget while tile128's default builds, proving the auto_knobs resolution check fires.
20 N/A No claim-ban detector or text-sweeping lint rule is added or modified in this PR.
21 PASS dnn-providers/hip-kernel-provider/rocke/library/builders/gfx950/gdn/tune.py:301 and dnn-providers/hip-kernel-provider/rocke/library/tests/test_gdn_decode_tune.py:206 update tune.py to start KDA tile sweeps from the base configuration and verify that accepted inputs reach the sweep.
22 PASS dnn-providers/hip-kernel-provider/rocke/library/tests/golden/gdn_decode_gfx950_ir_sha256.json:5 and dnn-providers/hip-kernel-provider/rocke/library/tests/test_gdn_decode_golden.py:234 record bytes and sha256 for the 24 new auto_* golden cases without error skips, and the PR description documents GPU and C++/Python parity execution.
23 FAIL The PR body ('Comparison with AITER') and dnn-providers/hip-kernel-provider/rocke/library/builders/gfx950/gdn/ALGORITHM.md:555 label the axes, caveats, and fp32 oracle check on both routes, but report only ratios after withholding absolute figures ('Absolute times are kept in the internal performance record, not in this public PR').
24 N/A No existing golden hashes were modified or re-blessed; only 24 new auto_* cases were added to dnn-providers/hip-kernel-provider/rocke/library/tests/golden/gdn_decode_gfx950_ir_sha256.json.
25 N/A This PR changes dispatcher default selection (AUTO_DEFAULTS) rather than making a codegen or lowering micro-optimization to kernel emission.
26 PASS The PR description ('Which code') and dnn-providers/hip-kernel-provider/rocke/library/builders/gfx950/gdn/ALGORITHM.md:438 confirm that the selected kernels on the measurement tree were verified to be IR-identical to this PR head on the loads-first order.
27 PASS dnn-providers/hip-kernel-provider/rocke/library/dispatch/gdn/axes.py:129 and dnn-providers/hip-kernel-provider/rocke/library/builders/gfx950/gdn/ALGORITHM.md:544 document and ship the exact per-case (tile, knobs) AUTO_DEFAULTS configurations that were measured.
28 PASS dnn-providers/hip-kernel-provider/rocke/library/builders/gfx950/gdn/ALGORITHM.md:537 and the PR body clearly separate the shipped auto table from non-shipped counterfactuals (such as best-swept per-shape configs against tuned AITER).
29 N/A No guarded-to-fast math primitive swaps (such as exp2 to exp2_fast) are introduced in this PR.
30 PASS dnn-providers/hip-kernel-provider/rocke/library/tests/test_gdn_decode_spec.py:412 and dnn-providers/hip-kernel-provider/rocke/library/tests/test_kda_decode_resources.py:67 compile every auto configuration and assert 0 B of scratch from the compiled code object metadata.
31 PASS dnn-providers/hip-kernel-provider/rocke/library/builders/gfx950/gdn/ALGORITHM.md:555 and the PR body benchmark against AITER's shipped selection (plus tuned AITER overrides) and sweep legal tile x knob combinations on the existing loads-first kernel without manufacturing a degraded baseline.
32 PASS dnn-providers/hip-kernel-provider/rocke/library/builders/gfx950/gdn/ALGORITHM.md:555 and the PR body record target (gfx950), container/toolchain (ROCm 7.13 container, Python lowerer), cold-memory rotation method, and explicitly note the out-of-tree harness limitation (follow-up 10 in ALGORITHM.md:1015).
33 PASS dnn-providers/hip-kernel-provider/rocke/library/tests/dispatch/gdn/test_gfx950_wiring.py:86 and test_gfx950_wiring.py:239 evaluate dispatch_gdn_decode across the cross-product of gate_kind, dims (including D64, D96, D192, D256, narrow DV 16/32), state_dtype, fused_modes, heads, and batch, verifying both the _SHIPPED table and fallback routing.
34 N/A No opt-in kernel output flags (such as LSE output) are added or modified in this PR.
§H graded 5/5
# Verdict Evidence
1 N/A This PR only updates dispatch auto defaults and tuning candidate selection without adding or modifying hardware/resource bounds or launch tensor validations.
2 N/A This PR does not add or modify any paged/indirection table lookups or kernel memory indexing logic.
3 N/A This PR does not introduce or change any kernel hot-loop div/mod operations or divisor spec fields.
4 N/A This PR does not add or modify any device-side masks or bounds derived from runtime inputs.
5 N/A This PR does not add or modify any launch inputs that feed a device-side bound or mask.
§I graded 6/6
# Verdict Evidence
1 PASS dnn-providers/hip-kernel-provider/rocke/library/builders/gfx950/gdn/ALGORITHM.md:564 — The provenance documents sweeping every legal tile x knob configuration per case, correctness-gated against the fp32 reference, and tune.py:245 reports the auto tile base against the fastest legal candidate.
2 PASS dnn-providers/hip-kernel-provider/rocke/library/dispatch/gdn/gfx950.py:192 — Out-of-scope knobs on auto are repaired (dropped, including norm_gate_once when conv_once does not apply), while candidate.py:180 loudly raises RuntimeError if auto_knobs fail to resolve on a buildable request instead of silently falling back.
3 PASS dnn-providers/hip-kernel-provider/rocke/library/tests/dispatch/gdn/test_gfx950_wiring.py:239 — test_auto_is_the_case_stack_or_the_documented_fallback combines curated case checks with a generated cartesian product over dims, state dtypes, fused modes, head geometries, and batches.
4 PASS dnn-providers/hip-kernel-provider/rocke/library/builders/gfx950/gdn/tune.py:237 — report_gdn_dispatcher_default prints both the auto tile (base configuration) and the fastest legal candidate along with their ratio.
5 PASS dnn-providers/hip-kernel-provider/rocke/library/builders/gfx950/gdn/ALGORITHM.md:582 — Explicitly documents the baked AUTO_DEFAULTS table provenance, what was not measured, how to update it, and tracks the in-tree tiles x knobs sweep regeneration tool in ALGORITHM.md:1015 (follow-up 10).
6 N/A This PR updates dispatch defaults and the tuning candidate template without adding or modifying any DSL or hardware-instruction-named primitives.
§J graded 7/7
# Verdict Evidence
1 N/A No tensor or matrix recurrence equations are added or modified in the Markdown hunks; the diff only updates tile/knob selection tables and scalar divisibility notes (WTK * VPT = 128).
2 PASS Symbols introduced or updated in dnn-providers/hip-kernel-provider/rocke/library/builders/gfx950/gdn/ALGORITHM.md:537-560 ((NW, WTK, BPV), Hk/Hv, DK, DV, AUTO_DEFAULTS, and knob names) have a single consistent meaning across ALGORITHM.md, CASE_STUDY.md:49-66, and README.md:175-186 with no log-domain changes.
3 PASS Sibling docs link to ALGORITHM.md §4.6 instead of restating the table or fallback rules: dnn-providers/hip-kernel-provider/rocke/platform/dsl_docs/instances/gdn.md:158-160, dnn-providers/hip-kernel-provider/rocke/library/builders/gfx950/gdn/CASE_STUDY.md:55-59, and dnn-providers/hip-kernel-provider/rocke/library/builders/gfx950/gdn/README.md:153-155.
4 PASS Novelty and status claims in dnn-providers/hip-kernel-provider/rocke/library/builders/gfx950/gdn/ALGORITHM.md:537-542 and :1004-1016 accurately distinguish pre-existing knobs (§4.10) from the newly added AUTO_DEFAULTS table (dnn-providers/hip-kernel-provider/rocke/library/dispatch/gdn/axes.py:129) and auto_knobs hook (dnn-providers/hip-kernel-provider/rocke/platform/python/rocke/dispatch/tuning/candidate.py:122).
5 PASS Grid and work-scaling claims (batch * num_v_heads) are updated consistently across every prose and docstring site: dnn-providers/hip-kernel-provider/rocke/library/builders/gfx950/gdn/ALGORITHM.md:215-217, ALGORITHM.md:540-541, dnn-providers/hip-kernel-provider/rocke/library/builders/gfx950/gdn/README.md:354-356, dnn-providers/hip-kernel-provider/rocke/library/dispatch/gdn/common.py:68-73…
6 PASS dnn-providers/hip-kernel-provider/rocke/library/builders/gfx950/gdn/ALGORITHM.md:555-584 documents full provenance for the AUTO_DEFAULTS constants: hardware/container, cold-memory rotation, head geometries anchored to §1.4 deployments (Qwen3-Next 16/32, Kimi-Linear 32/32, TP splits 4/8, 8/8), pinned assumptions (DK = DV = 128, bf16 I/O, use_qk_l2norm=True), selection rule, batch-1 override, and unmeasured/out-of-scope cases.
7 N/A No new Markdown files are added in this PR; all changes edit existing documentation files.
§K graded 13/13
# Verdict Evidence
1 PASS Candidates are built via make_tuned_candidate (library/dispatch/gdn/gfx950.py:234-260) and tested with assert_tuning_contract (library/tests/dispatch/gdn/test_tuning_contract.py:32, platform/tests/dispatch/dispatch_tests/tuning/test_tuning_template.py:533-572).
2 PASS No new kernel spec fields or knob axes are added; AUTO_DEFAULTS is validated at import against AXES and FULL_WAVES_PER_EU (library/dispatch/gdn/axes.py:179-193).
3 PASS No knob definitions, dataclass defaults, or canonicalization rules changed (library/kernels/gfx950/gdn_decode.py:623-628), and test_a_spec_id_pin_of_the_auto_tile_runs_its_base verifies pins keep their meaning (library/tests/dispatch/gdn/test_gfx950_wiring.py:225-238).
4 N/A KnobSpace.defaults() and recorded() are not modified in this PR.
5 PASS auto_knobs resolves through the candidate's knob space so out-of-scope knobs are dropped rather than refused, and norm_gate_once is dropped when conv_once does not apply (library/dispatch/gdn/gfx950.py:192-204, library/tests/dispatch/gdn/test_tuning_contract.py:207-225).
6 NEEDS-INFO routed resolves auto_knobs through the shared resolve path (platform/python/rocke/dispatch/tuning/candidate.py:171-183), and test_auto_is_its_case_stack_on_the_case_tile verifies auto.spec is in dispatch_gdn_decode_all(req) (library/tests/dispatch/gdn/test_tuning_contract.py:195-197). — no diff line supports this verdict
7 PASS auto_default, auto_tile, and auto_knobs are pure functions of the request fields (library/dispatch/gdn/gfx950.py:95-106, library/dispatch/gdn/gfx950.py:192-204).
8 PASS AUTO_DEFAULTS values are checked at import time for exact value and type membership in _AXIS_VALUES (library/dispatch/gdn/axes.py:179-191).
9 PASS routed checks carries_tuning_pin(req) so caller pins are never replaced by auto_knobs, and unresolvable auto_knobs raise RuntimeError rather than falling back (platform/python/rocke/dispatch/tuning/candidate.py:43-47, platform/python/rocke/dispatch/tuning/candidate.py:170-183).
10 PASS resolve_pinned only calls default() when !carries_tuning_pin(req) and otherwise preserves the existing canonicalize/find logic (platform/python/rocke/dispatch/tuning/candidate.py:66-71).
11 PASS Dispatched auto results pin spec_id, tuning_id, and tuning_knobs on result.request for exact replay (library/tests/dispatch/gdn/test_tuning_contract.py:199-204).
12 PASS Pinned spec_id with tuning_id='auto' still resolves to the candidate's base configuration (platform/python/rocke/dispatch/tuning/candidate.py:169-185, library/tests/dispatch/gdn/test_gfx950_wiring.py:225-238), while unpinned auto routing changes are backed by cold-memory sweep provenance and tests (library/builders/gfx950/gdn/ALGORITHM.md:555-576).
13 PASS tune.py explicitly states that auto is deterministic and runtime measurements in tune.py do not change selection (library/builders/gfx950/gdn/tune.py:6-11, library/builders/gfx950/gdn/tune.py:353-356).
§L graded 10/10
# Verdict Evidence
1 N/A This PR does not add or modify a gfx target or ISA backend.
2 N/A This PR does not add or modify any MMA op_id or fragment layout table.
3 N/A This PR does not touch MMA selection, MfmaAtom catalogs, or MMA lowering.
4 N/A This PR does not change wave-size handling or target lane math.
5 N/A This PR does not change arch-specific kernel recipes or cross-target codegen.
6 N/A This PR does not add pipeline vocabulary to core/arch or import CK Tile's dispatcher.
7 N/A This PR does not add or modify logical dtypes, bit packing, instruction fragments, or FP8 dialects.
8 N/A This PR does not touch scaled-MMA scale contracts or WMMA operation IDs.
9 N/A This PR does not introduce a new architecture target.
10 N/A This PR does not modify intrinsic arch-domain artifacts or LLVM flavor membership lists.
§M graded 10/10
# Verdict Evidence
1 N/A The diff only modifies docstring comments in gdn_decode.py and does not emit any DSL control flow or SSA values.
2 N/A The diff does not touch legalize_for_target or any core lowering/legalization passes.
3 N/A The diff does not touch core/ir_serialize.py, cpp/core/ir/serialize.cpp, or any IR serialization logic.
4 N/A The diff does not touch portable IR schemas, recipe_expand.py, recipe_vm.cpp, or record_coverage.py.
5 N/A The diff does not use or modify AsyncTileLoader or LDS layout validation.
6 N/A The diff does not emit or modify any kernel barriers, memory loads, or cross-lane shuffles.
7 N/A The diff does not touch ISABackend.buffer_rsrc_word3 or modify TemporalHint target legality rules (only selects existing streaming hints on gfx950 in dispatch/gdn/axes.py).
8 N/A The diff does not declare new LLVM intrinsics or modify engine selection/fallback logic.
9 N/A The diff does not touch any C++ files or headers under cpp/include/rocke/.
10 N/A The diff does not touch debug location (!dbg) emission or DWARF consumers.
§N graded 18/18
# Verdict Evidence
1 N/A The diff does not add or promote any helpers to platform/python/rocke/helpers/.
2 N/A The diff only updates comments/docstrings in gdn_decode.py and does not change kernel addressing, atom usage, or helper calls.
3 N/A The diff does not touch SoftwarePipeline or any pipeline uses.
4 N/A The diff does not touch EpilogueOp, _PATTERN_TABLE, or graph fusion builders.
5 N/A The diff does not add or modify any public tiling API under rocke.helpers.tiling.
6 N/A The diff does not add or modify any front-door or toolbox tiling helpers or LayoutStyle.
7 N/A The diff does not touch tiling layout overrides, c_desc, or MMA soundness gates.
8 N/A The diff does not touch tiling memory rules, lds_tile_alloc, lds_store, or lds_read.
9 N/A The diff does not touch N-D tensor axis roles, FlowStage, or tiling label transforms.
10 N/A The diff does not modify tiling emit, LDS staging, MMA issue, or tiling fail-fast raises.
11 N/A The diff does not use or modify mma_traits.json, TileMma, lds_swizzle, or derive_sched_group_counts.
12 N/A The diff makes no LDS bank-conflict or coalescing claims using tiling analysis tools.
13 N/A The diff does not build or modify WarpDistributionEncoding, make_tile_desc, or RegisterMapper.
14 N/A The diff does not use or modify tiling verbs, LDS barriers, or pipeline variants.
15 N/A The diff does not touch tiling allocation or transformed address range bounds checks.
16 N/A The diff does not touch optimize_layout or evaluate_transform.
17 N/A The diff does not touch tiling_recorder.py, round-trip analysis, or tiling visualization.
18 N/A The diff does not touch InterleavedStyle, helpers/tiling/kernels/ demos, or tiling numeric gates.
§O graded 16/16
# Verdict Evidence
1 N/A This PR does not touch platform/python/rocke/core/, platform/cpp/core/, or IR verification/address spaces.
2 N/A This PR does not modify scf.for structure, region verification, or kernel block termination in core.
3 N/A This PR does not touch IRBuilder, LLVM lowering, intrinsic declaration tables, or metadata emission in core.
4 N/A This PR does not modify IR type definitions, SmemType, or IR parsing in core.
5 N/A This PR does not touch core/passes.py, cpp/core/passes.cpp, or op purity tables.
6 N/A This PR does not modify constant folding passes in Python or C++ core.
7 N/A This PR does not modify kernel attribute lowering, codegen_policy.py, COMGR option generation, or check_cluster_dims.
8 N/A This PR does not modify CodegenPolicy, SchedulerStrategy, or scheduler attribute handling.
9 N/A This PR does not touch waitcnt encoding, barrier lowering, or optimization_barrier in core.
10 N/A This PR does not touch Python or C++ LLVM lowerers or parameter type/attribute emission.
11 N/A This PR does not touch ArchTarget or architecture target resolution in core/arch/.
12 N/A This PR does not modify vector-load width caps, async_lds_max_dwords, or arch defaults in core/lowering.
13 N/A This PR does not touch cpp/include/rocke/ structs, enums, or ABI version constants.
14 N/A This PR does not touch C++ sources, headers, cpp/bindings/, or platform/CMakeLists.txt.
15 N/A This PR does not modify C++ engine fallback handling, flavor resolution, or lower_hip.py/lower_cktile.py.
16 N/A This PR does not touch known_gaps.md, the C++ library, or gfx1250 lowering/builders.
§P graded 14/14
# Verdict Evidence
1 N/A The PR only updates GDN/KDA dispatch defaults and docs (library/dispatch/gdn/, platform/python/rocke/dispatch/tuning/candidate.py), and does not add or modify any kernel builder signatures or REQUIRED_FIELDS.
2 N/A No kernel signatures, kernarg packing, or GEMM/conv ABIs are touched in this diff.
3 N/A Launch geometry formulas for GEMM, implicit-GEMM, or GDN decode are not modified; test harnesses continue taking launch configuration from the dispatched spec (library/tests/test_kda_decode_gfx950_numeric.py:160).
4 N/A No LDS capacity gates or kernel validators are modified in this diff.
5 N/A WMMA/RDNA GEMM, wave_size rules, and GemmMultiD/GemmMultiAbd are not touched by this PR.
6 N/A No caller-zeroed workspaces (Stream-K, MoE, split-K) are touched in this PR.
7 N/A No Stream-K, persistent GEMM, GroupedGemmLauncher, or SUPPORT_MATRIX.md limits are modified in this PR.
8 N/A No quantization helpers, MX GEMM, or scale decode paths are touched in this PR.
9 N/A No numeric emulation or scale/dtype decode paths are added or modified in this PR.
10 N/A No manifest kinds, emitters, schemas, or helpers/manifest.py code are touched in this PR.
11 N/A Runtime launch/stream synchronization primitives (runtime/) are not modified, and existing test launches (library/tests/test_kda_decode_gfx950_numeric.py:165) remain unchanged.
12 N/A COMGR and HIP library loading are not touched, and this PR does not fix a HIP launch error.
13 PASS The host-side dispatch routing change (platform/python/rocke/dispatch/tuning/candidate.py:122 and library/dispatch/gdn/gfx950.py:192) is validated with unit and numeric GPU tests for GDN and KDA (library/tests/test_gdn_decode_gfx950_numeric.py:817, library/tests/test_kda_decode_gfx950_numeric.py:160, platform/tests/dispatch/dispatch_tests/tuning/test_tuning_template.py:540).
14 N/A No files under examples/, instances/, or helpers/ are added or modified in this PR.
§Q graded 7/7
# Verdict Evidence
1 N/A No new test files are added or removed in this PR; only test functions inside existing test files (test_tuning_template.py, test_gfx950_wiring.py, etc.) are modified.
2 N/A No new kernel family or variant is added (GDN/KDA decode already exists and this PR only selects existing registered tile x knob configurations for auto), and ALGORITHM.md notes the GDN dispatch layer is Python-only.
3 PASS dnn-providers/hip-kernel-provider/rocke/library/tests/test_gdn_decode_golden.py:234 records the new auto_* cases in the golden tripwire, while test_gdn_decode_gfx950_numeric.py:817 (test_every_auto_configuration_matches_fp32_through_dispatch) separately verifies numerics on device against the fp32 reference.
4 NEEDS-INFO dnn-providers/hip-kernel-provider/rocke/library/tests/golden/gdn_decode_gfx950_ir_sha256.json is truncated at line 91 inside llvm20, so the diff does not show whether llvm22 and llvm23 entries in GOLDEN_FLAVORS were also updated.
5 PASS dnn-providers/hip-kernel-provider/rocke/platform/tests/dispatch/dispatch_tests/tuning/test_tuning_template.py:553 and library/tests/dispatch/gdn/test_gfx950_wiring.py:145 run purely on CPU without torch or a GPU, and negative tests assert exact parser/validator rejections (ValueError, RuntimeError, PinRefused).
6 N/A No gate or harness refactor is performed in this PR.
7 N/A No C++/Python engine rejection-contract changes are made; the only new exceptions (ValueError and RuntimeError in platform/python/rocke/dispatch/tuning/candidate.py:151) are in the Python-only dispatch tuning…
§R graded 11/11
# Verdict Evidence
1 PASS The PR selects per-case defaults via a two-stage cold-memory sweep of every legal tile × knob configuration on gfx950, correctness-pruned against the fp32 reference, without adding a new kernel body or structure (dnn-providers/hip-kernel-provider/rocke/library/builders/gfx950/gdn/ALGORITHM.md:537, dnn-providers/hip-kernel-provider/rocke/library/dispatch/gdn/axes.py:129).
2 PASS The changed heuristic defaults map to existing documented knobs in §4.10 (dnn-providers/hip-kernel-provider/rocke/library/builders/gfx950/gdn/ALGORITHM.md:544) and are explicitly scoped to ARCH = "gfx950" (dnn-providers/hip-kernel-provider/rocke/library/dispatch/gdn/gfx950.py:48, dnn-providers/hip-kernel-provider/rocke/library/builders/gfx950/gdn/ALGORITHM.md:991).
3 PASS The per-case tile and knob selections (waves_per_eu, streaming state hints, LDS sharing knobs) are backed by measured cold-memory sweeps across 3 head geometries and batches 1..256 (dnn-providers/hip-kernel-provider/rocke/library/builders/gfx950/gdn/ALGORITHM.md:555) and verified for zero spill (dnn-providers/hip-kernel-provider/rocke/library/tests/test_gdn_decode_spec.py:412).
4 PASS Every dispatched auto configuration is pinned in the golden IR SHA256 manifest (dnn-providers/hip-kernel-provider/rocke/library/tests/golden/gdn_decode_gfx950_ir_sha256.json:5, dnn-providers/hip-kernel-provider/rocke/library/tests/test_gdn_decode_golden.py:215) and verified via compiled code-object metadata to have 0 scratch bytes / no register spills (dnn-providers/hip-kernel-provider/rocke/library/tests/test_gdn_decode_spec.py:412…
5 N/A The diff only updates dispatcher auto default selection and documentation (library/dispatch/gdn/axes.py, library/dispatch/gdn/gfx950.py) and does not add or modify any global memory access in a kernel body.
6 N/A The diff does not change any LDS or MMA layout in the kernel builder (library/kernels/gfx950/gdn_decode.py only has docstring/comment updates).
7 N/A The PR selects defaults via empirical tile × knob sweeps and makes no unmeasured bottleneck classification claims.
8 N/A The diff does not add, remove, or modify any waits, barriers, or scheduling hints in kernel code or lowering.
9 PASS The defaults are selected from a shape sweep across three head geometries and batches 1..256 on gfx950 (the only supported arch for this family), with selection rules, batch-1 latency override, and unmeasured shape caveats explicitly documented (dnn-providers/hip-kernel-provider/rocke/library/builders/gfx950/gdn/ALGORITHM.md:555, dnn-providers/hip-kernel-provider/rocke/library/dispatch/gdn/axes.py:110).
10 PASS Benchmark methodology follows runbook hygiene: cold-memory rotation (>= 1 GiB), interleaved arms in one process, repeated independent runs, fp32 reference gating, and relative ratios only (dnn-providers/hip-kernel-provider/rocke/library/builders/gfx950/gdn/ALGORITHM.md:555, dnn-providers/hip-kernel-provider/rocke/library/builders/gfx950/gdn/CASE_STUDY.md:171).
11 PASS The new auto default selection rule, provenance, latency override, and unmeasured bounds are documented without absolute timing numbers in dnn-providers/hip-kernel-provider/rocke/library/builders/gfx950/gdn/ALGORITHM.md:537 and dnn-providers/hip-kernel-provider/rocke/platform/dsl_docs/instances/gdn.md:154, and measured_results.md is untouched.
§S graded 8/8
# Verdict Evidence
1 PASS New auto_knobs parameter on make_tuned_candidate (dnn-providers/hip-kernel-provider/rocke/platform/python/rocke/dispatch/tuning/candidate.py:122) is tested in dnn-providers/hip-kernel-provider/rocke/platform/tests/dispatch/dispatch_tests/tuning/test_tuning_template.py:540-573, and new GDN dispatch symbols AutoDefault, AUTO_DEFAULTS, AUTO_STATE_ROW (dnn-providers/hip-kernel-provider/rocke/library/dispatch/gdn/axes.py:86-173) and…
2 NEEDS-INFO Updated auto behavior of dispatch_gdn_decode and auto_tile (dnn-providers/hip-kernel-provider/rocke/library/dispatch/gdn/gfx950.py:95-106) keeps and updates existing tests in dnn-providers/hip-kernel-provider/rocke/library/tests/dispatch/gdn/test_gfx950_registry.py:122-129, dnn-providers/hip-kernel-provider/rocke/library/tests/dispatch/gdn/test_gfx950_wiring.py:145-329, dnn-providers/hip-kernel-provider/rocke/library/tests/dispatch/gdn/test_tuning_contract.py:178-225, dnn-providers/hip-kernel-provider/rocke/library/tests/test_gdn_decode_tune.py:105-227, dnn-providers/hip-kernel-provider/rocke/library/tests/test_kda_decode_benchmark.py:46-52…
3 PASS Removed module attributes DEFAULT_TILE, FUSED_DEFAULT_TILE, _TUNED_TILES_KDA, work_for, and tile_for_work (dnn-providers/hip-kernel-provider/rocke/library/dispatch/gdn/gfx950.py:48-130) have all import sites and tests updated (dnn-providers/hip-kernel-provider/rocke/library/builders/gfx950/gdn/tune.py:39, dnn-providers/hip-kernel-provider/rocke/library/builders/gfx950/gdn/CASE_STUDY.md:203…
4 PASS No __all__ lists are modified, and internal module-level helpers in dnn-providers/hip-kernel-provider/rocke/library/dispatch/gdn/axes.py:95-184 (_auto, _STREAMING_STATE, _AXIS_VALUES) and dnn-providers/hip-kernel-provider/rocke/library/dispatch/gdn/gfx950.py:56 (_auto_tiles) are underscore-prefixed.
5 PASS Tests assert exact spec fields, knob dictionaries, replay behavior, golden IR SHA256 hashes, and negative exception contracts: ValueError for auto_knobs without route_auto and RuntimeError when auto_knobs fail to resolve on a buildable base (dnn-providers/hip-kernel-provider/rocke/platform/tests/dispatch/dispatch_tests/tuning/test_tuning_template.py:549-563), plus numeric verification against fp32 reference on GPU…
6 PASS CPU-checkable contracts (tuning template resolution, dispatch routing, knob scope dropping, and golden IR hashes) are tested on CPU without a GPU in dnn-providers/hip-kernel-provider/rocke/platform/tests/dispatch/dispatch_tests/tuning/test_tuning_template.py:533-573, dnn-providers/hip-kernel-provider/rocke/library/tests/dispatch/gdn/test_gfx950_wiring.py:130-329, and…
7 N/A The changes are in Python-only dispatch and tuning layers (rocke.dispatch.tuning and library/dispatch/gdn/), which have no C++ twin by design (ALGORITHM.md §8 item 6 and library/dispatch/AGENTS.md), and the…
8 PASS The PR description ('How it was validated') states that check_byte_identity.py, strict parity, golden lowering across both engines, 735 host tests, and GPU suites on gfx950 were run, and no changes were made to UniversalGemmSpec, compile_kernel, KernelLauncher, time_launches, or run_manifest (GDN README.md usage was updated in dnn-providers/hip-kernel-provider/rocke/library/builders/gfx950/gdn/README.md:35-256).

@CongMa13

Copy link
Copy Markdown
Contributor

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

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

@AviralGoelAMD
AviralGoelAMD changed the base branch from users/avirgoel/rocke/gdn-decode-registry to develop October 28, 2026 06:44
@AviralGoelAMD AviralGoelAMD self-assigned this Oct 28, 2026
@therock-pr-bot

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

Copy link
Copy Markdown

✅ All Checks Passed — Ready for Review

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

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

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

🙋 Wish to Override Policy?

@therock-pr-bot

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

Copy link
Copy Markdown

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

@yraparti yraparti left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

rocKE checklist re-review of the fixes since 21ae09d01697

ROCm/rocm-libraries#14353 · 1da2195d03ce · model gemini-4-argon, fallback gpt-5.5

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

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

Since the last review (21ae09d01697)

Resolved 0 · still open 2 · new 0

  • ⏳ §E.17 still FAIL (HIGH): Remove the absolute figure. Keep code comments qualitative.
  • ⏳ §G.23 still FAIL (HIGH): Include the absolute measurements alongside the ratios for the A/B routing and AITER comparisons, or remove the ratio table from the PR description.

Findings

  • HIGH §E · dnn-providers/hip-kernel-provider/rocke/library/tests/test_gdn_decode_tune.py:111 · Remove the absolute figure. Keep code comments qualitative.
  • HIGH §G · dnn-providers/hip-kernel-provider/rocke/library/builders/gfx950/gdn/ALGORITHM.md:555 · Include the absolute measurements alongside the ratios for the A/B routing and AITER comparisons, or remove the ratio table from the PR description.

Needs info

  • §D.5 GdnDecodeTunedSpec.identity() returns asdict(self.kernel_spec) (excluding candidate_name, tuning_id, etc.), auto resolves through resolve(stacked) into a canonical concrete kernel_spec, and tests assert unique kernel_name(), tuning_id, and compile_key per canonical configuration (dnn-providers/hip-kernel-provider/rocke/library/dispatch/gdn/common.py:190, dnn-providers/hip-kernel-provider/rocke/platform/python/rocke/dispatch/tuning/candidate.py:173, dnn-providers/hip-kernel-provider/rocke/library/tests/dispatch/gdn/test_tuning_contract.py:171). — no diff line supports this verdict
  • §D.13 Pinned requests and tuning pins never fall back: resolve_pinned and routed in dnn-providers/hip-kernel-provider/rocke/platform/python/rocke/dispatch/tuning/candidate.py:66-70,170-184 preserve caller pins and raise on invalid auto knobs, while pin refusal is tested in dnn-providers/hip-kernel-provider/rocke/library/tests/dispatch/gdn/test_gfx950_registry.py:119, dnn-providers/hip-kernel-provider/rocke/library/tests/dispatch/gdn/test_gfx950_wiring.py:486-491,876-880, and dnn-providers/hip-kernel-provider/rocke/library/tests/dispatch/gdn/test_tuning_contract.py:569-620. — no diff line supports this verdict
  • §E.10 Not resolved since the previous review: the diff still does not provide the required list of open PRs touching the same GDN dispatch/golden/test areas, agreed land order, and re-run evidence on current develop plus those PRs.
  • §F.6 The new commits (21ae09d01697..1da2195d03ce) in dnn-providers/hip-kernel-provider/rocke/library/dispatch/gdn/gfx950.py:209 are formatted cleanly, but local pre-commit execution status cannot be verified from the PR diff alone.
  • §F.7 Review-response changes were pushed in dnn-providers/hip-kernel-provider/rocke/library/dispatch/gdn/gfx950.py:209 and dnn-providers/hip-kernel-provider/rocke/library/tests/test_gdn_decode_tune.py:87, but bot and Copilot review thread states/resolutions are not included in the prompt payload.
  • §G.2 Every auto configuration is tested on-silicon against the fp32 reference in dnn-providers/hip-kernel-provider/rocke/library/tests/test_gdn_decode_gfx950_numeric.py:817 and dnn-providers/hip-kernel-provider/rocke/library/tests/test_kda_decode_gfx950_numeric.py:160. — no diff line supports this verdict
  • §K.6 Resolved from previous review: GdnDecodeSpace.validate delegates to is_valid_spec(kernel, arch=self.arch) (library/dispatch/gdn/rules.py:222-223), routed resolves auto_knobs through the shared resolve gate (platform/python/rocke/dispatch/tuning/candidate.py:171-183), and test_auto_is_its_case_stack_on_the_case_tile verifies auto.spec is in dispatch_gdn_decode_all(req) (library/tests/dispatch/gdn/test_tuning_contract.py:195-198). — no diff line supports this verdict
  • §K.9 dispatch_gdn_decode pins the result's request with pin_to_spec (library/dispatch/gdn/__init__.py:155), routed checks carries_tuning_pin(req) so caller pins are never overwritten by auto_knobs (platform/python/rocke/dispatch/tuning/candidate.py:43-46, platform/python/rocke/dispatch/tuning/candidate.py:170-183), and stale or out-of-scope tuning_id pins raise PinRefused without fallback (library/dispatch/gdn/gfx950.py:213-234, library/tests/dispatch/gdn/test_tuning_contract.py:336-361). — no diff line supports this verdict

Section notes

  • §A: Re-evaluated against head 1da2195; the new commits only adjust dispatch auto_knobs for non-128 head dims and add corresponding tests/docs without affecting byte-identity or cross-engine parity.
  • §B: Re-reviewed head 1da2195; the new commits drop waves_per_eu off the measured (128, 128) head dims to prevent spilling and add tests without introducing silent normalization or unverified scope.
  • §G: Re-verified against head 1da2195; all items pass or are N/A, including the new off-D128 waves_per_eu guard and its tests.
  • §H: No device-side masks or bounds are added or modified in this PR; the changes are confined to dispatch tuning space registration, static auto default tables (AUTO_DEFAULTS), and tests/documentation.
  • §J: ### Shapes | Equation / Relation | Operands & Shapes | Inner Dims | Result vs Declared | | --- | --- | --- | --- | | WTK × VPT = 128 (ALGORITHM.md:602) | scalar WTK (K-threads/warp), scalar VPT (vec elements/thread) | scalar product | scalar 128 vs DK divisibility bound | | BH = 32 × batch (ALGORITHM.md:213) | scalar Hv = 32, scalar batch | scalar product | scalar BH vs prefill value_splits band key | ### Symbols | Symbol | Defined / Used In | Domain | | --- | --- | --- | | (NW, WTK, BPV) | ALGORITHM.md:497-499, :544, CASE_STUDY.md:47 | (num_warps, warp_threads_k, blocks_per_v_dim) | | Hk/Hv, DK, DV | ALGORITHM.md:504, :557-563, :579-581, :601-603 | head counts and key/value head dimensions | | AUTO_DEFAULTS, AUTO_WAVES_PER_EU_HEAD_DIMS | ALGORITHM.md:539, dispatch/gdn/axes.py:114, :135 | static per-case (tile, knobs) map and (128, 128) WPE head-dim gate | | spec_id, tuning_id, tuning_knobs |…
  • §K: Identity table: No knob axes, dataclass defaults, canonicalization rules, or TUNING_ID_VERSION changed (library/dispatch/gdn/axes.py:59-69, library/dispatch/gdn/rules.py:95-99). config_key does not change for any configuration, and no stored pins are invalidated (library/tests/dispatch/gdn/test_gfx950_wiring.py:240-252). Unpinned auto routing now selects measured per-case tile + knob stacks via AUTO_DEFAULTS and auto_knobs (library/dispatch/gdn/axes.py:135-179, library/dispatch/gdn/gfx950.py:197-211).

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 N/A No kernel-body emitters are modified; library/kernels/gfx950/gdn_decode.py only extracts spec-validation predicates…
2 N/A No core lowering-op or op-handler files (core/lower_*, core/ir) are touched in this PR.
3 PASS Changes are confined to the Python-only dispatch registry and tuning layer (platform/python/rocke/dispatch/tuning/candidate.py:121 and library/dispatch/gdn/gfx950.py:197), which need no C++ twin by design.
4 N/A No C++ twin or IR emission order is modified in this PR.
5 PASS Existing golden hashes are untouched while new auto_* cases are added for the newly selected default configurations in library/tests/test_gdn_decode_golden.py:234.
6 PASS The PR only adds golden cases in library/tests/test_gdn_decode_golden.py:234 for dispatch defaults without changing any kernel emitter or lowering logic, and explicitly validates check_byte_identity.py in the PR test summary.
7 N/A No new kernel emitter or lowering logic is added on any hot path.
8 N/A No C++ files or cross-engine lowerers/builders are modified in this PR.
9 N/A No shared op-handler fix or lowerer arch divergence is introduced.
10 PASS Every newly dispatched auto_* configuration is added to the golden hash test in library/tests/test_gdn_decode_golden.py:218 and enforced by test_every_shipped_configuration_is_recorded at library/tests/test_gdn_decode_golden.py:457.
11 N/A No new IR op is introduced 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 helpers/ are modified in this PR.
§B graded 6/6
# Verdict Evidence
1 PASS dnn-providers/hip-kernel-provider/rocke/library/dispatch/gdn/gfx950.py:204 — Emitter coupling for norm_gate_once without conv_once is explicitly classified as a NOT_YET_IMPLEMENTED validator rule with a documented backlog item (ALGORITHM.md section 8…
2 N/A No preflight gate or spec constructor validation rules are added or modified in this PR.
3 PASS dnn-providers/hip-kernel-provider/rocke/library/tests/dispatch/gdn/test_gfx950_wiring.py:165 — All model-zoo deployment shapes and their tensor-parallel splits are verified to select their measured AUTO_DEFAULTS tile and knob stack, and off-shape head dims drop only…
4 PASS dnn-providers/hip-kernel-provider/rocke/library/dispatch/gdn/rules.py:212 — GdnDecodeSpace.canonicalize strictly checks type(value) is not int for waves_per_eu so True, None, and 4.0 are rejected rather than coerced, and request_errors…
5 PASS dnn-providers/hip-kernel-provider/rocke/library/tests/test_gdn_decode_gfx950_numeric.py:817 — Every newly opened auto configuration and pinned tuning sample is tested against the FP32 reference on device, and test_auto_does_not_spill_off_the_measured_head_dims…
6 N/A is_valid_spec and supports_* functions are not modified to add policy or routing opinions in this PR; routing opinions remain…
§C graded 10/10
# Verdict Evidence
1 PASS Repeated tuning-pin and auto-default selection predicates are factored into named helpers carries_tuning_pin in dnn-providers/hip-kernel-provider/rocke/platform/python/rocke/dispatch/tuning/candidate.py:43, out_of_scope_knobs in…
2 PASS All auto configurations route through the single build_gdn_decode(spec) builder via spec flags/knobs and dispatch (dnn-providers/hip-kernel-provider/rocke/library/tests/test_gdn_decode_golden.py:235).
3 N/A This PR does not add or rename any kernel builder functions or modify kernel_name().
4 PASS Arch-independent candidate hook logic is in dnn-providers/hip-kernel-provider/rocke/platform/python/rocke/dispatch/tuning/candidate.py:122 and dnn-providers/hip-kernel-provider/rocke/library/dispatch/gdn/common.py:170, while gfx950-specific tuning defaults live in…
5 PASS The diff is scoped strictly to the auto_knobs tuning template hook (dnn-providers/hip-kernel-provider/rocke/platform/python/rocke/dispatch/tuning/candidate.py:122), the shared WavesPerEuSpace…
6 PASS Rather than special-casing auto outside the candidate template, the PR adds an optional auto_knobs hook to make_tuned_candidate (dnn-providers/hip-kernel-provider/rocke/platform/python/rocke/dispatch/tuning/candidate.py:122) and expresses per-case defaults as…
7 N/A This PR intentionally changes auto dispatch selections to measured per-case configurations rather than performing a no-op cleanup.
8 PASS The change extends the existing make_tuned_candidate helper in dnn-providers/hip-kernel-provider/rocke/platform/python/rocke/dispatch/tuning/candidate.py:122, lifts WavesPerEuSpace into…
9 N/A This PR sets measured auto tuning defaults and is not a bug fix.
10 PASS Widening make_tuned_candidate with auto_knobs in dnn-providers/hip-kernel-provider/rocke/platform/python/rocke/dispatch/tuning/candidate.py:122 preserves opt-in and non-auto_knobs families, guards auto_knobs without route_auto…
§D graded 21/21
# Verdict Evidence
1 PASS Per-case auto defaults and knobs are declared as data over GdnDecodeSpec fields / KnobAxis axes with no os.environ reads (dnn-providers/hip-kernel-provider/rocke/library/dispatch/gdn/axes.py:59…
2 PASS ARCH = "gfx950" is an explicit gfx target and kernel coverage constants (GDN_DTYPES, _MAX_WAVES_PER_EU, STATE_HINTS, STATE_DTYPES) are imported from kernels.gfx950.gdn_decode (dnn-providers/hip-kernel-provider/rocke/library/dispatch/gdn/gfx950.py:29…
3 PASS route_auto and scope_check return specific reason strings without re-checking Capability, and tests call candidate.admits(req) (dnn-providers/hip-kernel-provider/rocke/library/dispatch/gdn/gfx950.py:185…
4 PASS auto_default, auto_tile, route_auto, and auto_knobs are pure functions of req with no device probes (dnn-providers/hip-kernel-provider/rocke/library/dispatch/gdn/gfx950.py:100, dnn-providers/hip-kernel-provider/rocke/library/dispatch/gdn/gfx950.py:197).
5 NEEDS-INFO GdnDecodeTunedSpec.identity() returns asdict(self.kernel_spec) (excluding candidate_name, tuning_id, etc.), auto resolves through resolve(stacked) into a canonical concrete kernel_spec, and tests assert unique kernel_name(), tuning_id, and compile_key per canonical configuration (dnn-providers/hip-kernel-provider/rocke/library/dispatch/gdn/common.py:190…
6 N/A This PR does not introduce or modify attention cohort routing; it updates GDN/KDA decode per-case static defaults.
7 N/A GDN/KDA decode uses a single static AUTO_DEFAULTS table per case (gate_kind, fused, state_dtype) rather than layered…
8 PASS routed(req) in make_tuned_candidate is shared by support and select_spec, and auto_default(req) / auto_tile(req) plus the kernel's *_applies predicates are shared across route_auto, auto_knobs, and rules.py…
9 PASS Each tuned candidate is registered via make_tuned_candidate and every case's auto configuration is exercised through dispatch_gdn_decode and launched on device in the harness (dnn-providers/hip-kernel-provider/rocke/library/dispatch/gdn/gfx950.py:241…
10 PASS The new auto_knobs hook on make_tuned_candidate and tuning_id / tuning_knobs fields on GdnDecodeRequest are wired into GDN decode dispatch and tested at the dispatcher level (dnn-providers/hip-kernel-provider/rocke/library/dispatch/gdn/common.py:130…
11 PASS Candidates without route_auto remain opt-in (auto_knobs without route_auto raises ValueError), and promoting the per-case AUTO_DEFAULTS for auto is backed by cold-memory sweep measurements documented with each config…
12 PASS Priority order is defined in dnn-providers/hip-kernel-provider/rocke/library/dispatch/gdn/gfx950.py:74-81 (CONFIGURED_TILES_BY_GATE) and assigned in dnn-providers/hip-kernel-provider/rocke/library/dispatch/gdn/gfx950.py:274-280, documented in…
13 NEEDS-INFO Pinned requests and tuning pins never fall back: resolve_pinned and routed in dnn-providers/hip-kernel-provider/rocke/platform/python/rocke/dispatch/tuning/candidate.py:66-70,170-184 preserve caller pins and raise on invalid auto knobs, while pin refusal is tested in dnn-providers/hip-kernel-provider/rocke/library/tests/dispatch/gdn/test_gfx950_registry.py:119…
14 N/A This PR does not modify KernelId, compile_key, selection_key, abi_version, or kernel kernarg layouts.
15 PASS This PR intentionally updates existing GDN/KDA routing (AUTO_DEFAULTS in dnn-providers/hip-kernel-provider/rocke/library/dispatch/gdn/axes.py:135-179 and route_auto/auto_knobs in dnn-providers/hip-kernel-provider/rocke/library/dispatch/gdn/gfx950.py:185-211) and…
16 N/A This PR does not introduce a new operator family; gdn is an existing family.
17 PASS CPU routing and tuning contract tests are updated and expanded in dnn-providers/hip-kernel-provider/rocke/library/tests/dispatch/gdn/test_gfx950_wiring.py:145-344, dnn-providers/hip-kernel-provider/rocke/library/tests/dispatch/gdn/test_tuning_contract.py:95-225, and…
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 modifies GDN/KDA decode dispatch (library/dispatch/gdn/) and does not touch unified attention…
20 PASS Resolved: the PR explicitly documents in dnn-providers/hip-kernel-provider/rocke/library/builders/gfx950/gdn/ALGORITHM.md:1002-1005 that the GDN/KDA decode dispatch and tuning layer is Python-only with no C++ selector twin.
21 PASS The PR changes only which spec configuration is chosen by auto via AUTO_DEFAULTS and auto_knobs (dnn-providers/hip-kernel-provider/rocke/library/dispatch/gdn/axes.py:135-179, dnn-providers/hip-kernel-provider/rocke/library/dispatch/gdn/gfx950.py:197-211) without…
§E graded 17/17
# Verdict Evidence
1 PASS Platform tuning changes import within platform only (dnn-providers/hip-kernel-provider/rocke/platform/python/rocke/dispatch/tuning/candidate.py:23), and the shared WavesPerEuSpace is exported from platform tuning rather than importing library code…
2 PASS The new GDN tuned candidates explicitly keep no Torch binding or Torch-based launch path in library dispatch (dnn-providers/hip-kernel-provider/rocke/library/dispatch/gdn/gfx950.py:229 and dnn-providers/hip-kernel-provider/rocke/library/dispatch/gdn/gfx950.py:237).
3 PASS Library dispatch code keeps Torch out of the implementation path by setting bind_torch=None (dnn-providers/hip-kernel-provider/rocke/library/dispatch/gdn/gfx950.py:237), while GPU tests remain under explicit gfx950 gating such as…
4 PASS Library dispatch imports stay downward into kernels/platform tuning and local dispatch modules, e.g. dnn-providers/hip-kernel-provider/rocke/library/dispatch/gdn/rules.py:18 and dnn-providers/hip-kernel-provider/rocke/library/builders/gfx950/gdn/tune.py:31 imports…
5 PASS The new platform helper is a Python module with no absolute paths or shell-only constructs (dnn-providers/hip-kernel-provider/rocke/platform/python/rocke/dispatch/tuning/waves.py:1), and the platform candidate changes use normal Python imports/hooks rather than…
6 PASS Emitter-tree changes add explicit knob predicate helpers rather than deleting handles (dnn-providers/hip-kernel-provider/rocke/library/kernels/gfx950/gdn_decode.py:273), and the default-tile comment update is descriptive only…
7 PASS The new GDN auto defaults and tuning behavior are documented with the code in ALGORITHM.md (dnn-providers/hip-kernel-provider/rocke/library/builders/gfx950/gdn/ALGORITHM.md:492) and the platform instance index is updated for the changed GDN decode selection model…
8 PASS New code/docs use descriptive references such as ALGORITHM.md section references instead of Jira IDs, reviewer handles, or PR numbers in code comments (dnn-providers/hip-kernel-provider/rocke/library/dispatch/gdn/axes.py:119 and…
9 PASS The added shared tuning hook supports this PR's GDN auto configuration work (dnn-providers/hip-kernel-provider/rocke/platform/python/rocke/dispatch/tuning/candidate.py:118), and the attention WavesPerEuSpace move is the corresponding shared tuning refactor…
10 NEEDS-INFO Not resolved since the previous review: the diff still does not provide the required list of open PRs touching the same GDN dispatch/golden/test areas, agreed land order, and re-run evidence on current develop plus those PRs.
11 PASS Committed docs are deliverables for this family, including the updated GDN case study (dnn-providers/hip-kernel-provider/rocke/library/builders/gfx950/gdn/CASE_STUDY.md:49) and required algorithm documentation…
12 PASS The change explicitly scopes the measured defaults to gfx950 and states gfx942 is not measured (dnn-providers/hip-kernel-provider/rocke/library/dispatch/gdn/axes.py:119), with the same scope documented in the algorithm notes…
13 PASS Removed work-keyed KDA symbols are no longer imported; historical prose uses a local KDA_TILES list instead (dnn-providers/hip-kernel-provider/rocke/library/builders/gfx950/gdn/CASE_STUDY.md:200 and…
14 PASS The known fallback limitation remains documented in code (dnn-providers/hip-kernel-provider/rocke/library/dispatch/gdn/gfx950.py:55) and is preserved as an explicit follow-up instead of being dropped…
15 PASS New tuning hook parameters are used: route_auto and auto_knobs are accepted by make_tuned_candidate (dnn-providers/hip-kernel-provider/rocke/platform/python/rocke/dispatch/tuning/candidate.py:118) and consumed in routing/selection…
16 N/A Severity labeling applies to review output rather than PR diff content, and this section has no FAIL verdicts.
17 FAIL dnn-providers/hip-kernel-provider/rocke/library/tests/test_gdn_decode_tune.py:111 contains an absolute performance figure
§F graded 11/11
# Verdict Evidence
1 PASS Branch users/avirgoel/rocke/gdn-decode-defaults matches users/<user>/… (and diff touches dnn-providers/hip-kernel-provider/rocke/library/dispatch/gdn/axes.py:114).
2 PASS title perf(rocke): measured per-mode defaults for gfx950 GDN/KDA decode matches type(scope): summary and is 65 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_gfx950_registry.py is in the diff
5 PASS Changed files are only Markdown docs, Python sources/tests, CMakeLists.txt, and golden JSON (dnn-providers/hip-kernel-provider/rocke/library/dispatch/gdn/axes.py:1); no keys, certs, or secrets are present.
6 NEEDS-INFO The new commits (21ae09d01697..1da2195d03ce) in dnn-providers/hip-kernel-provider/rocke/library/dispatch/gdn/gfx950.py:209 are formatted cleanly, but local pre-commit execution status cannot be verified from the PR diff alone.
7 NEEDS-INFO Review-response changes were pushed in dnn-providers/hip-kernel-provider/rocke/library/dispatch/gdn/gfx950.py:209 and dnn-providers/hip-kernel-provider/rocke/library/tests/test_gdn_decode_tune.py:87, but bot and Copilot review thread states/resolutions are not included in the prompt payload.
8 PASS The PR body notes this was stacked on #14176 (users/avirgoel/rocke/gdn-decode-registry, now targeting develop), and it satisfies policy.yml rules (branch prefix, Conventional Commit title, ISSUE ID : AICK-2556, and unit tests such as…
9 PASS The PR keeps the cohesive change together across dispatch, docs, golden hashes, and tests (e.g. dnn-providers/hip-kernel-provider/rocke/library/dispatch/gdn/axes.py:135 and dnn-providers/hip-kernel-provider/rocke/library/tests/dispatch/gdn/test_gfx950_wiring.py:86).
10 PASS Added tests exercise real dispatch, tuning-template, no-spill, and numeric contracts (dnn-providers/hip-kernel-provider/rocke/library/tests/dispatch/gdn/test_gfx950_wiring.py:199, dnn-providers/hip-kernel-provider/rocke/library/tests/test_gdn_decode_spec.py:444…
11 PASS The PR title and full body are populated in the fetched PR metadata (Title: perf(rocke): measured per-mode defaults for gfx950 GDN/KDA decode, ISSUE ID : AICK-2556; diff at dnn-providers/hip-kernel-provider/rocke/library/dispatch/gdn/axes.py:135).
§G graded 34/34
# Verdict Evidence
1 PASS Byte-identity is supplemented with on-silicon fp32 reference checks for every auto configuration in dnn-providers/hip-kernel-provider/rocke/library/tests/test_gdn_decode_gfx950_numeric.py:817.
2 NEEDS-INFO Every auto configuration is tested on-silicon against the fp32 reference in dnn-providers/hip-kernel-provider/rocke/library/tests/test_gdn_decode_gfx950_numeric.py:817 and dnn-providers/hip-kernel-provider/rocke/library/tests/test_kda_decode_gfx950_numeric.py:160. — no diff line supports this verdict
3 PASS Golden IR hashes for all 24 new auto_* cases are enforced in dnn-providers/hip-kernel-provider/rocke/library/tests/test_gdn_decode_golden.py:215, and the PR body confirms byte-identity across llvm20/22/23 and host pytest suites passed.
4 PASS New tests directly assert the AUTO_DEFAULTS table, the off-D128 waves_per_eu drop, and the auto_knobs hook behavior in dnn-providers/hip-kernel-provider/rocke/library/tests/dispatch/gdn/test_gfx950_wiring.py:199 and…
5 PASS Tests enter through the public dispatch entry point dispatch_gdn_decode in dnn-providers/hip-kernel-provider/rocke/library/tests/dispatch/gdn/test_gfx950_wiring.py:177 and test specific failure modes like unresolvable auto_knobs in…
6 PASS The 8-row AUTO_DEFAULTS table and off-D128 waves_per_eu rule match across the PR body, dnn-providers/hip-kernel-provider/rocke/library/builders/gfx950/gdn/ALGORITHM.md:540, dnn-providers/hip-kernel-provider/rocke/library/dispatch/gdn/axes.py:114, and…
7 PASS The fp32 reference gate is documented as the first-class correctness gate before timing in dnn-providers/hip-kernel-provider/rocke/library/builders/gfx950/gdn/ALGORITHM.md:564.
8 N/A No dtype fallback logic in test or benchmark harnesses is added or modified in this PR.
9 PASS Scratch and spill checks inspect compiled code objects via _compiled_scratch_bytes in dnn-providers/hip-kernel-provider/rocke/library/tests/test_gdn_decode_spec.py:444 and dnn-providers/hip-kernel-provider/rocke/library/tests/test_kda_decode_resources.py:67.
10 PASS Performance provenance in dnn-providers/hip-kernel-provider/rocke/library/builders/gfx950/gdn/ALGORITHM.md:555 and the PR body locks the device (gfx950), container, cold-memory rotation, and fp32 parity gate, reporting ratios rather than raw latencies.
11 PASS The optimized auto configurations are reachable and tested through dispatch_gdn_decode in dnn-providers/hip-kernel-provider/rocke/library/tests/test_gdn_decode_gfx950_numeric.py:831.
12 PASS GDN/KDA decode dispatch is explicitly documented as Python-only with no C++ selector twin today in dnn-providers/hip-kernel-provider/rocke/library/builders/gfx950/gdn/ALGORITHM.md:1002.
13 N/A This PR does not add, modify, or recommend any LLVM intrinsic symbols or .td definitions.
14 PASS dnn-providers/hip-kernel-provider/rocke/library/builders/gfx950/gdn/ALGORITHM.md:394 explicitly distinguishes static code-object load-batch counts from hardware counters.
15 N/A The PR diff is provided directly in the review prompt context.
16 N/A This is a completed implementation PR rather than an unverified planning document.
17 PASS The modified tune.py script is tested in dnn-providers/hip-kernel-provider/rocke/library/tests/test_gdn_decode_tune.py:208 and reported in the PR validation section as run end-to-end on gfx950.
18 N/A No statistical or jitter-sensitive runtime guards are added in this diff.
19 PASS dnn-providers/hip-kernel-provider/rocke/platform/tests/dispatch/dispatch_tests/tuning/test_tuning_template.py:549 and dnn-providers/hip-kernel-provider/rocke/library/tests/test_gdn_decode_spec.py:444 construct fixtures (tile128 x unroll: 4 and off-D128…
20 N/A No claim-ban detector or text-sweeping lint rule is added or modified in this PR.
21 PASS dnn-providers/hip-kernel-provider/rocke/library/builders/gfx950/gdn/tune.py:301 and dnn-providers/hip-kernel-provider/rocke/library/tests/test_gdn_decode_tune.py:87 update tune.py to start KDA tile sweeps from the base configuration, verify that accepted inputs…
22 PASS dnn-providers/hip-kernel-provider/rocke/library/tests/golden/gdn_decode_gfx950_ir_sha256.json:5 and dnn-providers/hip-kernel-provider/rocke/library/tests/test_gdn_decode_golden.py:234 record bytes and sha256 for the 24 new auto_* golden cases without error…
23 FAIL Not resolved in the new commits: the PR body ('Comparison with AITER') and dnn-providers/hip-kernel-provider/rocke/library/builders/gfx950/gdn/ALGORITHM.md:555 label the axes, caveats, and fp32 oracle check on both routes, but still report only ratios while withholding absolute figures ('Absolute times are kept in the internal performance record, not in this public PR').
24 N/A No existing golden hashes were modified or re-blessed; only 24 new auto_* cases were added to…
25 N/A This PR changes dispatcher default selection (AUTO_DEFAULTS) rather than making a codegen or lowering micro-optimization to…
26 PASS The PR description ('Which code') and dnn-providers/hip-kernel-provider/rocke/library/builders/gfx950/gdn/ALGORITHM.md:438 confirm that the selected kernels on the measurement tree were verified to be IR-identical to this PR head on the loads-first order.
27 PASS dnn-providers/hip-kernel-provider/rocke/library/dispatch/gdn/axes.py:135 and dnn-providers/hip-kernel-provider/rocke/library/builders/gfx950/gdn/ALGORITHM.md:544 document and ship the exact per-case (tile, knobs) AUTO_DEFAULTS configurations that were measured.
28 PASS dnn-providers/hip-kernel-provider/rocke/library/builders/gfx950/gdn/ALGORITHM.md:537 and the PR body clearly separate the shipped auto table from non-shipped counterfactuals (such as best-swept per-shape configs against tuned AITER).
29 N/A No guarded-to-fast math primitive swaps (such as exp2 to exp2_fast) are introduced in this PR.
30 PASS dnn-providers/hip-kernel-provider/rocke/library/tests/test_gdn_decode_spec.py:412, test_gdn_decode_spec.py:444, and dnn-providers/hip-kernel-provider/rocke/library/tests/test_kda_decode_resources.py:67 compile every auto configuration (including off-D128 head…
31 PASS dnn-providers/hip-kernel-provider/rocke/library/builders/gfx950/gdn/ALGORITHM.md:555 and the PR body benchmark against AITER's shipped selection (plus tuned AITER overrides) and sweep legal tile x knob combinations on the existing loads-first kernel without…
32 PASS dnn-providers/hip-kernel-provider/rocke/library/builders/gfx950/gdn/ALGORITHM.md:555 and the PR body record target (gfx950), container/toolchain (ROCm 7.13 container, Python lowerer), cold-memory rotation method, and explicitly note the out-of-tree harness…
33 PASS dnn-providers/hip-kernel-provider/rocke/library/tests/dispatch/gdn/test_gfx950_wiring.py:86, test_gfx950_wiring.py:199, and test_gfx950_wiring.py:254 evaluate dispatch_gdn_decode across the cross-product of gate_kind, dims (including D64, D96, D192, D256…
34 N/A No opt-in kernel output flags (such as LSE output) are added or modified in this PR.
§H graded 5/5
# Verdict Evidence
1 N/A This PR only updates dispatch auto defaults and tuning candidate selection without adding or modifying hardware/resource bounds…
2 N/A This PR does not add or modify any paged/indirection table lookups or kernel memory indexing logic.
3 N/A This PR does not introduce or change any kernel hot-loop div/mod operations or divisor spec fields.
4 N/A This PR does not add or modify any device-side masks or bounds derived from runtime inputs.
5 N/A This PR does not add or modify any launch inputs that feed a device-side bound or mask.
§I graded 6/6
# Verdict Evidence
1 PASS dnn-providers/hip-kernel-provider/rocke/library/builders/gfx950/gdn/ALGORITHM.md:564 — The provenance documents sweeping every legal tile x knob configuration per case, correctness-gated against the fp32 reference, and tune.py:245 reports the auto tile base…
2 PASS dnn-providers/hip-kernel-provider/rocke/library/dispatch/gdn/gfx950.py:197 — Out-of-scope knobs on auto are repaired (dropped, including norm_gate_once when conv_once does not apply and waves_per_eu off the measured (128, 128) head dims at gfx950.py:209)…
3 PASS dnn-providers/hip-kernel-provider/rocke/library/tests/dispatch/gdn/test_gfx950_wiring.py:254 — test_auto_is_the_case_stack_or_the_documented_fallback combines curated case checks with a generated cartesian product over dims, state dtypes, fused modes, head…
4 PASS dnn-providers/hip-kernel-provider/rocke/library/builders/gfx950/gdn/tune.py:237 — report_gdn_dispatcher_default prints both the auto tile (base configuration) and the fastest legal candidate along with their ratio.
5 PASS dnn-providers/hip-kernel-provider/rocke/library/builders/gfx950/gdn/ALGORITHM.md:584 — Explicitly documents the baked AUTO_DEFAULTS table provenance, what was not measured, how to update it, and tracks the in-tree tiles x knobs sweep regeneration tool in…
6 N/A This PR updates dispatch defaults and the tuning candidate template without adding or modifying any DSL or…
§J graded 7/7
# Verdict Evidence
1 N/A No tensor or matrix recurrence equations are added or modified in the Markdown hunks; the diff only updates tile/knob selection…
2 PASS Symbols introduced or updated in dnn-providers/hip-kernel-provider/rocke/library/builders/gfx950/gdn/ALGORITHM.md:537-583 ((NW, WTK, BPV), Hk/Hv, DK, DV, AUTO_DEFAULTS, and knob names) have a single consistent meaning across ALGORITHM.md…
3 PASS Sibling docs link to ALGORITHM.md §4.6 instead of restating the table or fallback rules: dnn-providers/hip-kernel-provider/rocke/library/builders/gfx950/gdn/CASE_STUDY.md:55-58, CASE_STUDY.md:64-66, and…
4 PASS Novelty and status claims in dnn-providers/hip-kernel-provider/rocke/library/builders/gfx950/gdn/ALGORITHM.md:537-542, :704-709, and :1002-1018 accurately distinguish pre-existing knobs (§4.10) from the newly added AUTO_DEFAULTS table…
5 PASS Grid, work-scaling, and head-dim selection claims (batch × num_v_heads changing only the grid, and head_k_dim, head_v_dim changing selection only by dropping waves_per_eu off (128, 128)) are updated consistently across…
6 PASS dnn-providers/hip-kernel-provider/rocke/library/builders/gfx950/gdn/ALGORITHM.md:555-586 documents full provenance for the AUTO_DEFAULTS constants: hardware/container, cold-memory rotation, head geometries anchored to §1.4 deployments (Qwen3-Next 16/32…
7 N/A No new Markdown files are added in this PR; all documentation changes edit existing files.
§K graded 13/13
# Verdict Evidence
1 PASS Candidates are built with make_tuned_candidate over GdnDecodeSpace (library/dispatch/gdn/gfx950.py:241-267) and tested via assert_tuning_contract on representative candidates with other_requests, default_knobs, and refused_knobs…
2 PASS Every GdnDecodeSpec field is classified into PROBLEM_FIELDS, TILE_FIELDS, AXES (+ waves_per_eu), or UNTUNABLE_FIELDS, with CONV_ONCE_AXIS ordered before NORM_GATE_ONCE_AXIS (library/dispatch/gdn/axes.py:49-69, library/dispatch/gdn/rules.py:54-80)…
3 PASS No dataclass defaults, knob definitions, or canonicalization rules changed (library/dispatch/gdn/rules.py:95-99), test_a_spec_id_pin_of_the_auto_tile_runs_its_base verifies bare tile pins keep their base meaning…
4 PASS GdnDecodeSpace.defaults returns dict(_SPEC_DEFAULTS) which excludes PROBLEM_FIELDS and TILE_FIELDS (library/dispatch/gdn/rules.py:95-99, library/dispatch/gdn/rules.py:225-226).
5 PASS Out-of-scope knobs are dropped via _axes_of while malformed values outside _AXIS_VALUES are refused (library/dispatch/gdn/rules.py:129-152, library/dispatch/gdn/rules.py:192-217), and auto_knobs drops norm_gate_once without conv_once and waves_per_eu…
6 NEEDS-INFO Resolved from previous review: GdnDecodeSpace.validate delegates to is_valid_spec(kernel, arch=self.arch) (library/dispatch/gdn/rules.py:222-223), routed resolves auto_knobs through the shared resolve gate (platform/python/rocke/dispatch/tuning/candidate.py:171-183), and test_auto_is_its_case_stack_on_the_case_tile verifies auto.spec is in dispatch_gdn_decode_all(req)…
7 PASS base=lambda req: make_spec(req, tile) is a pure function of request fields and memoized by resolve_base (library/dispatch/gdn/gfx950.py:120-146, library/dispatch/gdn/gfx950.py:249, platform/python/rocke/dispatch/tuning/candidate.py:187-189).
8 PASS GdnDecodeRequest.__post_init__ validates and normalizes tuning_knobs via normalize_knobs (library/dispatch/gdn/common.py:133-134), GdnDecodeSpace.canonicalize refuses non-int waves_per_eu (library/dispatch/gdn/rules.py:207-217), and AUTO_DEFAULTS…
9 NEEDS-INFO dispatch_gdn_decode pins the result's request with pin_to_spec (library/dispatch/gdn/__init__.py:155), routed checks carries_tuning_pin(req) so caller pins are never overwritten by auto_knobs (platform/python/rocke/dispatch/tuning/candidate.py:43-46, platform/python/rocke/dispatch/tuning/candidate.py:170-183), and stale or out-of-scope tuning_id pins raise PinRefused without fallback…
10 NEEDS-INFO resolve_pinned searches find only when a bare tuning_id is provided without knobs (platform/python/rocke/dispatch/tuning/candidate.py:66-75), and test_tuning_id_and_knobs_round_trip plus test_illegal_pins_are_refused_with_the_candidate_reason verify bare production IDs resolve while unknown IDs raise PinRefused (library/tests/dispatch/gdn/test_tuning_contract.py:261-264…
11 PASS dispatch_gdn_decode_all and dispatch_gdn_decode_bases pin each result request via pin_to_spec (library/dispatch/gdn/__init__.py:75-129), and test_waves_per_eu_listed_per_sweep_level_and_pinnable_at_any_legal_value scopes full sweeps using the…
12 PASS A request pinning spec_id with tuning_id="auto" still resolves to the candidate's base configuration (platform/python/rocke/dispatch/tuning/candidate.py:165-185, library/tests/dispatch/gdn/test_gfx950_wiring.py:240-252), and the unpinned auto routing table…
13 PASS benchmark_gdn_decode.py and tune.py consume dispatch_gdn_decode_bases directly from the registry and explicitly state that auto selection is static and unaffected by runtime measurements (library/benchmarks/gfx950/gdn/benchmark_gdn_decode.py:30-33…
§L graded 10/10
# Verdict Evidence
1 N/A This PR does not add or modify a gfx target or ISA backend.
2 N/A This PR does not add or modify any MMA op_id or fragment layout table.
3 N/A This PR does not touch MMA selection, MfmaAtom catalogs, or MMA lowering.
4 N/A This PR does not change wave-size handling or target lane math.
5 N/A This PR does not change arch-specific kernel recipes or cross-target codegen.
6 N/A This PR does not add pipeline vocabulary to core/arch or import CK Tile's dispatcher.
7 N/A This PR does not add or modify logical dtypes, bit packing, instruction fragments, or FP8 dialects.
8 N/A This PR does not touch scaled-MMA scale contracts or WMMA operation IDs.
9 N/A This PR does not introduce a new architecture target.
10 N/A This PR does not modify intrinsic arch-domain artifacts or LLVM flavor membership lists.
§M graded 10/10
# Verdict Evidence
1 N/A The diff only adds host-side predicate functions and comments in gdn_decode.py and does not emit any DSL control flow or SSA values.
2 N/A The diff does not touch legalize_for_target or any core lowering/legalization passes.
3 N/A The diff does not touch core/ir_serialize.py, cpp/core/ir/serialize.cpp, or any IR serialization logic.
4 N/A The diff does not touch portable IR schemas, recipe_expand.py, recipe_vm.cpp, or record_coverage.py.
5 N/A The diff does not use or modify AsyncTileLoader or LDS layout validation.
6 N/A The diff does not emit or modify any kernel barriers, memory loads, or cross-lane shuffles.
7 N/A The diff does not touch ISABackend.buffer_rsrc_word3 or modify TemporalHint target legality rules (only selects existing streaming…
8 N/A The diff does not declare new LLVM intrinsics or modify engine selection/fallback logic.
9 N/A The diff does not touch any C++ files or headers under cpp/include/rocke/.
10 N/A The diff does not touch debug location (!dbg) emission or DWARF consumers.
§N graded 18/18
# Verdict Evidence
1 N/A The diff does not add or promote any helpers to platform/python/rocke/helpers/.
2 N/A The diff only updates comments/docstrings and applicability predicates in gdn_decode.py and does not change kernel addressing…
3 N/A The diff does not touch SoftwarePipeline or any pipeline uses.
4 N/A The diff does not touch EpilogueOp, _PATTERN_TABLE, or graph fusion builders.
5 N/A The diff does not add or modify any public tiling API under rocke.helpers.tiling.
6 N/A The diff does not add or modify any front-door or toolbox tiling helpers or LayoutStyle.
7 N/A The diff does not touch tiling layout overrides, c_desc, or MMA soundness gates.
8 N/A The diff does not touch tiling memory rules, lds_tile_alloc, lds_store, or lds_read.
9 N/A The diff does not touch N-D tensor axis roles, FlowStage, or tiling label transforms.
10 N/A The diff does not modify tiling emit, LDS staging, MMA issue, or tiling fail-fast raises.
11 N/A The diff does not use or modify mma_traits.json, TileMma, lds_swizzle, or derive_sched_group_counts.
12 N/A The diff makes no LDS bank-conflict or coalescing claims using tiling analysis tools.
13 N/A The diff does not build or modify WarpDistributionEncoding, make_tile_desc, or RegisterMapper.
14 N/A The diff does not use or modify tiling verbs, LDS barriers, or pipeline variants.
15 N/A The diff does not touch tiling allocation or transformed address range bounds checks.
16 N/A The diff does not touch optimize_layout or evaluate_transform.
17 N/A The diff does not touch tiling_recorder.py, round-trip analysis, or tiling visualization.
18 N/A The diff does not touch InterleavedStyle, helpers/tiling/kernels/ demos, or tiling numeric gates.
§O graded 16/16
# Verdict Evidence
1 N/A This PR does not touch platform/python/rocke/core/, platform/cpp/core/, or IR verification/address spaces.
2 N/A This PR does not modify scf.for structure, region verification, or kernel block termination in core.
3 N/A This PR does not touch IRBuilder, LLVM lowering, intrinsic declaration tables, or metadata emission in core.
4 N/A This PR does not modify IR type definitions, SmemType, or IR parsing in core.
5 N/A This PR does not touch core/passes.py, cpp/core/passes.cpp, or op purity tables.
6 N/A This PR does not modify constant folding passes in Python or C++ core.
7 N/A This PR does not modify kernel attribute lowering, codegen_policy.py, COMGR option generation, or check_cluster_dims.
8 N/A This PR does not modify CodegenPolicy, SchedulerStrategy, or scheduler attribute handling.
9 N/A This PR does not touch waitcnt encoding, barrier lowering, or optimization_barrier in core.
10 N/A This PR does not touch Python or C++ LLVM lowerers or parameter type/attribute emission.
11 N/A This PR does not touch ArchTarget or architecture target resolution in core/arch/.
12 N/A This PR does not modify vector-load width caps, async_lds_max_dwords, or arch defaults in core/lowering.
13 N/A This PR does not touch cpp/include/rocke/ structs, enums, or ABI version constants.
14 N/A This PR does not touch C++ sources, headers, or cpp/bindings/, and the 1-line platform/CMakeLists.txt change does not affect…
15 N/A This PR does not modify C++ engine fallback handling, flavor resolution, or lower_hip.py/lower_cktile.py.
16 N/A This PR does not touch known_gaps.md, the C++ library, or gfx1250 lowering/builders.
§P graded 14/14
# Verdict Evidence
1 N/A The PR only updates GDN/KDA dispatch defaults and docs (library/dispatch/gdn/…
2 N/A No kernel signatures, kernarg packing, or GEMM/conv ABIs are touched in this diff.
3 N/A Launch geometry formulas for GEMM, implicit-GEMM, or GDN decode are not modified; test harnesses continue taking launch…
4 N/A No LDS capacity gates or kernel validators are modified in this diff.
5 N/A WMMA/RDNA GEMM, wave_size rules, and GemmMultiD/GemmMultiAbd are not touched by this PR.
6 N/A No caller-zeroed workspaces (Stream-K, MoE, split-K) are touched in this PR.
7 N/A No Stream-K, persistent GEMM, GroupedGemmLauncher, or SUPPORT_MATRIX.md limits are modified in this PR.
8 N/A No quantization helpers, MX GEMM, or scale decode paths are touched in this PR.
9 N/A No numeric emulation or scale/dtype decode paths are added or modified in this PR.
10 N/A No manifest kinds, emitters, schemas, or helpers/manifest.py code are touched in this PR.
11 N/A Runtime launch/stream synchronization primitives (runtime/) are not modified, and existing test launches…
12 N/A COMGR and HIP library loading are not touched, and this PR does not fix a HIP launch error.
13 PASS The host-side dispatch routing change (dnn-providers/hip-kernel-provider/rocke/platform/python/rocke/dispatch/tuning/candidate.py:122 and dnn-providers/hip-kernel-provider/rocke/library/dispatch/gdn/gfx950.py:197) is validated with unit and numeric GPU tests for…
14 N/A No files under examples/, instances/, or helpers/ are added or modified in this PR.
§Q graded 7/7
# Verdict Evidence
1 NEEDS-INFO dnn-providers/hip-kernel-provider/rocke/library/tests/dispatch/gdn/test_tuning_contract.py:1 adds a new test file, but the visible diff omits the platform/CMakeLists.txt hunk and shows no ROCKE_ENGINE_test_categories_external.yaml entry or CI lane name; need those to verify installed-CI registration.
2 N/A No new kernel family or C++ engine variant is added; this PR selects existing GDN/KDA decode tile/knob configurations through…
3 PASS dnn-providers/hip-kernel-provider/rocke/library/tests/test_gdn_decode_golden.py:48 describes the golden as a tripwire for registered base and auto configurations rather than a numerics proof, and…
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/truncated in the provided diff, so the per-flavor golden entries and green-tree re-blessing provenance cannot be verified.
5 PASS dnn-providers/hip-kernel-provider/rocke/library/tests/test_gdn_decode_gfx950_numeric.py:810 keeps GPU numeric coverage behind the gfx950 skip marker, and dnn-providers/hip-kernel-provider/rocke/library/tests/dispatch/gdn/test_tuning_contract.py:578 asserts exact…
6 N/A No check_byte_identity, run_diff, fuzz_diff, or platform gate/harness refactor is present; the changes are dispatcher, benchmark…
7 N/A The rejection changes are in Python-only dispatch tuning and GDN pin handling, not the backend/C++ strict rejection contract…
§R graded 11/11
# Verdict Evidence
1 PASS The PR selects per-case defaults via a two-stage cold-memory sweep of every legal tile x knob configuration on gfx950, correctness-pruned against the fp32 reference, without adding a new kernel body or structure…
2 PASS The changed heuristic defaults map to existing documented knobs in §4.10 (dnn-providers/hip-kernel-provider/rocke/library/builders/gfx950/gdn/ALGORITHM.md:704), are explicitly scoped to ARCH = "gfx950"…
3 PASS The per-case tile and knob selections (waves_per_eu, streaming state hints, LDS sharing knobs) are backed by measured cold-memory sweeps across 3 head geometries and batches 1..256…
4 PASS Every dispatched auto configuration is pinned in the golden IR SHA256 manifest (dnn-providers/hip-kernel-provider/rocke/library/tests/test_gdn_decode_golden.py:215) and verified via compiled code-object metadata to have 0 scratch bytes / no register spills across…
5 N/A The diff only updates dispatcher auto default selection and documentation (library/dispatch/gdn/axes.py…
6 N/A The diff does not change any LDS or MMA layout in the kernel builder (library/kernels/gfx950/gdn_decode.py only adds scope…
7 N/A The PR selects defaults via empirical tile x knob sweeps and makes no unmeasured bottleneck classification claims.
8 N/A The diff does not add, remove, or modify any waits, barriers, or scheduling hints in kernel code or lowering.
9 PASS The defaults are selected from a shape sweep across three head geometries and batches 1..256 on gfx950 (the only supported arch for this family), with selection rules, batch-1 latency override, and unmeasured head-dim gating (AUTO_WAVES_PER_EU_HEAD_DIMS) explicitly…
10 PASS Benchmark methodology follows runbook hygiene: cold-memory rotation (>= 1 GiB), interleaved arms in one process, repeated independent runs, fp32 reference gating, and relative ratios only…
11 PASS The new auto default selection rule, provenance, latency override, and head-dim waves_per_eu gating are documented without absolute timing numbers in dnn-providers/hip-kernel-provider/rocke/library/builders/gfx950/gdn/ALGORITHM.md:537 and…
§S graded 8/8
# Verdict Evidence
1 PASS New route_auto and auto_knobs parameters on make_tuned_candidate (dnn-providers/hip-kernel-provider/rocke/platform/python/rocke/dispatch/tuning/candidate.py:121-122) are tested in…
2 PASS All existing tests for dispatch_gdn_decode, dispatch_gdn_decode_all, auto_tile, and spec_id_for (dnn-providers/hip-kernel-provider/rocke/library/dispatch/gdn/gfx950.py:90-111) are kept and updated in the full diff…
3 PASS Removed GDN dispatch symbols DEFAULT_TILE, FUSED_DEFAULT_TILE, _TUNED_TILES_KDA, work_for, and tile_for_work (dnn-providers/hip-kernel-provider/rocke/library/dispatch/gdn/gfx950.py:48-115) have all import sites and tests updated…
4 PASS Every entry added to __all__ in dnn-providers/hip-kernel-provider/rocke/platform/python/rocke/dispatch/tuning/__init__.py:53,65 (WavesPerEuSpace) and dnn-providers/hip-kernel-provider/rocke/library/dispatch/gdn/__init__.py:38,91,236-239 (GdnDecodeTunedSpec…
5 PASS Tests assert exact output specs, knob dictionaries, replay invariants, golden IR SHA256 hashes, scratch-free compilation, and negative fail-fast raises: ValueError when auto_knobs is passed without route_auto and RuntimeError when auto_knobs fail to resolve…
6 PASS CPU-checkable contracts (tuning template routing, auto_knobs resolution, scope dropping, waves_per_eu head-dim dropping, and golden IR hashes) run on CPU without a GPU in…
7 N/A The modified APIs are in the Python-only dispatch and tuning layers (rocke.dispatch.tuning and library/dispatch/gdn/), which…
8 PASS The PR body ('How it was validated') reports running the CPU and GPU test suites on gfx950, check_byte_identity.py across llvm20/22/23, strict in-tree parity, 735 host tests, and README examples, and GDN usage documentation is updated in…

auto on the gfx950 GDN/KDA decode dispatcher now runs one static
configuration per case -- gate kind x fused (fuse_conv or fuse_out_norm)
x state width -- a registered tile plus a knob stack on top of its base,
measured cold on gfx950 at D128 (fused cases with both fused flags on).
Batch, head count and batch * num_v_heads never select it.

- dispatch/gdn/axes.py: AUTO_DEFAULTS, the eight (tile, knobs) rows as
  data, with the selection rule; AUTO_STATE_ROW (an f16 state was not
  measured and runs the bf16 row). At import every row's knobs must be
  values of their axes.
- dispatch/gdn/gfx950.py: auto_default() reads the case; auto on the
  case's tile resolves the stack through the tile's knob space, so the
  configuration is a registered one and its result's request (spec_id,
  tuning_id, tuning_knobs) replays it. A knob the request cannot read is
  dropped as for any pin; norm_gate_once drops with conv_once, since the
  kernel refuses it alone (a norm-only GDN request runs the rest of its
  row). Each gate kind's priority order is its auto
  tiles, then the rest in product order. When the case's tile is illegal
  (GDN head_k_dim 64 / 192) auto runs the first legal tile in that order
  at its base configuration.
- rocke.dispatch.tuning: make_tuned_candidate takes an optional
  auto_knobs(req) beside route_auto: the knobs an auto request runs on
  that candidate, resolved as tuning_knobs. Empty runs the space's
  default; knobs that do not resolve where the default does raise with
  the reason instead of running another configuration; auto_knobs without
  route_auto is refused; a request that carries its own tuning pin
  (carries_tuning_pin: a tuning_id other than auto, or tuning_knobs)
  resolves it as given. Other families are unchanged.
- KDA fused f32 ships (4, 8, 1) with dpp_reduce, stream_rows,
  interleave_cols, conv_once and out_lds, an override of the rule's
  (16, 16, 1) pick chosen for batch 1 (the latency case); the row is the
  best-scoring (4, 8, 1) configuration, near-tied with the rule's pick.
- KDA plain's work-keyed table (_TUNED_TILES_KDA, work_for,
  tile_for_work), GDN's single DEFAULT_TILE and the interim
  FUSED_DEFAULT_TILE are removed. tune.py drops its work-keying report,
  sweeps KDA tiles from the dispatched tile with every knob off, and
  labels the auto tile's base configuration as such; it no longer
  advises a tile from base-only timings.

Pins are unchanged: a bare spec_id still runs the tile with every knob
off, and every tuning_id / config_key is the same.

Golden: no existing hash changes. Twenty-four auto_* cases are added:
gate kind x plain / conv + norm x bf16 / f16 / f32 state, the
configuration auto dispatches per case, and gate kind x conv only / norm
only / norm only at GQA heads x bf16 / f32, the row less the knobs a
one-flag request cannot read. Moving a default moves a hash.
Tests: the shipped table as a literal, the same configuration at every
batch, f16 -> bf16 row, scope drops for one fused flag (norm-only GDN
included), the fallback over a broad request domain (DK != DV included),
pins unchanged, tune.py's KDA sweep base has every knob off, the shared
hook raises on an unresolved stack and never replaces a caller's pin (by
knobs or by id alone), and every auto configuration (one-flag and GQA
norm-only included) compiles with no scratch. On device, through dispatch
against the fp32 reference: every case's auto configuration and the
one-flag and GQA norm-only modes at bf16 and f32 state.

Docs: ALGORITHM.md section 4.6 (table, shapes measured and not, rule,
override, fallback), README, dsl_docs/instances/gdn.md and index.md,
rocke/dispatch/ARCHITECTURE.md section 14 (auto_knobs), the GPU
coverage map's KDA rows, and CASE_STUDY.md (the tiles it measured are
named as the defaults of that time; its section 7 script runs again).
The gfx950 GDN fused f32 auto row sets waves_per_eu=4, measured at
head_k_dim = head_v_dim = 128 only. At a wider key dim the state no longer
fits the capped registers and the kernel spills. auto_knobs now drops that
knob for other head dims and keeps the rest of the row. Adds a dispatch test
for the dropped knob and a compiled-scratch test off the measured dims.
The dispatcher-default report test stubs the sweep with invented timings so
each printed label can be checked against its own row. Say so next to the
stub, so the values are not read as measurements.
@cgmillette

Copy link
Copy Markdown
Contributor

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

PR #14353 — measured per-mode defaults for gfx950 GDN/KDA decode (AviralGoelAMD, AICK-2556) — 🟢 First-round: no closer look needed — selection and spill guard verified; gfx950 timings author-only

Prior item Status
yraparti (10-27, re-raised 10-28) [HIGH] §E.17: absolute figure in test_gdn_decode_tune.py:111 🟢 Answered 436c6d0a — not a measurement: the values are invented inputs to a monkeypatched sweep_registry_batch in a print-format test, and no kernel runs. 436c6d0a keeps them and labels them synthetic at :87. The test passes in CI and on our merge (ran)
yraparti (10-27, re-raised 10-28) [HIGH] §G.23: add absolute times beside the AITER and A/B ratios, or drop the ratio table 🟢 Answered — the requested fix conflicts with platform/AGENTS.md, which keeps absolute results out of public artifacts and allows ratios in the PR description. The body's table states the workload, the nine shapes, the AITER commit, the method and the caveats, including that it was timed on a fork tree and that the harness is not in-tree yet. ALGORITHM.md:555 is the qualitative provenance paragraph, and no ratios are committed (read). Hygiene: one 10-28 author reply on this thread names an internal repository, which AGENTS.md asks to keep confidential → edit that reply
yraparti (10-27, 10-28) NEEDS-INFO ×10–11 (truncated diff): §D.5/§K.6 auto resolves through the knob space; §D.13/§K.9 pins never fall back; §E.10 other open PRs and land order; §G.2 on-silicon checks 🟢 Reviewed — every auto result in our probe (below) is a valid, registered configuration that replays from its result's request, and the shared hook raises rather than substitute a configuration; the template tests for that pass in CI (ran). §E.10: the merge with develop is clean, and the only other open PR on these files is #14632, stacked on this branch. §G.2: the gfx950 numeric suites are enrolled but ran only on the author's hardware (read)
arai713 (10-27): waves_per_eu=4 was measured only at DK = 128 and spills at DK = 256 → use the base configuration elsewhere 🟢 FIXED 0b2d37a2 — gfx950.py:209 drops it unless DK = DV = 128 and keeps the row's other knobs, which stay untimed off D128, as §4.6 says. Negative control on the merge: with waves_per_eu=4 the fused f32 stack spills at 256/128, 256/256 and 128/256; as shipped it has 0 scratch there. The PR's dispatch test passes in CI, and its no-spill test passes here but skips in CI (below) (ran)
CongMa13 (10-27): three threads and yraparti's first review had no author reply 🟢 Done — each now has an author reply and is resolved (read)
Bots / CI 🟢
• Policy bot pass. At head 436c6d0a, all 10 workflows are green (TheRock Multi-Arch CI and ASAN, hipDNN superbuild, Component CI, clang-tidy, pre-commit). Test hipkernelprovider passes on Linux gfx94X and Windows gfx110X, 2 shards each.
• In the three readable shard logs, rocke_library_gdn_pytest passes the PR's new dispatch, wiring, contract, golden and tune tests, and rocke_pytest passes the auto_knobs template tests.
• Every no-spill compile gate skips there ("missing tool: llvm-objdump"): the PR's 33 new subtests and develop's own resource gates.
• gfx950 is built but not tested (the gfx950 test jobs are skipped), so the GDN and KDA gfx950 numeric suites and the timings rest on the author's runs, which were at an earlier head (the AITER table on a fork tree). test_kda_decode_resources.py and test_kda_decode_benchmark.py, which the PR edits, are in no CTest list (pre-existing) (read)
Our checks 🟢
• Clean merge with develop f22bed43 (8 behind, 3 ahead). #14176 merged on 10-28 (3eeb4c44), and the PR now holds only its own 3 commits. Native build and 33 ctests OK (1 skip); library parity at llvm20/22/23; representative golden PASS ×3; differential golden OK (its 121 new unblessed configs are develop's); the PR's 12 test files: 414 passed, 2 skipped (ran).
• The GDN IR golden pins all 24 new auto_* configurations at 3 flavors, and develop's #14415 aliases llvm24 to llvm23, so they cover that lane too; no existing hash moves (ran). No C++ parity family covers GDN decode: its dispatch is Python-only, and gdn_decode.py changes only comments, so byte identity had nothing to run (read).
• auto probe, 12,288 requests on the merge and on develop: GDN DK 8–512 × DV 8–512 and KDA; every state width and fused mode; four head geometries; f16 I/O; l2norm off; gfx942. Both trees accept and refuse the same requests; there is no RuntimeError; every result is valid and replays; waves_per_eu is never set off D128. The only fallback change: plain GDN at DV 16/32/48/96 now falls back to (4,16,1) instead of (1,4,1) or (1,2,1), as §4.6 documents (ran).
• Off D128, auto's plain bf16, plain f32 and fused bf16 picks compile with 0 scratch and fewer VGPRs than develop's picks. With the ISA tools present, the PR's two no-spill tests pass (33 subtests) (ran).
• Rules 1–3: the only perf-pattern hits are the two labelled stub values; no links or tracker IDs are added; the commit messages are qualitative (ran)
# Sev file:line Finding
N1 🟡 PR description ("Stacked on #14176", "How it was validated", "Notes") The description is stale. It still says "Stacked on #14176 … Review only the top commit" and that the base moves to develop once #14176 merges, but #14176 merged on 10-28. Its Notes still say the GDN fused f32 row spills at DK = 256, which 0b2d37a2 fixed. It also cites two internal job numbers. Auto-merge (squash) is on, and squash commits here carry the whole description (#14176's did), so this text lands in develop's history on the first approval → refresh the description before approving

Utility: 🟢 Positive — measured per-case gfx950 GDN/KDA decode defaults; selection verified, device timings author-only.


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

First-round review: a local qwen3.6 model made the independent first pass. The orchestrator (Claude Opus 5.5) verified it. On a clean merge with today's develop it ran the native build and ctest, library parity, the representative and differential goldens and the PR's test files. It probed auto on the merge and on develop over 12,288 requests. It compiled auto's picks off the measured head dims for gfx950 through comgr, including a waves_per_eu negative control, and ran the PR's no-spill tests with the ISA tools present. It also read the diff against develop's changes since the base, checked every thread at head, and read three of the four hipkernelprovider CI logs at head. The orchestrator owns this merge-worthiness call. It flags whether a closer look is needed; it is not an approval or a rejection.

@cgmillette cgmillette left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

LGTM

@AviralGoelAMD
AviralGoelAMD enabled auto-merge (squash) October 29, 2026 14:50

@arai713 arai713 left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

LGTM!

@AviralGoelAMD
AviralGoelAMD merged commit bcfb35a into develop Oct 29, 2026
98 checks passed
@AviralGoelAMD
AviralGoelAMD deleted the users/avirgoel/rocke/gdn-decode-defaults branch October 29, 2026 16:27
@assistant-librarian

Copy link
Copy Markdown
Contributor

TheRock Submodule Bump Activity

Newest first

cgmillette pushed a commit that referenced this pull request Nov 7, 2026
…ode (#14632)

ISSUE ID : AICK-2556

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

## What this adds

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

## What changed

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

- Coverage is bounded by `--sweep-level`: `production` lists
`waves_per_eu` 0 and 4 only; `full` needs `--tuning-sample N` and times
a random sample per tile.
- The tools regenerate the evidence for `AUTO_DEFAULTS` from rocKE's own
registry. They do not reproduce any external comparison.

## Why it works

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

## How we validated

| Gate | Result |
|---|---|
| GPU (gfx950, ROCm 7.13, Python lowerer) | At the last head with a code
change (the newest commit only adds golden entries, checked on CPU):
GDN, fused, KDA and knobs numeric suites, timing, sweep, report, KDA
benchmark, golden, load-order, `dispatch/gdn` (including the new
torch-free gate tests) and the tuning template pass with 0 failures. The
shipped tools run end to end with exit code 0 and every row `ok`: sweep
stage 1 and stage 2 on a plain and a fused shape, the report on those
rows, both benchmarks (one with `--sweep-tiles`) and `--bench`. A gate
forced to pass makes the verdict tests fail, and a gate forced to fail
makes the sweep and the benchmark exit non-zero with nothing timed. An
earlier head also passed a `--bases-only` run, a production `--shard`
and a `full` sample on `kda fused f32 32/32`. |
| CPU | GDN/KDA dispatch, sweep, report, timing, tuning-template and
layering suites pass at this head, with and without torch installed. The
pass test, the rotation sizing and what the sweep and both benchmarks do
with a failing verdict are tested without torch, so they run in CI; the
tensor reductions inside `gate()` run only where torch is installed (no
CI lane has it). The earlier Windows-lane fix stands (a usage error
prints the file path as given, not its `repr`; the tests use a backslash
path so they also fail on Linux with the old text). |
| IR / ABI | No default change: with the knob at its default the kernel
name and IR are unchanged, and no existing golden hash changes. The
golden file gains entries only: the 48 `knob_row_loads_*` cases of the
row-load knob, recorded at `llvm20`, `llvm22` and `llvm23`, are also
recorded at `llvm24`, the flavor `develop` records. The golden test and
the C++ parity test pass with them. |
| Review | rocKE checklist graded on the review-response diff (every
section, A to J, every item); the sections that cover the final delta of
tests and comments (C, E, G) were re-graded on it. No BLOCKER or HIGH
open. Open MEDIUM and LOW items are recorded in the internal review log.
|

## The row-load knob

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

## Notes

- Not changed or not measured here: the in-tree sweep has not been run
end to end for every `AUTO_DEFAULTS` case, and gfx942 is out of scope.
- Measured results stay in the internal performance record; this PR
makes no performance claim.
- The comparison harness for the external-baseline table in #14353 is
still out of tree.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants