Repository navigation
feat(hip-kernel-provider): FlyDSL SDPA forward parity with AOTriton, plus vLLM forms - #15066
BradPepersAMD wants to merge 16 commits into
Conversation
✅ All Checks Passed — Ready for Review
📖 Need help? See the Policy FAQ for details on every check and how to fix failures. |
|
🎉 All checks passed! This PR is ready for review. |
71ba557 to
ae4e94c
Compare
…plus vLLM forms Extends the FlyDSL SDPA forward engines of #14111 to match all of AOTriton's forward features, verified on AOTriton's forward test suite (forward only; backward is separate work), and serves the forms vLLM needs. Families: RDNA3 (gfx11-generic), RDNA4 (gfx12-generic) and CDNA (gfx90a, gfx942, gfx950). Sits directly on develop, which carries #14111 (FlyDSL core), #14358 (SDPA references) and #14332 (TensorAttributes Python bindings); this commit adds only the parity work on top of them. Features (all families unless noted): - Variable length: padding by per-batch lengths (padded rows O = 0, LSE = -inf); packed THD via ragged offsets; packed + both lengths (PyTorch seqused_k); ragged Q with seq_len_kv alone (SEM-028), which develop's frontend and references already accept (cuDNN 9.25 spells it cu_seq_len_q + seq_len_kv; hipDNN maps that once #14560 lands; no API change here). - Dropout: Philox4x32-10 bit-compatible with AOTriton (0.14.2b/0.15 word order), the rng_dump mask writer op, dropout with bias and under padding, at every AOTriton head-dim width on RDNA and CDNA. - Packed + Philox dropout (PyTorch's varlen flash path) on CDNA, gfx11 and flydsl_sdpa_aiw, compact or with per-batch lengths where the family serves them: each sequence draws AOTriton's varlen counters (its index, positions within it, the graph's declared extents), so dense, padded and packed storage of one problem draw one mask, and the rng_dump stays the dense FLOAT [B, Hq, Sq, Skv]. Matchers only, no object changes; packed with a bias still declines. SdpaSemanticsRegister SEM-015 records the mask layout. - fp32 I/O: exact fp32 on CDNA (with bias, dropout, any scale, head dims 136-248) and exact IEEE fp32 on the RDNA prefill engine (VALU path). - Bias at every head-dim tier, f32 or query dtype, vectorized and strided (any layout incl. key-broadcast), padded bias on the vectorized objects. - Attention sinks in FLOAT, cuDNN's dtype (SEM-022): every FlyDSL family now reads the FLOAT sink the frontend accepts (it read only a query-dtype sink before); any other sink dtype is declined. - Zero, negative and subnormal softmax scales. - Head dims 264-512, Q/K != V head-dim pairs, MLA 192/128, Hk != Hv on CDNA. - Head dims that are not a multiple of 8 (any row pitch) through padded copies (new sdpa_head_pad helper op), which like the engines declines K off Q's head dim and O off V's; multiple-of-8 graphs are unchanged. - Windows/bands: left-only windows on CDNA; FA/vLLM window mapping (SEM-027). No FlyDSL kernel reads V at keys no row of its block sees (window, band, past seq_len_kv), so NaN/Inf in nulled or stale KV no longer reaches O. - Exact softmax exponent at the max key (fixes two #14111 findings: NaN at large bf16 scores, and a 2^-8 output bias at e.g. head_dim 512, scale 1.2): CDNA generic/decode round the max down and clamp P in v_exp_f32 with DX10_CLAMP off (NaN rows stay NaN); CDNA dual-wave and RDNA take s - m first; flydsl_sdpa_aiw no longer contracts the scale into the exponent. - bf16 P rounded to nearest before the second product in every bf16 FlyDSL SDPA forward (truncation biased O about 2^-8.5 low wherever V does not have zero mean, AOTriton's lesson 16): CDNA generic and decode, bias and dropout builds included (gfx950 v_cvt_pk_bf16_f32; gfx942/gfx90a AOTriton's bf16_round_nonan_pack_v8), and flydsl_sdpa_aiw; the dual-wave and RDNA packs already rounded. The gfx942 bf16 generic objects cost +0.9% geomean (COVERAGE 7.5, deferred item 27). - gfx950 16-bit decode takes the rounded-down max like every other plain build: rounded to nearest, c * m could round up where |c * m| passes 2^31 (Q = K = V = 132,096), every exponent of the row fell below -126, and O was 0. - tools/check_trans_hazards.py (REGEN.md step 4) flags a transcendental result read by the next VALU instruction in the gfx942/gfx950 objects (the hazard an inline-asm convert hid from the backend's hazard recognizer). - gfx950 decode: the 16-bit decode builds pack bf16 P rounded to nearest, so the exact exponent no longer serializes their K loads (Llama-style long-cache decode was 14-22% slower; now within 0.1% geomean of before, at most +1.7%), and the gfx950 DMA V path reads a causal block's V window through a per-workgroup buffer descriptor instead of clamping every row (decode head_dim 128 causal +2.3-3.3% -> +0.2-1.4%). - Performance: CDNA head_dim 256 tiles with K chunking on gfx942/gfx90a, and gfx950 head_dim 256 on the dual-wave kernel (4 waves, ported from AOTriton's gfx950 FlyDSL forward). - Determinism: the FlyDSL SDPA forward kernels are deterministic by construction (no atomics; fixed-order split-KV combine; per-wave LDS partials); the split count follows the device's CU count. Documented in COVERAGE 5.7; no determinism tests yet. Frontend and references: - p = 0 dropout without an RNG dump (and with fp8 scaling) is no dropout in the references. - The CPU and GPU references never read V at keys a window or block mask removes (NaN/Inf in nulled or stale KV blocks no longer leaks into O). - GPU reference: a padded query row exits before the softmax max, and the fp8 dequantize pass skips Q/K/V padding, so padding is never read (SEM-008). Tests now exercise the native ragged plans (CPU BF16 densify comparison, GPU executor routing) and a paged fp8 K/V case with scalar descales (follow-ups from Adam Dickin's #14358 review). - Fix: frontend descriptor unpacking keeps ragged offsets, the ragged multiplier and byte alignment (graphs loaded from JSON and re-lowered were made dense). It asks for the multiplier only on a ragged tensor, and reads an extension a backend of the same major version does not serve (NOT_SUPPORTED, or BAD_PARAM from a therock-10.0 backend) as unset, so dense graphs still deserialize there. - Python: test_sdpa_ragged.py builds a packed THD SDPA graph through #14332's ragged-offset accessors, checks what validation and JSON/binary serialization keep, and compares it on the CPU reference with its padded equivalent and a float64 oracle (that case skips without HIPDNN_REF_CAPI_LIB). - Folds in #14696 (Daming Feng, ALMIOPEN-3094): dense attention-sink quick-tier bundle (quick/SdpaFwd/SinkToken: FLOAT [1, H_q, 1, 1] sink, GQA 8:2, causal, stats) and tests (an untyped sink rejected through Graph::validate, sink lowering, dense CPU plan execution with a sink and a dangling sink uid, CPU-reference sink rescaling per query head, -inf sink, wrong-shape sink); its validation and CPU-reference sink support were already on develop via #14358. Provider: - A per-engine graph-schema guard under engine plugin API 1.4.0: each engine sees only graphs up to the schema it declares. The built-in engines (HIP_MLOPS, HIP_FLASH2, ASM_SDPA) declare 1.4.0, which #14202 reviewed them against, so ASM's ragged (group-mode) path still reaches it; the FlyDSL engines declare 1.4.0 through their UEDs; every other engine stays at the provider's 1.2.0 baseline. The FlyDSL engines decline override-shape graphs. The guard holds engines back one by one inside the threaded applicability path, so the engines it admits keep their pool offload. - ASM_SDPA forward: its group-mode kernels are now checked against the CPU reference (THD, head dims 128 and 192/128, no mask and bottom-right causal per sequence); test only, the engine is unchanged. - FlyDSL SDPA integration lanes (test configuration only): the generated lane TOMLs grade the LSE/stats output with allclose_matching_infinities, since a padded row's LSE is -inf in the engine and the reference alike, and the lanes compare on the host (HIPDNN_TEST_VALIDATOR=cpu), which that validator needs; O keeps the default validator. Support claims for the FlyDSL engines on the SinkToken and padneq quick bundles (gfx942, gfx1201). Validation: AOTriton's forward test grid run through hipDNN with dnn-benchmarking, checked against PyTorch/AOTriton and hipDNN's GPU and CPU references, on gfx90a, gfx942, gfx950, gfx1201 and gfx1100 (details and results in the PR). Every existing #14111 object either changed only through a listed kernel modification or stayed byte-identical; see flydsl/COVERAGE.md and the vendored-kernel modification lists in each kernel README. AOT objects (DVC remote ingestor): SDPA objects 688 -> 1,912 across the five targets (incl. the dropout-mask and head-pad helpers); FlyDSL object dirs 25.6 -> 64.8 MiB. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
ae4e94c to
dbf110a
Compare
Codecov Report✅ All modified and coverable lines are covered by tests. Additional details and impacted files@@ Coverage Diff @@
## develop #15066 +/- ##
===========================================
+ Coverage 78.08% 78.10% +0.02%
===========================================
Files 2977 2978 +1
Lines 508809 509371 +562
Branches 79009 79102 +93
===========================================
+ Hits 397280 397813 +533
- Misses 84394 84411 +17
- Partials 27135 27147 +12
*This pull request uses carry forward flags. Click here to find out more.
🚀 New features to boost your workflow:
|
- Build the frontend lane's arch list from a const char* so clang-tidy's readability-redundant-string-init passes when no FlyDSL content is built. - Skip *.template.json in the rocKE SDPA golden-graph collector (pytest and CMake), so the SinkToken sweep template is not read as a graph. - Device-test packed THD sequences with f32 dropout on CDNA and RDNA, and accept them in the f32 host tables; the RDNA skip messages now say 16-bit. - COVERAGE.md: describe how each family rounds bf16 P, and drop the rows that still listed packed dropout as declined; remove leftover plan labels. - aiw README: note that the now-unused pack helpers stay for upstream parity. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… every launch The FlyDSL SDPA forwards are deterministic by construction: no shipped object (gfx90a, gfx942, gfx950, gfx11-generic, gfx12-generic) has an atomic instruction, and a split decode's merge reads each split's partial from its own workspace slot in split order. Nothing tested it. These tests do, and they catch the two ways a forward stops being deterministic: a race, and a read of memory the launch did not write. - The CDNA and RDNA device harnesses take a launch count. Each further launch of the same object runs on the same inputs, with its O, its LSE and its workspace filled first with another byte (NaN, zero, then a large finite value), and must give the first launch's O and LSE bit for bit. A packed launch refills only the token rows, so the guard rows still hold the NaN the packed check reads. - TestGpuFlydslSdpaCdnaDispatch.GivesTheSameBitsOnEveryLaunch: every object the graph admits, at the model shape (dual-wave objects where they ship), f16 at head_dim 256 under a causal mask with the LSE, a single-token decode over 20,000 keys (split, merged from the workspace), and packed sequences. - TestGpuFlydslSdpaRdnaDispatch.GivesTheSameBitsOnEveryLaunch, TestGpuFlydslSdpaRdnaDispatch.DecodesTheSameBitsOnEveryLaunch and TestGpuFlydslSdpaAiwDispatch.GivesTheSameBitsOnEveryLaunch: bf16 at the default shape, f16 causal with the LSE, a split decode over 2,100 keys, and packed sequences on the aiw objects. Mutation-checked on gfx950, gfx1100 and gfx1201: a merge launched on a stream of its own, unordered after the split launch, and a merge that reads its partials from workspace no launch writes, each fail the new tests. The race passes a single launch against the reference; the repeated launches catch it. The intermittent ServesHeadDim256OnTheDualwaveKernel failure on one MI300X GPU is that GPU, not the kernels. On it, a few percent of launches of some f16 causal objects at head_dim 256 change O and the LSE in rows 12 and 28 (mod 32) of query heads 4 and 20 only, by up to 0.023 (the f16 bound is 0.004). The same binaries and inputs give identical bits on every launch on two other MI300X GPUs, on gfx950 and on gfx90a. On a healthy GPU those objects' worst error over 20 input draws is 0.00039 to 0.00041, a tenth of the bound. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…rehensive tier The Windows gfx110X hipkernelprovider standard shards run at 28-30 min against a 30-min step limit on develop, and this branch adds ~1-1.5 min per shard, mostly gfx11 time in hip_kernel_provider_tests and hip_kernel_provider_integration_tests. - HIP_MLOPS_ENGINE_test_categories.yaml: a Comprehensive* GTest instantiation prefix, excluded from quick, standard and ffm-quick and run by comprehensive (nightly: Linux gfx94X, Windows gfx1151) and full, as integration-tests' test_categories.yaml does. - The frontend lane's DualwaveHeadDim256 cases (gfx950's dual-wave kernel, ~30 s on a gfx11 runner) run in every tier on gfx950, the architecture they are pinned to, and on other GPUs from ComprehensiveDualwaveHeadDim256. - TestGpuFlydslSdpaRdnaDispatch.DropsThroughABias keeps head_dim 128 and DropsAtTheGenericTiersWidths 48 and 224; the other widths run in Comprehensive/TestGpuFlydslSdpaRdnaComprehensiveTier. TestGpuFlydslSdpaObjects still launches every dropout object form in every tier. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…comprehensive tier The first trim leaves this branch ~60 s over develop on the Windows gfx110X hipkernelprovider standard shard 1, which develop alone runs at 28-29 min of its 30-min limit. Moved to Comprehensive* instantiations (comprehensive and full tiers), every case still run there: - TestGpuFlydslSdpaObjects: OnePerForm leaves the RDNA prefill and decode forms isNightlyForm names (a bias with a sink, a generic tier or a V head dim of its own, or on prefill a split V; exact f32; V-mask pairs; the generic decode tiers split four ways) to Comprehensive/...OnePerNightlyForm. OnePerForm keeps the other 44 forms per engine, develop's set. - TestGpuFlydslSdpaRdnaDispatch.DecodesZeroAndNegativeScalesAcrossSplits, DecodesWithinAotritonsBoundAtScale1Point2 and AppliesALeftOnlyWindowAsTheCpuReferenceDoes run as Comprehensive/TestGpuFlydslSdpaRdnaComprehensiveTier; their prefill and non-causal siblings stay in standard. - The frontend lane's AotritonScale1Point2HeadDim512 cases run in every tier on CDNA (the decode objects they pin) and in the comprehensive tier elsewhere (ComprehensiveAotriton). COVERAGE.md lists the cases the comprehensive tier runs and standard does not. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The trained UHD models for the FlyDSL engines were fit to the previous FlyDSL catalog. This catalog has different objects and kernel fields, so the models are removed and every FlyDSL UED binds only its default slots: the native ranker orders each engine's kernels by descriptor priority, the engine estimate stays the disabled default slot, and autotune measures the order. Models retrained on this catalog are a follow-up; gen_descriptors.py binds them per arch once installed under heuristics/. The generator's model binding, its tests and the UHD infrastructure are unchanged. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…igins hipDNN's ragged tensors now follow cuDNN's per-batch rules (RFC 0014, SEM-026): with per-batch lengths, sequence b is seq_len[b] tokens from offset[b], the tables may list the origins in any order and leave gaps, and their last entry need not bound the last sequence. The RDNA prefill kernel (vendored modification 37) and the CDNA generic kernel (modification 47) clamped each length to offset[b + 1] - offset[b] and filled a slot's rows past its length. They now read each sequence at its origin for its own length and write no token outside it. A new launch flag keeps the query counts from Q's table for seq_len_kv alone (PyTorch's seqused_k). The aiw kernel already read K at per-batch origins for its used lengths. Tests: device cases on every packed family with origins out of order, gaps and a last table entry that bounds nothing, run against the per-sequence oracle and, through the frontend lane, hipDNN's CPU reference graph executor; the harnesses check every token no sequence owns stays unwritten. Decline cases for lengths and tables at a batch stride of 2 and head-major packing with lengths, beside the existing INT64, element-unit and head-major declines. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…r-batch origins The RDNA prefill (gfx11-generic, gfx12-generic) and CDNA generic prefill (gfx90a, gfx942, gfx950) objects rebuilt from the kernels that read packed sequences at per-batch origins for their own lengths. The RDNA decode, CDNA decode and dual-wave objects are byte-identical; only their manifests' input digests move. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…dsl-aotriton-parity SUPPORT_MATRIX_OVERVIEW.md takes develop's copy: since #15293 the overview is refreshed in a PR of its own, not with claim changes. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Automated overlap notice (rocKE merge monitor) Hi @BradPepersAMD, This PR and #14908 (AnaghaRaoAMD) add the same two pieces. The recorded owner of both is 14908: it lands first in the merge plan, and for the helper, the shared integration-test header
Paths are under
Resolution: once 14908 lands, this PR rebases, drops its copies, and reuses Landing order: the merge plan has 14908 first (wave 2, a cgmillette priority); this PR is not ready to merge yet. If this PR lands first instead, it needs nothing more: 14908 keeps the shared-header helper and the tier comment, and replaces this PR's copies in its own rebase. Rebase steps, once 14908 is in develop:
Checked by reading both heads; nothing was built. If you think this PR should own either piece instead, reply here and on 14908, and the reviews will follow the new decision. Automated overlap check: one owner per shared piece of code, coordinated on the PRs. |
…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>
|
Automated review: Model - qwen3.6:35b-a3b-coding-mtp-q4_K_M, effort: high PR #15066 — FlyDSL SDPA forward parity with AOTriton, plus vLLM forms (BradPepersAMD, ALMIOPEN-3144) — 🟠 First-round: conflicts, copies, dropped models
Utility: 🟢 Positive — broad, well-tested SDPA forward coverage; conflicts and copies remain Legend: 🔴 blocking · 🟠 should-fix · 🟡 minor nit · 🟢 info/good · ⚪ retracted First-round review: first pass by qwen3.6 (local), verified by the orchestrator (Claude Opus 5.5). Checks: merge with develop, tests on a resolved merge, CI shard logs, overlap, rules 1–3, saved probes, code quality. Flags whether a closer look is needed; not an approval or rejection. |
The UHD removal took the RMSNorm fwd/bwd trained models and their UED slots along with the SDPA ones. Only the SDPA catalog changed, so restore the RMSNorm heuristics (heuristic.uhd.json + model.bin.dvc per arch) and UED bindings exactly as develop has them; gen_descriptors regenerates them unchanged. COVERAGE §6 now says only the SDPA engines lost their models. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… the newer fields The gfx950 rocKE conv dgrad engine (#14822) gates tensor alignment (multiples of 16 bytes), declines ragged, pass-by-value and override-shape graphs, but its UED claimed graph schema 1.0.0. Both the provider's schema guard and the SDK plan builder's understandsGraph therefore declined every graph declaring 32- or 64-byte alignment (floor 1.3.0), which the matcher serves. Declare 1.3.0 at the source (make_conv_dgrad_aot_config.py) and in the shipped UED, update the generated census expectation, and add the engine to TestContainer's opt-in list. Tests: the graph matcher accepts 32/64-byte alignment; on gfx950 an aligned dgrad graph built through the frontend gets a plan on this engine and matches the CPU reference. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…enerators gen_sdpa_head_pad.py and gen_sdpa_dropout_mask.py each carried a _verify that repeated develop's verify_layout (signature, kernarg segment, no VGPR spill). Call verify_arch and the shared verify_layout from _sdpa_rdna_build.py instead. It stays there, not in _codeobject.py: every op's generators import _codeobject.py, so moving it would restamp every FlyDSL op's inputs_sha256 and need a full regeneration. The two generators are inputs of their ops, so sdpa_head_pad and sdpa_dropout_mask were regenerated for all five targets: the ten objects are byte-identical, only each manifest's inputs_sha256 (and its SOURCE.md and .dvc pointer) changed. test_inputs_digest now lists the two helper ops among _sdpa_rdna_build.py's readers. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Automated review: Model - qwen3.6:35b-a3b-coding-mtp-q4_K_M, effort: high PR #15066 — FlyDSL SDPA forward parity with AOTriton, plus vLLM forms (BradPepersAMD, ALMIOPEN-3144) — 🟠 Follow-up: CI update, shard timeout
Legend: 🔴 blocking · 🟠 should-fix · 🟡 minor nit · 🟢 info/good · ⚪ retracted Follow-up review (CI update): no new commits since the first-round review; the orchestrator (Claude Opus 5.5) compared this head's gfx94X shard logs with develop's. Flags whether a closer look is needed; not an approval or rejection. |
…ehensive tier TheRock's Linux gfx94X hipkernelprovider shard 1/2 runs the standard tier under a 30-minute step limit. Develop alone takes 1676-1737 s there, and this branch adds about 220 s to hip_kernel_provider_tests_standard_suite on that shard, so the shard times out. Every case below still runs nightly, in Comprehensive* (the gfx94X nightly runs the comprehensive tier). The standard gtest list keeps the same names, so the gtest shard assignment does not change. - ServesHeadDim256OnTheDualwaveKernel runs pre-merge only where the build ships the dual-wave kernel for the device (gfx950). Elsewhere it only exercises the generic objects (about 115 s on gfx942), and ServesHeadDim256WhereShipped already covers head_dim 256 there pre-merge. The comprehensive copy runs it on the other archs. - TestGpuFlydslSdpaObjects OnePerForm, CDNA generic engine: isNightlyCdnaForm sends the f16 and causal builds of the V-mask, bias-with-sink, bucketed-bias, strided-f32-bias and split-V forms to OnePerNightlyForm. It also sends split V beside a bias, bucket or V mask, and exact f32 beyond its plain non-causal form. That leaves 31 of 88 forms per target pre-merge: develop's 22 plus the bf16 non-causal build of each feature. Checked offline against the gfx942/gfx950/gfx90a kdp metadata. - ComputesF32WithABiasDropoutAndAZeroScale runs pre-merge at head_dim 192 (the column-split bucket). 64, 128 and 96 move to the comprehensive tier. - HoldsAotritonsBoundAtScale1Point2 runs pre-merge at 64 and 256; 512 moves to the comprehensive tier. The frontend lane's AotritonScale1Point2HeadDim512 still runs on CDNA in every tier. - KeepsValuesAtKeysNoRowSeesOutOfO runs pre-merge with NaN plus the f32 cases; infinity and -infinity move to the comprehensive tier. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Automated review: Model - qwen3.6:35b-a3b-coding-mtp-q4_K_M, effort: high PR #15066 — FlyDSL SDPA forward parity with AOTriton, plus vLLM forms (BradPepersAMD, ALMIOPEN-3144) — 🟠 Follow-up: fixes landed, one copy left
Utility: 🟢 Positive — six of seven open rows fixed; one helper copy remains 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: merge with develop, build and ctest, differential golden, saved probes, CI runner pools, code quality. Flags whether a closer look is needed; not an approval or rejection. |
|
Automated review: Model - qwen3.6:35b-a3b-coding-mtp-q4_K_M, effort: high PR #15066 — FlyDSL SDPA forward parity with AOTriton, plus vLLM forms (BradPepersAMD, ALMIOPEN-3144) — 🟠 Follow-up: CI update, shards at the limit
Legend: 🔴 blocking · 🟠 should-fix · 🟡 minor nit · 🟢 info/good · ⚪ retracted Follow-up review (CI update): no new commits since the last follow-up; the orchestrator (Claude Opus 5.5) compared this head's shard logs with develop's same shards on the same runner pools, case by case. Flags whether a closer look is needed; not an approval or rejection. |
JIRA ID : ALMIOPEN-3144
Summary
This PR extends the FlyDSL SDPA forward engines from #14111 so that they match all of AOTriton's forward features on gfx11, gfx12, gfx90a, gfx942 and gfx950. Every feature was verified by running AOTriton's own forward test grid through hipDNN with the AOTriton test harness in dnn-benchmarking; that grid ran before the bf16 P rounding and packed dropout, which are covered by their own device tests and A/B timing. It is one commit on develop and is forward only; backward is separate work.
Features
seqused_k(ragged Q withseq_len_kvalone) are served on every family.seqused_kon aiw). INT64 tables, other batch strides, element-unit offsets and head-major layouts are declined.Defects fixed
tools/check_trans_hazards.py, flags a transcendental result read by the next VALU instruction in the gfx942/gfx950 objects, the hazard an inline-asm convert hid from the compiler on gfx950.offset[b + 1] - offset[b]or write a slot's rows past its length, which read out-of-order origins wrong and wrote tokens the tensor does not address.seq_len_kvremoves, so NaN/Inf in stale or nulled KV no longer reaches O.rocke_library_sdpa_pytestno longer reads the new SinkToken sweep template as a graph.Validation
TestGfx950AttentionDensekpack tests, which fail the same way on develop.allclose_matching_infinitieson the host.Comprehensive*), so TheRock's Windows gfx110X test shard stays under its 30-minute limit; every case still runs nightly.Risk and mitigation
ApplicabilityManager,GraphSchema.hpp) declines a graph for every engine whose declared schema (built-ins 1.4.0, ingestor engines their UEDsdk_version) is below the graph's floor. For ingestor engines this is the same decline develop'sGenericPlanBuilder::understandsGraphalready makes on the graphs hipDNN stamps. The gfx950 rocKE conv dgrad engine (#14822), whose matcher reads alignment, now declares 1.3.0 (UED andmake_conv_dgrad_aot_config.py), so it serves 32/64-byte aligned graphs; a gfx950 test covers that.ingestorremote.Related PRs and follow-ups
test_sdpa_ragged.py) use them.cu_seq_len_q/kv. Follow-up after it lands: FlyDSL engines and both references acceptcu_seq_len_qas cuDNN's spelling of the ragged-Q +seq_len_kvform they already serve (SEM-028), soseqused_kmoves to the cuDNN API.🤖 Generated with Claude Code