Repository navigation
perf(rocke): measured per-mode defaults for gfx950 GDN/KDA decode - #14353
Conversation
yraparti
left a comment
There was a problem hiding this comment.
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
autoresolves through the candidate's knob space (resolve(stacked)), producing a canonicalGdnDecodeTunedSpecwith its owntuning_idand concretekernel_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-commitexecution 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
routedresolvesauto_knobsthrough the sharedresolvepath (platform/python/rocke/dispatch/tuning/candidate.py:171-183), andtest_auto_is_its_case_stack_on_the_case_tileverifiesauto.specis indispatch_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
autodispatch defaults (AUTO_DEFAULTS) and the tuning templateauto_knobshook. - §J: Shapes: | Equation / Item | Operands | Inner / Constraint | Result vs Declared | | --- | --- | --- | --- | | Key-lane split (
ALGORITHM.md:600) |WTKlanes ×VPT=8|WTK * VPT = 128dividesDK=128| Valid forDK=128, fails atDK=64, 192((1,1,1)fallback) | | Decode grid (README.md:351) |batch,num_v_heads,BPV|BPV=1required 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 unpinnedautorequests | 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). |
|
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. |
✅ All Checks Passed — Ready for Review
📖 Need help? See the Policy FAQ for details on every check and how to fix failures. |
|
🎉 All checks passed! This PR is ready for review. |
yraparti
left a comment
There was a problem hiding this comment.
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()returnsasdict(self.kernel_spec)(excludingcandidate_name,tuning_id, etc.),autoresolves throughresolve(stacked)into a canonical concretekernel_spec, and tests assert uniquekernel_name(),tuning_id, andcompile_keyper 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_pinnedandroutedin 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) indnn-providers/hip-kernel-provider/rocke/library/dispatch/gdn/gfx950.py:209are formatted cleanly, but localpre-commitexecution 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:209anddnn-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.validatedelegates tois_valid_spec(kernel, arch=self.arch)(library/dispatch/gdn/rules.py:222-223),routedresolvesauto_knobsthrough the sharedresolvegate (platform/python/rocke/dispatch/tuning/candidate.py:171-183), andtest_auto_is_its_case_stack_on_the_case_tileverifiesauto.specis indispatch_gdn_decode_all(req)(library/tests/dispatch/gdn/test_tuning_contract.py:195-198). — no diff line supports this verdict - §K.9
dispatch_gdn_decodepins the result's request withpin_to_spec(library/dispatch/gdn/__init__.py:155),routedcheckscarries_tuning_pin(req)so caller pins are never overwritten byauto_knobs(platform/python/rocke/dispatch/tuning/candidate.py:43-46,platform/python/rocke/dispatch/tuning/candidate.py:170-183), and stale or out-of-scopetuning_idpins raisePinRefusedwithout 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
autodefault tables (AUTO_DEFAULTS), and tests/documentation. - §J: ### Shapes | Equation / Relation | Operands & Shapes | Inner Dims | Result vs Declared | | --- | --- | --- | --- | |
WTK × VPT = 128(ALGORITHM.md:602) | scalarWTK(K-threads/warp), scalarVPT(vec elements/thread) | scalar product | scalar128vsDKdivisibility bound | |BH = 32 × batch(ALGORITHM.md:213) | scalarHv = 32, scalarbatch| scalar product | scalarBHvs prefillvalue_splitsband 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_VERSIONchanged (library/dispatch/gdn/axes.py:59-69,library/dispatch/gdn/rules.py:95-99).config_keydoes not change for any configuration, and no stored pins are invalidated (library/tests/dispatch/gdn/test_gfx950_wiring.py:240-252). Unpinnedautorouting now selects measured per-case tile + knob stacks viaAUTO_DEFAULTSandauto_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.
1da2195 to
436c6d0
Compare
|
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
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 |
TheRock Submodule Bump ActivityNewest first
|
…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.
ISSUE ID : AICK-2556
Builds on #14176 (tile x knob registry), merged into
developon 2026-10-28.What was wrong
#14176 made every tile x knob configuration of the gfx950 GDN/KDA decode kernel listable and pinnable, but
autostill 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
autonow runs one measured configuration per case: gate kind x fused (fuse_convorfuse_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).(NW, WTK, BPV)(2, 16, 8)dpp_reduce(2, 16, 16)dpp_reduce,interleave_cols(4, 16, 1)dpp_reduce,stream_rows,conv_once,norm_gate_once,out_lds(8, 16, 1)dpp_reduce,stream_rows,interleave_cols,conv_once,out_lds,waves_per_eu=4(1, 16, 8)dpp_reduce,waves_per_eu=4(1, 16, 16)dpp_reduce,stream_rows,interleave_cols(4, 8, 1)dpp_reduce,conv_once,out_lds(4, 8, 1)dpp_reduce,stream_rows,interleave_cols,conv_once,out_ldsdispatch/gdn/axes.pyAUTO_DEFAULTS). Batch and head count never select it.autoresolves the stack through the tile's knob space, so it is a configurationdispatch_gdn_decode_allalready lists, with its owntuning_id, and the result replays.norm_gate_oncedrops withconv_once.waves_per_eu=4(GDN fused f32, KDA plain bf16 / f16) was measured only atDK = DV = 128, soautoapplies 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 atDK = 256.auto_knobs(req)hook besideroute_auto. Other families are unchanged.DEFAULT_TILEand 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 inALGORITHM.md§4.6, together with what was not measured (one-flag fused requests, other head dims, f16 I/O, gfx942).How it was validated
auto_*cases x 3 LLVM flavors are added.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 thewaves_per_euhead-dim guard, which changes nothing atDK = DV = 128; CI at the current head runs their tests on gfx94X and gfx110X runners; its gfx950 test jobs are skipped): everyautoconfiguration 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); pinnedtuning_idlaunches 8, dispatched requests 30, reachability 72/72, README examples, andtune.py/ both benchmark scripts end to end.check_byte_identity.pyGREEN on llvm20 / llvm22 / llvm23; strict in-tree parity passes; every golden case lowered by both engines, 0 mismatches; host tests 735 passed.autoconfiguration has 0 B scratch, and a compiled-scratch test checks that the GDN fused f32autorow has 0 B scratch atDK / 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
autotime (above 1:autois faster). Geomean over 9 shapes, with the smallest and largest shape in brackets.autoflydsl_gdr_decodeor Tritonfused_rearrange_sigmoid_gated_delta_rule, the faster per shapeHv = 2 * Hk, a packed qkvz input and a conv bias; ours needsHk = Hvfor convfused_recurrent_kdafused_recurrent_kda_packed_decodeDK = 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.autois faster at all 36 shapes in the table.229c4a5fae65, each kernel on its own shipped selection (no config override).autoselections 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.autois 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 whatautoships. 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
ALGORITHM.md§8, follow-up 10).