Skip to content

[Triton/Gluon] Add a16w4 MoE tuned dispatch and gfx942 DSv4.1 tables - #5667

Merged
Boss2002n merged 10 commits into
ROCm:mainfrom
akii96:aakif/a16w4-moe-tuned-dispatch-gfx942
Oct 3, 2026
Merged

Boss2002n merged 10 commits into
ROCm:mainfrom
akii96:aakif/a16w4-moe-tuned-dispatch-gfx942

Conversation

@akii96

@akii96 akii96 commented Sep 18, 2026 •

Copy link
Copy Markdown
Contributor

Summary

get_kernel_config_triton hardcodes block_k=256, block_n=512 and num_stages=1 for every architecture. Those suit CDNA4's 160 KiB of LDS; CDNA3 has 64 KiB, so the gfx942 prefill tile runs at very low occupancy.

This routes the kernel through the tuned dispatch that a8w4 already uses and ships a gfx942 table for DeepSeek-V4.1-Flash at TP4 and TP8.

  • get_moe_dispatch("A16W4", get_arch(), "triton"), keyed by bm<block_m>_n<N>_k<K>
  • configs/gfx942/triton/moe/a16w4/DEFAULT.json, 8 entries

get_moe_dispatch returns {} when no file is shipped, so untuned architectures are unaffected. On gfx942 only the 8 listed prefill shapes change; decode (block_m 16/32) and unlisted shapes keep the existing defaults.

Results

MI325X (gfx942), ROCm 7.2.3, DeepSeek-V4.1-Flash, E=384, topk=6.

entry stock tuned speedup
bm128_n1536_k5120 16.484 ms 4.219 ms 3.91x
bm128_n5120_k768 8.131 ms 1.924 ms 4.22x
bm128_n1024_k5120 11.275 ms 2.688 ms 4.20x
bm128_n5120_k512 5.288 ms 1.463 ms 3.67x
bm64_n1536_k5120 2.155 ms 1.291 ms 1.68x
bm64_n5120_k768 1.152 ms 0.660 ms 1.75x
bm64_n1024_k5120 1.477 ms 0.882 ms 1.65x
bm64_n5120_k512 0.839 ms 0.503 ms 1.68x

End to end via vLLM (--moe-backend aiter_triton_mxfp4_bf16, random 65536 in / 512 out, concurrency 8, TP=4, 3 repeats, CV 0.14%):

metric stock tuned delta
Output throughput 97.35 tok/s 111.88 tok/s +14.9%
TPOT mean 55.70 ms 44.80 ms -19.6%

Notes on Tuning

No a16w4 tile tuner exists in-tree, so the entries come from a sweep over all six knobs the kernel forwards to the launch.

Worth knowing when adding shapes:

  • block_k=64 compiles only with matrix_instr_nonkdim=32, and it wins at block_m=128 on most shapes. Sweeping with nonkdim fixed hides it entirely.
  • block_n=256 won on every shape; the stock 512 never did.

Tests

  • All 8 entries verified resolving to the measured tiles against a live install; decode and unlisted shapes confirmed returning the existing defaults.
  • Tuned vs stock output differs by exactly 0.5 bf16 ULP, caused by block_k changing the K-split. block_n, num_stages and num_warps are bit-identical.
  • GSM8K 8-shot (200 examples, chat endpoint): 0.905 exact_match (flexible-extract) on both the tuned and stock-tile arms are identical.

Limits

  • Measured on MI325X. gfx942 also covers MI300X, which shares the 64 KiB LDS but not the memory bandwidth; untested there.
  • TP4 and TP8 only. TP2 needs ~287 GiB/GPU for this model and cannot load.
  • Keys use the padded intermediate: the per-rank shard is rounded up to a multiple of 256 before reaching the kernel (TP4 576 -> 768, TP8 288 -> 512), so gemm1 is `n=2*

@akii96
akii96 requested a review from a team September 18, 2026 12:35
@github-actions

Copy link
Copy Markdown
Contributor

🏷️ CI Guide

Runs automatically on every PR:

  • ✅ Pre-checks (submodule verification, code formatting)
  • ✅ Aiter op tests (gfx942 + gfx950)
  • ✅ Triton tests on MI35X (only when aiter/ops/triton/** or related paths are changed)

Extended tests (opt-in via labels):

Label Tests
ci:gfx1250-ffm-triton Run the five-shard gfx1250 FFM Triton test suite
ci:triton-300x Run an additional Triton test job on MI300X in PRs; main branch always runs both MI35X and MI300X
multigpu Aiter multi-GPU tests on the 8-GPU runner
ci:sglang SGLang integration tests: DeepSeek-R1-MXFP4 accuracy, Qwen 3.5 accuracy
ci:atom ATOM benchmark: DeepSeek-R1-0528, GPT-OSS-120B
ci:atom_full ATOM accuracy suite for PR and main models from ATOM models_accuracy.json
ci:vllm vLLM benchmark: GPT-OSS-120B, DeepSeek-R1-0528, Kimi-K2.5
ci:all All standard extended tests (excludes ci:atom_full)

Only add ci:atom_full for FlyDSL or Triton upgrades.
Add labels via the sidebar or gh pr edit 5667 --add-label <label>

PR title tags & labels:
Component tags ([Triton/Gluon], [HIP], [CK], [ASM], ...) are added to the PR title and as PR labels automatically from the changed files and re-synced on every push — change-type tags like [fix]/[Perf], op tags like [MLA], and human labels (ci:*) are left untouched. Add the no-auto-title label to opt this PR out.

@github-actions github-actions Bot changed the title [Triton] [Config] Add a16w4 MoE tuned dispatch and gfx942 DSv4.1 tables [Triton/Gluon] Add a16w4 MoE tuned dispatch and gfx942 DSv4.1 tables Sep 18, 2026
@akii96
akii96 requested a review from Boss2002n September 18, 2026 13:28
@Boss2002n
Boss2002n requested a lite review from Copilot September 18, 2026 13:33

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

🟡 Changes recommended

Add gfx942 test coverage and validate or constrain the MI300X rollout.

Get a fresh assessment by requesting another Copilot review.

Pull request overview

Adds gfx942-specific, per-shape Triton dispatch tuning for A16W4 MoE GEMMs while preserving fallback behavior.

Changes:

  • Adds architecture- and shape-specific dispatch lookup.
  • Adds eight gfx942 tuning configurations.
  • Preserves defaults for unmatched shapes and architectures.
File summaries
File Summary
aiter/ops/triton/moe/moe_op_gemm_a16w4.py Applies tuned dispatch entries with fallback defaults. Moderate finding (3 votes): gfx942 coverage is skipped by existing CI. Moderate finding (1 vote): MI300X applicability is unvalidated.
aiter/ops/triton/configs/gfx942/triton/moe/a16w4/DEFAULT.json Defines eight gfx942 Triton tuning entries.
Review details

Suppressed comments (1)

aiter/ops/triton/moe/moe_op_gemm_a16w4.py:98

  • [inferred] The lookup keys only on get_arch(), so this table applies to every gfx942 device, while the supplied measurements cover only MI325X. Because MI300X shares gfx942 but has different memory bandwidth, these tiles may become a throughput regression there even though the path is enabled unconditionally. Author must validate the table on MI300X or provide a justified device-specific rollout before applying it to all gfx942 devices.
    tuned = get_moe_dispatch("A16W4", get_arch(), "triton").get(
        f"bm{block_m}_n{n}_k{k}"
    )
  • Files reviewed: 2/2 changed files
  • Comments generated: 1
  • Review effort level: Lite

💡 Configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

Comment thread aiter/ops/triton/moe/moe_op_gemm_a16w4.py
@akii96
akii96 force-pushed the aakif/a16w4-moe-tuned-dispatch-gfx942 branch 2 times, most recently from c411de2 to 147a54c Compare September 19, 2026 09:15
@akii96

akii96 commented Sep 19, 2026

Copy link
Copy Markdown
Contributor Author

Pushed a fix after the last CI run came back with 11 failures, all of them in the new resolver test. Tracing them led to a gap in shared moe_config_utils: get_moe_dispatch() takes an arch argument but never forwards it to resolve_config_dir(), so arch only keyed the lru_cache while the table kept resolving against whatever arch was actually running. The test patches get_arch to gfx942 so it can run anywhere, but that patch was effectively ignored so on my MI325X the running arch is gfx942 so it passed locally, while on CI's non-gfx942 runner no a16w4 table was found, the lookup returned {}, and all eight measured tiles fell back to stock defaults. Forwarding the arch fixes it

@akii96

akii96 commented Sep 21, 2026 •

Copy link
Copy Markdown
Contributor Author

Hi @Boss2002n Could you please take a look when you get a chance? This is ready for review and I’d like to get it merged soon as currently this moe backend is performing worse than trition unfused on gfx942. I have tried to follow the existing A8W4 dispatch pattern and this gives a sizeable+14.9% E2E output throughput as measured on MI325X. Thanks!

I saw that it was added to some board but is it so that the items are reviewed in some order? I am relatively newbie to AITER PRs so dont have full context on the board so decided to send a ping 😅

@maeehart

Copy link
Copy Markdown
Contributor

@vgokhale @brunomazzottiamd can you review this? vLLM's aiter_triton_mxfp4_bf16 MoE backend runs this a16w4 GEMM for deepseek-ai/DeepSeek-V4.1-Flash on gfx942. Main has no gfx942 a16w4 table, so every gfx942 prefill shape runs the CDNA4 tile (block_k=256, block_n=512). The table only changes the 8 listed prefill shapes, decode keeps the existing defaults, and CI is green. We see a similar gain on MI325X with a gfx942 prefill tile for this model. A prefill expert GEMM goes from about 11.6 ms to 3.1 ms, so this PR is important for us.

@vgokhale

Copy link
Copy Markdown
Contributor

Review: PR #5667 — a16w4 MoE GEMM gfx942 tuned config

The config table and wrapper wiring are good: DEFAULT.json lands in the correct configs/gfx942/triton/moe/a16w4/ tree, resolution goes through the standard get_moe_dispatch → resolve_config_dir path, and the wrapper does config-first with a clean fall-through to the stock heuristic. The arch=arch plumbing in get_moe_dispatch is a sensible addition.

My concern is test_moe_gemm_a16w4_config.py. I think it's substantially over-built for what this PR needs, and it sets a precedent no other tuned kernel follows.

What actually needs testing here

There is one real gap: the existing numerics test (test_moe_gemm_a16w4.py::test_op) skips unless arch_info.is_fp4_avail() (gfx950/gfx1250), so the new gfx942 table ships un-exercised. That justifies a narrow check — "the tuned entries resolve to the kernel on gfx942" — nothing more.

What the test actually does

Of the six test functions, only two are about this config:

  • test_table_matches_measured_tiles / test_measured_tile_reaches_the_kernel — verify the shipped table equals the measured tiles and reaches the kernel. Keep the essence of these (arguably one suffices).

The other four are testing the shared dispatch framework, not the a16w4 table:

  • test_decode_block_m_untouched, test_unlisted_prefill_shape_falls_back, test_other_arch_unaffected — these assert get_moe_dispatch / get_kernel_config_triton fall back to the stock heuristic on a miss and don't leak across archs. That behavior is identical for a16w4, a4w4, a8w4, and every future table.
  • test_block_k_64_pairs_with_nonkdim_32 — a property of the config space, not the shipped values.

Roughly half the file (_UNTUNED_ARCH, _stock_config, the on_gfx942 fixture, the get_moe_dispatch.cache_clear() dance, the _Routing mock) exists only to support those framework tests. That's the general-purpose testing we don't want in a per-kernel config PR.

No other kernel does this

  • a4w4 and a8w4 use the same get_moe_dispatch pattern and have no config-resolution test at all — just their numerics tests. This is the only *_config.py in the moe test dir.
  • The established convention is to validate a tuned table implicitly through numerics: e.g. test_gemm_a8w8.py calls get_gemm_config(...), runs the kernel with the resolved config, and checks the output. Nobody asserts "JSON == measured tuples" or hand-tests fallback/arch-scoping.

So this introduces a bespoke per-kernel config-test pattern with no precedent, and inconsistently: if a16w4 needs it, a4w4/a8w4 need it too. Either the framework is trusted (this is unnecessary) or it needs testing once, centrally (this is the wrong place).

Suggested direction

  1. For the a16w4 gap: extend the existing numerics test to run a gfx942 resolution/compile smoke over the tuned shapes, matching how a4w4/a8w4 are already covered — rather than a standalone 154-line file. If you want an explicit "table == measured" pin, keep just that one assertion (it's the one genuinely a16w4-specific, anti-tautology check).
  2. For the framework behavior (fallback on miss, arch-scoping, and the new arch=arch resolution — the one actually-new behavior in this PR): put it in a single test_moe_config_utils.py for get_moe_dispatch, parametrized over the shipped moe tables. Test the contract once, not re-implemented in every future config PR.

Net: the table is fine; the test is testing shared plumbing through one kernel's keyhole. Trim it to the a16w4-specific check and move the dispatch-contract coverage to the framework, so we don't set a heavy per-kernel precedent for something the numerics tests already cover everywhere else.

@lburzawa

Copy link
Copy Markdown
Contributor

Instead of standalone UT we can just extend the current a16w4 UT to cover gfx942. If you comment out the is_fp4_available skip and run the a16w4 UTs on gfx942 does everything pass?

@akii96

akii96 commented Sep 26, 2026 •

Copy link
Copy Markdown
Contributor Author

Thanks a lot for the comments and feedbacks, now pushed bf88ac429, changelog here:

  • Deleted the standalone config test (154 lines)
  • Reverted the shared arch=arch change
  • Added one numerics test covering the 8 tuned shapes on gfx942

Since there was a lot of feedback 😅 , showing a quick action points from me on each of these

Feedback Action points from me
@vgokhale -> config test is over-built, no other kernel does this Deleted it
@vgokhale -> framework testing doesn't belong in a per-kernel PR Dropped, nothing shared left
@vgokhale -> validate the table through numerics like everyone else One test in the existing file, cases generated from the JSON
@vgokhale -> the arch=arch change Reverted, every caller already passes the running arch
@lburzawa -> do the a16w4 UTs pass on gfx942 with the skip off? Yes and now 728 passed, 528 skipped, 0 failed on MI325X

Happy to expand on any of them more or further refine this PR!

@lburzawa one small heads up though! The existing shapes never hit the tuned N,K or block_m=64, so with the skip off none of the 8 entries actually run. Suggest we keep both tests, since yours covers the kernel and the 8 cases cover the table.

@lburzawa

Copy link
Copy Markdown
Contributor

@akii96 Thanks for the changes. The tuned table can become large with time so running every case might result in long CI times in the future. Instead please add the shapes you care about to existing a16w4 UTs and remove the skip for gfx942. To calculate M to use in test cases based on block_m use this formula: block_m = ceil(M * num_experts_active / num_experts_total).

@akii96

akii96 commented Sep 29, 2026 •

Copy link
Copy Markdown
Contributor Author

@lburzawa Moved the 8 shapes into the existing test as normal cases and turned the gfx942 skip off, so the number of cases stays fixed as the table grows. Thanks again for guiding with the UTs! I will track the CI and see if anything pops up and address it immediately!

Edit: One small note rather than removing the arch check I widened it to is_fp4_avail() or gfx942, since dropping it entirely would also run archs the kernel doesn't support. Happy to remove it outright if you'd prefer.

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Copilot review overview

🟡 Changes recommended

The test duplicates all JSON tuning values, creating a second source of truth that must be removed.

Review effort: Balanced
Findings: 1 Low severity

Open (1)
Resolved since last review (1)

Comment thread op_tests/triton_tests/moe/test_moe_gemm_a16w4.py Outdated
@akii96

akii96 commented Sep 29, 2026

Copy link
Copy Markdown
Contributor Author

⚠️ Asked AI assistance on the CI failures:

The red shards are unrelated to this PR. Every failure is in test_pa_mqa_logits_mxfp4.py and test_rope_mxfp4.py, which both go through paged_mxfp4_mqa_logits. That kernel asserts get_arch() == "gfx950", so it fails on the MI300X runners, and those shards are red on main too. Our test is in shard 6, which passed on both MI300X and MI35X.

Comment thread op_tests/triton_tests/moe/test_moe_gemm_a16w4.py Outdated
lburzawa
lburzawa previously approved these changes Sep 29, 2026
nsusanto
nsusanto previously approved these changes Sep 29, 2026

@nsusanto nsusanto left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

LGTM

Comment thread op_tests/triton_tests/moe/test_moe_gemm_a16w4_config.py Outdated
@nsusanto
nsusanto force-pushed the aakif/a16w4-moe-tuned-dispatch-gfx942 branch from e047bc5 to 84b55ce Compare September 30, 2026 16:05
@akii96

akii96 commented Oct 1, 2026

Copy link
Copy Markdown
Contributor Author

@Boss2002n FYI, the remaining MI300X failures come from main and not this PR. Once the fixes in #5958 and #5984 land, CI should clear up. Thanks for tracking this PR 🙏

@nsusanto
nsusanto force-pushed the aakif/a16w4-moe-tuned-dispatch-gfx942 branch from 1f541cf to 4ca3a30 Compare October 1, 2026 15:27
akii96 added 6 commits October 1, 2026 13:17
get_kernel_config_triton hardcodes block_k=256/block_n=512/num_stages=1
for every arch. That fits CDNA4's 160 KiB of LDS, not CDNA3's 64 KiB, so
the gfx942 prefill tile runs at very low occupancy.

Consult get_moe_dispatch("A16W4", ...) before those defaults, as
moe_op_gemm_a8w4 does, and ship a gfx942 table for DeepSeek-V4.1-Flash at
TP4 and TP8. Arches with no table get {} and are unaffected; on gfx942
only the eight listed shapes change. Decode is left alone: one
(block_m, N, K) key would cover 1-1024 tokens, where the stock path is
m-adaptive and the measured optimum shifts across the range.

test_moe_gemm_a16w4.py skips unless arch_info.is_fp4_avail(), which is
gfx950/gfx1250 only, so it cannot cover this table. Add a resolver test
that pins the measured tiles independently of the shipped JSON and runs
on any arch.

MI325X: 3.67-4.22x on the MoE GEMMs at block_m=128, +14.9% output
throughput and -19.6% TPOT end to end (65536 in / 512 out, conc 8, TP4).

Signed-off-by: Aakif Nawaz <aakif.nawaz@amd.com>
get_moe_dispatch takes an arch argument but drops it: the directory is
built by resolve_config_dir() from the *running* arch, so arch only keys
the lru_cache. The parameter therefore promises a control it does not
deliver, and a caller that resolves a table for an arch other than the
one it is running on silently gets that other arch's table, or {}.

resolve_config_dir() already accepts an arch override and
mhc_config_utils passes it; pass it here too.

This is a no-op in production: all five call sites (A16W4, A8W4 triton
and gluon, A4W4) already pass the running arch, so the resolved
directory is unchanged. Only callers that deliberately override see a
difference.

It does fix CI for test_moe_gemm_a16w4_config.py. Those tests patch
get_arch to gfx942 so the gfx942 table resolves on any host; with arch
dropped the patch moved the cache key only, the lookup fell back to the
runner's arch, found no a16w4 table and returned {}, and all eight
measured tiles read back as the stock defaults. It passed on an MI325X,
where the running arch happens to be the one being asserted.

Also clear the lru_cache around the fixture and the untuned-arch probe
in _stock_config: get_moe_dispatch is cached on
(config_name, arch, backend), so without it the suite passes in
declaration order but not under reordering.

Verified on MI325X (gfx942): 25 passed on the real host, and 25 passed
with arch_info.get_arch faked to a non-gfx942 value, which reproduced
the 11 CI failures test-for-test beforehand.
The standalone resolver test asserted shared dispatch behaviour through one
kernel's keyhole, which no other tuned kernel does. Replace it with a single
numerics test in the existing file, and revert the shared-code change it
needed.

test_op skips unless is_fp4_avail() (gfx950/gfx1250), so nothing exercised
the gfx942 table. The kernel carries no fp4 gate and runs on gfx942, so the
entries can be covered there directly: one case per shipped key,
parametrized off the JSON so the test cannot drift from the table.

Each case asserts selection as well as numerics. A key no real shape
produces would fall back to the stock tile and still compute the right
answer, so numerics alone cannot catch a dead entry. The table load is
required rather than optional for the same reason: a missing file would
collect zero cases and report green.

get_moe_dispatch no longer forwards arch to resolve_config_dir. Every
caller passes the running arch, so it was a no-op at runtime that existed
only for the deleted test's monkeypatch.

Verified on MI325X (gfx942, ROCm 6.4.2): 8 passed; worst max_err 0.0070
against maxtol 0.4, worst rms_err 0.00002 against rmstol 0.04.

Signed-off-by: Aakif Nawaz <aakif.nawaz@amd.com>
block_n=256 with block_k=256 needs 67584 B of LDS at block_m=64 (32 KiB A
+ 32 KiB packed B + 2 KiB mx scales), over gfx942's 65536 B limit, so
bm64_n1024_k5120 and bm64_n1536_k5120 failed to launch with OutOfResources.

They were measured under triton 3.7.1, which accepted them; 3.8.0 is what
CI installs and it rejects the launch. Re-tuned both under 3.8.0 on the
same MI325X, sweeping only tiles that fit:

  bm64_n1024_k5120  bn=256 bk=256 -> bn=128 bk=256 nkd=16 wpe=2  (50176 B)
  bm64_n1536_k5120  bn=256 bk=256 -> bn=128 bk=128 nkd=16 wpe=2  (25088 B)

Both are the fastest fitting tile for their shape. The other six entries
are unchanged.

Verified on MI325X (gfx942) under triton 3.8.0: 8 passed. Worst max_err
0.0070 against maxtol 0.4, worst rms_err 0.00002 against rmstol 0.04.

Signed-off-by: Aakif Nawaz <aakif.nawaz@amd.com>
The tuned entries were covered by a dedicated test parametrized off the
shipped JSON, so the case count grew with the table. Move the eight shapes
into test_op as plain Case rows and widen the arch gate so gfx942 runs
them; the count is now fixed. gfx1200/gfx1201 stay skipped, the kernel has
no support there.

Keep one selection check: a stock tile computes the same answer as a tuned
one, so numerics alone cannot tell whether an entry was reached. A
deliberately wrong tile passes all 48 numerics variants of a case.

Verified on gfx942 under triton 3.8.0: 1153 passed, 576 skipped.

Signed-off-by: Aakif Nawaz <aakif.nawaz@amd.com>
Signed-off-by: Aakif Nawaz <aakif.nawaz@amd.com>
@nsusanto
nsusanto force-pushed the aakif/a16w4-moe-tuned-dispatch-gfx942 branch from 4ca3a30 to 44d76da Compare October 1, 2026 17:17
@akii96

akii96 commented Oct 2, 2026 •

Copy link
Copy Markdown
Contributor Author

Since this PR is time-sensitive for us, I took a look at the intermittent MI300X Shard 7 failure (test_batched_gemm_a8w8 memory access fault, also seen on main) and put up a 2 line small fix in #6082. Happy to adjust it if needed. Once it lands, I'll update this branch from main.

cc @Boss2002n

@Boss2002n

Copy link
Copy Markdown
Contributor

Since this PR is time-sensitive for us, I took a look at the intermittent MI300X Shard 7 failure (test_batched_gemm_a8w8 memory access fault, also seen on main) and put up a 2 line small fix in #6082. Happy to adjust it if needed. Once it lands, I'll update this branch from main.

cc @Boss2002n

@akii96 Thank you 😃

@Boss2002n Boss2002n left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

LGTM otherwise

Comment thread op_tests/triton_tests/moe/test_moe_gemm_a16w4.py Outdated
Cover block_m=128 and block_m=64 with the n1536/k5120 shape instead of all
eight table entries, cutting the added test_op cases from 384 to 96.

Signed-off-by: Aakif Nawaz <aakif.nawaz@amd.com>
@akii96
akii96 dismissed stale reviews from lburzawa and nsusanto via b59cdb0 October 2, 2026 20:59
@akii96

akii96 commented Oct 2, 2026

Copy link
Copy Markdown
Contributor Author

@Boss2002n Trimmed it to 2 cases, one per tuned block_m (128 and 64), in b59cdb0. The new commit dismissed the earlier approvals however. Once the CI passes could you help get this merged ? Thanks so much!

@Boss2002n Boss2002n left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

LGTM!

@zufayu
zufayu requested review from a team and Dewei-Wang-sh October 3, 2026 00:36
@Boss2002n
Boss2002n merged commit 394cc86 into ROCm:main Oct 3, 2026
76 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

7 participants