Repository navigation
feat(hip-kernel-provider): add gfx942 dense attention AOT ingestor engine - #14908
Conversation
Add the registry-backed engine manifest for hipkernel:Gfx942AttentionDense and the selection factorised from it. The gfx942 dense body reads batch, both sequence lengths and both head counts at runtime, so cells are head size x dtype x mask/window only; head counts sit in enumerate.fixed. Scope is the non-persistent grid with causal, full and causal sliding windows of 128/512/1024/2048 keys. Sinks are out of scope: neither SDPA reference plan accepts sink_token_tensor_uid. Knobs are block_m, block_n, lds_row_pad and pv_priority: 288 kernels over 24 cells, within the 1000-instance AOT budget. Co-Authored-By: Claude <noreply@anthropic.com>
…r engine Ship the gfx942 dense attention forward as a packaged rocKE engine: descriptors under descriptors/rocKE/gfx942_attention_dense (KDP tracked by DVC), the native pack (graph/kernel match, score, 10-argument dispatch) and its restated geometry, plus the registration, census, external-integration and test-category wiring gfx950 has. The gfx942 body reads batch, both sequence lengths and both head counts at runtime, so candidates are matched on dtype, head size, mask and window only. A causal band of left_bound L is served by the kernel built for sliding_window L + 1; every non-causal band, sinks and stats are declined. Tile divisibility and the sliding-window zero-trip guard are checked per candidate. The cold score orders every block_m/block_n/lds_row_pad/ pv_priority combination, policy arms first. Co-Authored-By: Claude <noreply@anthropic.com>
…l tile set Add IntegrationGpuGfx942AttentionDenseKnobs: every (head size, dtype, mask, window, tile) class the gfx942 catalog compiles runs once under a forced tile, checked for the exact policy-arm kernel id and against the CPU reference, plus cold selection, B > 1, cross-length, both alignments, the deprecated causal flag, window spellings and the scale. A coverage case keeps the table equal to the installed catalog. Correct the tile-legality expectation: supports_attention_dense also admits the non-power-of-two tiles (96/96, 192/96, ...) when built at seqlens they divide, which is what isSupportedGfx942AttentionDenseTile accepts. Co-Authored-By: Claude <noreply@anthropic.com>
…tentionDense Record the 8 quick and 37 standard SdpaFwd/Default cases the gfx942 dense attention engine served and verified against the GPU reference on gfx942 (written with --write-support-claims), and regenerate the support matrix overview. The knob device test now expects the lds_row_pad 0 arm for D128 256/128, the only pad at which that tile fits LDS and so the kernel the score ranks first. Co-Authored-By: Claude <noreply@anthropic.com>
variant_reduce could not read a sweep produced by the current hipDNN: - WinnerCacheFile.hpp writes line format v=2 (#13028 added the DeviceKey memory fields), while variant_reduce accepted only v=1. Accept both, each with its exact device field set. - hipDNN now mints Graph.id at finalization, a cache_ignore field that GraphContentKey leaves out, but variant_reduce keyed rankings on the raw serialized graph. The same graph got a new key every round, so no graph matched across rounds and the reduction refused the sweep. Zero Graph.id before keying. Co-Authored-By: Claude <noreply@anthropic.com>
…00 kernels Apply the stage-6 reduction: a 2-round autotune sweep of the 288-kernel selection over the 814 served graphs of the dnn-benchmarking attention corpus, all correctness phases passing, keeps 100 kernels at eps 0.01 (no ranked graph loses more than 1% against its best packed kernel; measured noise floor 0.6%). Causal and unmasked cells keep 52 (24 floor, 28 measured wins); the 16 sliding-window cells, which no corpus graph exercises, keep their 48 floor kernels. Regenerate the bundle (KDP in DVC), its census suite, and the device knob test's class table for the reduced catalog. Co-Authored-By: Claude <noreply@anthropic.com>
… changes Format the new gfx942 dense-attention sources and the variant_reduce change with the versions pre-commit pins (clang-format 18.1.4, black 25.12.0). No functional change. Co-Authored-By: Claude <noreply@anthropic.com>
✅ 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. |
Keeps the 100 gfx942 dense instances; the KDP specs pin persistent=false, so develop's persistent-D128 default does not change the shipped ABI. Conflicts resolved by keeping both sides; SUPPORT_MATRIX_OVERVIEW.md regenerated. Co-Authored-By: Claude <noreply@anthropic.com>
…_bound and shard rules develop moved left_bound to cuDNN semantics (SEM-001): left_bound = L keeps L keys including the diagonal, 0 is rejected, and resolveDiagonalBand returns L - 1. The engine's sliding_window = band.leftBound + 1 is therefore still the key count; the overflow guard is unreachable and goes, and the matcher and knob tests now spell a W-key window as left_bound W. The census shard now has to reserve every TOML it names, so the gfx942 external integration check passes hipkernel_Gfx942AttentionDense.toml to hkp_reserve_census_shard(... FILES), as the gfx950 entry does. Co-Authored-By: Claude <noreply@anthropic.com>
…b_minor grid On develop the gfx942 dense spec's nonpersist_decode "auto" resolves from the build-time shape, and for causal MHA it picks bt_hkv_minor. The ingestor's native dispatch launches the (nqb, Hq, B) qb_minor grid at run time, so every packed causal kernel decoded the wrong tile and faulted (illegal memory access in the knob suite). Add gfx942_dense_qbminor, the twin of gfx950's qbminor variant: a non-persistent, unsplit qb_minor default on the shared 256-row tile, and pin the manifest to it. The manifest and selection now carry develop's new spec fields (nonpersist_decode, kv_segments, window_wave_skip, v_reg_prefetch, chiplet_num_xcds), held at that default. The 100 shipped kernels keep their names and ids; only those five spec fields change, so the KDP moves to md5 83e609d4ef67960b6a7e71d4e62602c7.dir. Co-Authored-By: Claude <noreply@anthropic.com>
… tests The HipDNN superbuild lane compiles with clang-tidy-20 and warnings as errors: modernize-avoid-c-arrays (Geometry witnesses, knob head table), misc-const-correctness (Matchers tensors/nodes) and modernize-pass-by-value (SelectedKernelReport). Test-only; unit 55/55 and the device knob suite 95/95 still pass. Co-Authored-By: Claude <noreply@anthropic.com>
|
Automated review: Model - qwen3.6:35b-a3b-coding-mtp-q4_K_M, effort: max PR #14908 — Gfx942AttentionDense AOT ingestor engine (AnaghaRaoAMD, AICK-2535) — 🔴 First-round: superbuild red, ragged gap
Utility: 🟡 Mixed — first packaged gfx942 dense SDPA engine; N1 and N2 block it. Legend: 🔴 blocking · 🟠 should-fix · 🟡 minor nit · 🟢 info/good · ⚪ retracted First-round review: first pass by a local qwen3.6 model, verified by the orchestrator (Claude Opus 5.5). Checks: merge with develop, build + ctest, differential goldens, rocKE dispatch tests, CI logs, DVC fetch, window semantics, generator gates, code quality. Flags whether a closer look is needed; not an approval or rejection. |
There was a problem hiding this comment.
🟡 Changes recommended
Fully masked rows produce incorrect outputs, packed ragged tensors can cause out-of-bounds accesses, and the new pack registration breaks an existing contract test.
8 open issues
Add the gfx942 dispatch symbol to the ingestor test · New Reject or handle fully masked query rows · New Reject ragged-offset tensors in graph matching · New Check blockM bounds before multiplying · New Use hq in the unmasked GQA/MQA graph cases · New Document the gfx942 and gfx950 qbminor candidates · New Align documented left bounds with packaged window sizes · New Correct the gfx942 sliding-window token comment · New
What changed in this PR
Adds ahead-of-time dense SDPA forward support for gfx942 through hipDNN’s kernel-ingestor path, reusing rocKE kernels with runtime shape arguments.
Changes:
- Defines a 100-kernel catalog covering bf16/fp16, head sizes 64/128, causal and unmasked attention, and causal sliding windows.
- Adds the opt-in
gfx942_dense_qbminorcandidate, native integration wiring, and host, census, device, and support-claim coverage. - Updates variant reduction to accept winner-cache format v2 and ignore minted graph IDs when matching timing rounds.
| File | Description |
|---|---|
| projects/hipdnn/tools/IngestorGenerator/tools/variant_reduce.py | Updated as part of this pull request. |
| projects/hipdnn/tools/IngestorGenerator/tests/test_variant_reduce.py | Updated as part of this pull request. |
| projects/hipdnn/tools/IngestorGenerator/configs/gfx942_attention_dense.yaml | Updated as part of this pull request. |
| projects/hipdnn/tools/IngestorGenerator/configs/gfx942_attention_dense.engine.yaml | Updated as part of this pull request. |
| dnn-providers/integration-tests/SUPPORT_MATRIX_OVERVIEW.md | Updated as part of this pull request. |
| dnn-providers/integration-tests/integration-test-bundles/standard/SdpaFwd/Default/support.json | Updated as part of this pull request. |
| dnn-providers/integration-tests/integration-test-bundles/quick/SdpaFwd/Default/support.json | Updated as part of this pull request. |
| dnn-providers/hip-kernel-provider/src/tests/engines/kernel_ingestor_engine/packs/TestGfx942AttentionDenseSignature.cpp | Updated as part of this pull request. |
| dnn-providers/hip-kernel-provider/src/tests/engines/kernel_ingestor_engine/packs/TestGfx942AttentionDensePacks.cpp | Updated as part of this pull request. |
| dnn-providers/hip-kernel-provider/src/tests/engines/kernel_ingestor_engine/packs/TestGfx942AttentionDenseMatchers.cpp | Updated as part of this pull request. |
| dnn-providers/hip-kernel-provider/src/tests/engines/kernel_ingestor_engine/packs/TestGfx942AttentionDenseGeometry.cpp | Updated as part of this pull request. |
| dnn-providers/hip-kernel-provider/src/tests/engines/kernel_ingestor_engine/packs/TestGfx942AttentionDenseDispatch.cpp | Updated as part of this pull request. |
| dnn-providers/hip-kernel-provider/src/tests/engines/kernel_ingestor_engine/packs/TestGfx942AttentionDenseCatalogTiles.cpp | Updated as part of this pull request. |
| dnn-providers/hip-kernel-provider/src/tests/engines/kernel_ingestor_engine/CMakeLists.txt | Updated as part of this pull request. |
| dnn-providers/hip-kernel-provider/src/tests/CMakeLists.txt | Updated as part of this pull request. |
| dnn-providers/hip-kernel-provider/src/integration_tests/kernel_ingestor_engine/IntegrationGpuGfx942AttentionDenseKnobs.cpp | Updated as part of this pull request. |
| dnn-providers/hip-kernel-provider/src/integration_tests/CMakeLists.txt | Updated as part of this pull request. |
| dnn-providers/hip-kernel-provider/src/engines/kernel_ingestor_engine/packs/Gfx942AttentionDenseGeometry.hpp | Updated as part of this pull request. |
| dnn-providers/hip-kernel-provider/src/engines/kernel_ingestor_engine/IngestorPacks.hpp | Updated as part of this pull request. |
| dnn-providers/hip-kernel-provider/src/engines/kernel_ingestor_engine/IngestorPacks.cpp | Updated as part of this pull request. |
| dnn-providers/hip-kernel-provider/src/engines/kernel_ingestor_engine/IngestorKernelCode.hpp | Updated as part of this pull request. |
| dnn-providers/hip-kernel-provider/src/engines/kernel_ingestor_engine/descriptors/rocKE/gfx942_attention_dense/README.md | Updated as part of this pull request. |
| dnn-providers/hip-kernel-provider/src/engines/kernel_ingestor_engine/descriptors/rocKE/gfx942_attention_dense/kernel_dtype_matches_graph.umd.json | Updated as part of this pull request. |
| dnn-providers/hip-kernel-provider/src/engines/kernel_ingestor_engine/descriptors/rocKE/gfx942_attention_dense/gfx942_attention_dense.uhd.json | Updated as part of this pull request. |
| dnn-providers/hip-kernel-provider/src/engines/kernel_ingestor_engine/descriptors/rocKE/gfx942_attention_dense/gfx942_attention_dense.ued.json | Updated as part of this pull request. |
| dnn-providers/hip-kernel-provider/src/engines/kernel_ingestor_engine/descriptors/rocKE/gfx942_attention_dense/gfx942_attention_dense.udd.json | Updated as part of this pull request. |
| dnn-providers/hip-kernel-provider/src/engines/kernel_ingestor_engine/descriptors/rocKE/gfx942_attention_dense/gfx942_attention_dense.kmd.json | Updated as part of this pull request. |
| dnn-providers/hip-kernel-provider/src/engines/kernel_ingestor_engine/descriptors/rocKE/gfx942_attention_dense/artifacts.dvc | Updated as part of this pull request. |
| dnn-providers/hip-kernel-provider/src/engines/kernel_ingestor_engine/descriptors/rocKE/gfx942_attention_dense/.gitignore | Updated as part of this pull request. |
| dnn-providers/hip-kernel-provider/src/engines/kernel_ingestor_engine/descriptors/README.md | Updated as part of this pull request. |
| dnn-providers/hip-kernel-provider/src/engines/kernel_ingestor_engine/CMakeLists.txt | Updated as part of this pull request. |
| dnn-providers/hip-kernel-provider/src/CMakeLists.txt | Updated as part of this pull request. |
| dnn-providers/hip-kernel-provider/rocke/library/tests/dispatch/attention/test_tuning_space.py | Updated as part of this pull request. |
| dnn-providers/hip-kernel-provider/rocke/library/tests/dispatch/attention/test_gfx942_dense_wiring.py | Updated as part of this pull request. |
| dnn-providers/hip-kernel-provider/rocke/library/tests/dispatch/attention/test_attention.py | Updated as part of this pull request. |
| dnn-providers/hip-kernel-provider/rocke/library/dispatch/attention/gfx942_dense.py | Updated as part of this pull request. |
| dnn-providers/hip-kernel-provider/hipkernel_Gfx942AttentionDense_test_categories_integration.yaml | Updated as part of this pull request. |
| dnn-providers/hip-kernel-provider/descriptor-packaging/cmake/HkpPackaging.cmake | Updated as part of this pull request. |
| dnn-providers/hip-kernel-provider/config/hipkernel_Gfx942AttentionDense.toml | Updated as part of this pull request. |
| dnn-providers/hip-kernel-provider/CMakeLists.txt | Updated as part of this pull request. |
Review effort: Max
SUPPORT_MATRIX_OVERVIEW.md regenerated with feature_matrix.py. Co-Authored-By: Claude <noreply@anthropic.com>
… the dense packs Review follow-ups for hipkernel:Gfx942AttentionDense: - Q/K/V/O with a ragged_offset_tensor_uid (packed sequences) are declined; the kernel indexes them as dense and would read and write past each sequence. The gfx950 twin had the same gap. - A top-left window with seqlen_q - seqlen_kv >= W leaves the last query rows no key; the kernel has no empty-row path and averaged V there. Declined at graph match. Every per-block zero-trip failure on a tile-divisible shape is such a case, so the kernel-match test of it moves to graph match. - The workgroup-limit check divides instead of multiplying, so a 2^62 block_m in descriptor metadata no longer overflows. - packDispatchSymbols lists the gfx942 dispatch symbol (pack count was 5 vs 6). - The knob suite's unmasked rows use hq, hkv, so GQA/MQA reach them. - checkedProduct comes from PackFeatures.hpp; README window bounds, knob list and SEM-001/SEM-005 match the engine. Co-Authored-By: Claude <noreply@anthropic.com>
The qbminor candidate promised the hipDNN ingestor's grid, but its knob space still swept persistent, nonpersist_decode and kv_segments; only the manifest's ignored list kept them out of the AOT catalog. They are now out of scope whenever the base spec pins the block order, as gfx950 scopes nonpersist_decode. The tuned gfx942_dense space is unchanged, and the manifest still enumerates 288 kernels containing all 100 shipped specs. The dispatch docs now list both gfx942 dense candidates and gfx950's qbminor. Co-Authored-By: Claude <noreply@anthropic.com>
|
Found by AI: The hipkernelprovider gfx94X Would it be worth splitting the new gfx942 device knob suite (or the new pytest entries) into their own CTest entry with its own timeout budget, rather than growing the shared |
…est from the engine table The census registration listed the five engine-pinned attention engines by hand (a gfx950 loop plus a block per gfx942 engine) and repeated the nine Packs cases four times; the four knob suites were gated by four blocks that disagreed (one used an arch-aware predicate meant for per-arch registrations, one had no SDPA-off warning); and test_attention_bundle_filters.py kept its own copy of each engine's filter and categories YAML, so a wrong table column passed it. The census now loops over HKP_PINNED_ATTENTION_ENGINES with one shared Packs case list, the knob suites come from one table gated on hkp_product_offers_engine, and the filter test reads the table rows. The two gfx942 availability wrappers lose their callers and go. CTest listings, build targets and install rules are unchanged on the gfx942 and gfx942;gfx950 builds. The RUNBOOK and docs describe the table row. Co-Authored-By: Claude <noreply@anthropic.com>
…d strides The dense, unified and FlyDSL RDNA test graphs each had their own layout enum and stride functions with the same formulas. SdpaLayoutTestSupport.hpp holds them; every test graph keeps the same dims and strides (checked by a host probe over every layout and test graph) and the same 396 tests. Co-Authored-By: Claude <noreply@anthropic.com>
…ration suites IngestorIntegrationSupport.hpp had its own SdpaLayout and sdpaStrides beside SdpaLayoutTestSupport.hpp, and the gfx942 Unified3d test graphs a decodeQoStrides equal to the BSHD strides at one query. The integration header now uses SdpaLayoutTestSupport.hpp, which gains the head-row padded BHSD layout the Unified3d knob suite needs; an unknown layout throws. Strides and test graphs are unchanged (host probe), and the Unified3d knob suite selects the same kernels, 6/6. Co-Authored-By: Claude <noreply@anthropic.com>
…entry A typo in an HKP_PINNED_ATTENTION_ENGINES row's arch or engine name, or in a CatalogTiles case list's key, silently dropped that engine's census, external check and GPU-reference target. test_attention_bundle_filters.py now checks each row's arch, TOML and Packs census (which must pin that arch's inventory), and configuration fails on a CatalogTiles key that matches no row. hkp_gfx950_attention_dense_available goes like the gfx942 wrappers; its tests call hkp_product_ships_engine_for_arch. The docs scope the table to the single-arch engines pinned against the SdpaFwd bundles. Co-Authored-By: Claude <noreply@anthropic.com>
|
I reviewed this PR again. The following review threads are still unresolved, or comments have no author reply:
For reassessment, the PR author should reply to top-level feedback or state that thread feedback is addressed. Before approval, top-level comments need explicit resolution from their author or that author's approval of the PR. |
|
On the 11-06 follow-ups (#14908 (comment), #issuecomment-6679807408, #issuecomment-6681173299):
Also from a self-review with the same lenses: 050ccfd (saved-plan mask and shape refusals on both arches), 0f773b7 and f6343a9 (public names for what the gfx942 manifest names), 4d9064f (sinks/LSE no-split rule on both arches), 1eaf329 and 01de338 (saved-launch rules documented once; integration-tests docs), 23ee321 and b178943 (one home for the SDPA test layouts and strides, unit and integration). For the unified engines' owners (#14242, #14259), not changed here: gfx942 Unified3d has its own SDPA matcher and accepts any finite scale; the unified packs do not apply N15 (spills) stays a follow-up in the body. The Verification table is refreshed at 2a1516b. The two |
|
Automated review: Model - qwen3.6:35b-a3b-coding-mtp-q4_K_M, effort: high PR #14908 — Gfx942AttentionDense AOT ingestor engine (AnaghaRaoAMD, AICK-2535) — 🔴 Follow-up: conflicts with develop since 14822
Utility: 🟢 Positive — N19, N20 and the knob-suite port done; develop merge left Legend: 🔴 blocking · 🟠 should-fix · 🟡 minor nit · 🟢 info/good · ⚪ retracted Follow-up review: first pass by a local qwen3.6 model, verified by the orchestrator (Claude Opus 5.5). Checks: delta since |
|
Automated merge-queue status (rocKE merge monitor) Hi @AnaghaRaoAMD, I turned auto-merge off on this PR for now. Before a rocKE PR lands, the rocKE merge monitor checks it on top of today's develop branch, and this version would not land cleanly:
The open items from our review, each with its fix:
What to do: address the open items in our latest review (#14908 (comment)). After that, turn auto-merge back on; the monitor re-checks every push. Nothing else changed: the monitor does not approve, reject or merge PRs. It only turned auto-merge off to keep develop green. This comment is updated in place. |
…2-dense-aot Conflicts with #14822 (gfx950 conv dgrad AOT engine), resolved: - IRunnableKernel.hpp: both added launchWithParams with one signature; keep develop's. - test_packs.cpp.j2: develop's constexpr-array inventory replaces this branch's long-name fence; this branch's line-wrap rules stay. The four attention census tests develop did not regenerate are regenerated (same pack and kernel names). - config_loader.py, test_config_loader.py, test_slots.py: develop's split (unslotted knobs int or string, slot knobs int) replaces this branch's single check, and this branch's slot string-knob test goes. - integration_tests/CMakeLists.txt: this branch's knob-suite table plus develop's dgrad test block. - kernel_ingestor_engine/CMakeLists.txt, descriptors/README.md, IngestorIntegrationSupport.hpp: both sides kept; the README table gains Gfx942AttentionDense and spells Gfx942AttentionUnified3d as the engine and pack are named. - unslotted_render_golden.json: recomputed from the merged generator. Co-Authored-By: Claude <noreply@anthropic.com>
…ention engines #14822's Gfx950ConvDgradAot census block repeated the nine generated Packs cases that src/tests/CMakeLists.txt keeps in one list, and gated on its own per-engine wrapper over hkp_product_ships_engine_for_arch. It now uses the shared list and the predicate directly, as the attention engines do, and the wrapper goes. Co-Authored-By: Claude <noreply@anthropic.com>
…rehensive tier The gfx94X standard-tier test step runs every standard entry in one CTest call with a 30-minute limit, and was at about 28 minutes; the gfx942 dense knob suite's 247 per-kernel rows take about 6 minutes of it. They are now instantiated as Comprehensive/, which HIP_MLOPS_ENGINE_test_categories.yaml keeps out of the quick, standard and ffm-quick tiers (the comprehensive and full tiers run them). The suite's coverage, filter, swizzle-legality and save/load cases still run in every tier. No other test in either provider binary carries the prefix. Co-Authored-By: Claude <noreply@anthropic.com>
… engine table _knob_suites in src/integration_tests/CMakeLists.txt names the pinned engines again, and a misspelt one compiled no suite with no error. test_attention_bundle_filters.py now checks each row's source exists and every engine it pins is an HKP_PINNED_ATTENTION_ENGINES row. Co-Authored-By: Claude <noreply@anthropic.com>
The shared rule's test covered the persistent, window, sinks and LSE clauses of kv_split_admits, not ragged or varlen. gfx942's supports() refuses those layouts on other grounds, so the new test checks check_kv_segments and the knob's scope directly, on both arches. The gfx950 algorithm notes name the scale constants instead of their values. Co-Authored-By: Claude <noreply@anthropic.com>
|
On the 11-06 follow-ups (#14908 (comment), #issuecomment-6693458311) and the merge-queue note (#issuecomment-6693575535):
At e8a73bc the knob suite runs 257/257 on gfx942 (10 of them in the standard tier), and the rest of the Verification table ran after the merge. Auto-merge is back on. |
|
On the gfx94X |
|
Replies to the top-level comments listed in #14908 (comment):
|
…2-dense-aot SUPPORT_MATRIX_OVERVIEW.md conflicted; take develop's. Since #15293 a claim PR no longer regenerates the overview: it is refreshed in a PR of its own, and no check fails when it lags. Co-Authored-By: Claude <noreply@anthropic.com>
|
Automated review: Model - qwen3.6:35b-a3b-coding-mtp-q4_K_M, effort: high PR #14908 — Gfx942AttentionDense AOT ingestor engine (AnaghaRaoAMD, AICK-2535) — 🟡 Follow-up: develop merged; CI running
Utility: 🟢 Positive — N21–N23 fixed, develop merged, standard tier trimmed; platform review left Legend: 🔴 blocking · 🟠 should-fix · 🟡 minor nit · 🟢 info/good · ⚪ retracted Follow-up review: first pass by qwen3.6 (local), verified by the orchestrator (Claude Opus 5.5). Checks: delta since |
…2-dense-aot src/tests/CMakeLists.txt conflicted with #15102, which registered the gfx942 Unified3d census and its new ModelBinding suite in a hand-written block. The HKP_PINNED_ATTENTION_ENGINES loop already registers the Packs census; its companion suites now come in two kinds, CatalogTiles and ModelBinding, each listed per row under _hkp_<stem>_cases_<arch>_<slug>, and the unmatched-entry guard covers both. The ModelBinding source keeps its HKP_REQUIRE_DVC_DESCRIPTORS definition. adding-tests.md and the RUNBOOK describe both kinds. Co-Authored-By: Claude <noreply@anthropic.com>
…dsl-aotriton-parity Conflicts: - HIP_MLOPS_ENGINE_test_categories.yaml: took develop's (#14908 owns the Comprehensive* tier); quick/standard/ffm-quick still exclude Comprehensive*. - src/integration_tests/CMakeLists.txt: kept develop's attention knob-suite table (it absorbs the Unified2D/3D and gfx942 unified 3D blocks) plus the FlyDSL frontend-lane sources and HIPKERNELPROVIDER_FLYDSL_SDPA_ARCHS. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
FlydslSdpaFrontendGraphs.hpp drops its bshdStrides/bshdTensor copies and builds Q, K, V with detail::makeSdpaTensor(..., SdpaLayout::BSHD) and O's strides with sdpaStrides(SdpaLayout::BSHD, ...) from IngestorIntegrationSupport.hpp, which #14908 owns. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>



ISSUE ID : AICK-2535
Problem
gfx942 has no ahead-of-time packaged dense SDPA forward engine. The rocKE dense prefill kernel (
rocke/library/kernels/gfx942/attention_dense.py) is reachable only through rocKE's own launch path, not as a hipDNN engine.Fix
hipkernel:Gfx942AttentionDense, generated throughprojects/hipdnn/tools/IngestorGenerator/configs/gfx942_attention_dense.engine.yaml. Descriptors live underdescriptors/rocKE/gfx942_attention_dense/; the KDP is DVC-tracked (artifacts.dvc, pushed to theingestorremote).packs/AttentionDenseCommon.hppandpacks/AttentionDenseNative.cpphold graph and kernel matching, signatures and the dispatch handler, reading the graph through feat(hip-kernel-provider): add gfx950 unified attention 2D/3D ingestor engines #14242'sSdpaGraphMatch.hpp; anAttentionDenseArchdescriptor carries what differs. gfx942 plans save and restore underhipkernel.gfx942_attention_dense.dispatch.v1, frozen by golden samples of each launch form. gfx950 saved-plan contracts are unchanged. Both packs now also decline SDPA compute types other than FLOAT/HALF/BFLOAT16 (the kernels accumulate in FLOAT) and scales outside [2^-64, 2^4], and both restore paths apply the same saved mask and shape rules.left_boundW keeps W keys, SEM-001); the SdpaFwd stats (LSE) output, bound like the FlyDSL CDNA pack does. Batch, both sequence lengths and both head counts are runtime kernel arguments. Everything else is declined; see Follow-ups. The ragged decline also lands in gfx950, which had the same gap.qb_minor,bt_hkv_minorandhq_minor_swzorders, and the persistent D128 grid (304 CTAs, a pinned decode order, host-computed fast-division constants). Persistent is the cold default for D128 when 304 is a multiple of the device's CU count; the cold score then ranks tile,lds_row_pad,pv_priorityand the body levers with their policy arm first.gfx942_dense_qbminorandgfx942_dense_{persist,btminor,hqswz}_aotpin the grids the native dispatch launches (the tuned default resolves its grid from the build-time shape).supports_attention_denserefuses windows that leave query rows no key unless sinks or the LSE path handle them. The gfx942 and gfx950 dense runners check the same scale range as the packs.hipdnn_bench enumerate) works.variant_reducekeeps 224 of the manifest's 1,500 kernels from an autotune sweep on MI300X (two timed rounds over the 814 non-windowed served graphs and 153 stats graphs, eps 0.01, run-to-run drift 0.5%): 144 floor kernels (tile divisibility and declared defaults; the 32 window cells are floor-only) and 80 kept for measured wins. The sweep ran on a build of cde4c65; all 1,500 kernels lower to byte-identical LLVM IR with that tree's rocKE, with develop's at 3ab1173 and with this head's, so the ranked kernels are the shipped ones.kv_segmentsis a KMD field, andkernel_matchserves 1 only. The manifest names the models behind each window size.factorise_config.pynow carries a per-arm policy resolution, which the reduced selection needed. The five engine-pinned attention engines (both gfx942 engines and the three gfx950 ones) register their external checks, GPU-reference targets and census from one table,HKP_PINNED_ATTENTION_ENGINESinsrc/CMakeLists.txt, whichtest_attention_bundle_filters.pychecks against the categories YAMLs; the knob suites are gated from one table, and feat(hipdnn): gfx942 unified 3D split-KV decode as a hipDNN ingestor engine #14259's Unified3d knob suite runs on the shared harness. The census template wraps long lines as clang-format does, so all five attention census tests regenerate byte-for-byte. The two SdpaFwd Defaultsupport.jsonfiles carry this engine's claims alongside gfx942 Unified3d's.Follow-ups
Not covered by this AOT engine. A graph-level gap is declined with an INFO line naming the cause; a window size the catalog lacks, or a sequence length no shipped tile divides, passes the graph match and then matches no kernel.
causal_bottom_right)kv_segments> 1)kernel_matchserves 1 only.qb_minorgridsOther follow-ups:
IntegrationGpuGfx950AttentionUnifiedKnobs.cpp) ontoServedEngineHarnessand the shared SDPA test helpers; it needs a gfx950 run.gfx942_dense._make_spec) refuses unmasked graphs with seqlen_q != seqlen_kv, which the pack serves. A Python/C++ parity gap already on develop; unpinned rocKE routing sends these graphs to the unified path, and this PR does not change that.Verification
Rows ran on gfx942 (MI300X, 304 CUs) at 13dd161, after merging develop at 886472e, unless the row says otherwise; develop's gfx942 Unified3d (KDP and trained ranker) and gfx950 conv dgrad DVC artifacts were pulled so their bundles pack. The 224 shipped kernels lower to the same LLVM IR at this head as at the sweep.
hipdnn_validate_descriptors;verify_variant_sets.py --mode full; shipped catalog regenerated byte-for-byte (g2)HKP_PINNED_ATTENTION_ENGINES: CTest listings (gfx942 andgfx942;gfx950builds, install), build targets, compiled knob suites and install rules, against the tree before the refactor, at 2a1516bgfx942;gfx950build without a GPU; gfx950 knob suite compilesgfx942_dense_qbminordefault spec withemit_lse(bf16/fp16, D64/D128, causal/full, 3 sizes, MHA/GQA), 2026-11-03attention_dense_prefill.py --persistent --np 304(bf16/fp16, causal/full,bt_hkv_minor,hq_minor_swzandqb_majordecodes), 2026-11-03dispatch/attention,test_attention_dense_gfx942.pyand the library layering test (CPU); therocke_library_attention_pytestCTest entry, which now collects the scale and key-less-window tests (at 2a1516b)hipdnn_strict_skips; hip-kernel-providerhkp-pack-quick(descriptor-packaging-m quick)pandasandflatbuffersinstalled), 1 strict xfail (#14242's gfx950 unified 2D launch surface, with its reason); the 36 strict errors are prerequisites CI provides (validator path, flatbuffers headers, gfx950 unified KDPs, a repo-root build), and with them provided those tests pass (50/50, 14/14) or skip on the absent KDPs; 811 passed, 90 skipped.clang-tidy, FlyDSL off (as the Linux superbuild): the changed sources and every TU that depends on a changed header, each round through 2a1516b, including the knob suites; FlyDSL natives and test TUs that include a changed header syntax-checked with FlyDSL on