Skip to content

[FlyDSL] Optimize MI308 MoE decoding (3/3) - #5973

Merged
coderfeli merged 19 commits into
ROCm:mainfrom
luocheng25:luocheng/moe_gemm_308_opt3
Oct 29, 2026
Merged

coderfeli merged 19 commits into
ROCm:mainfrom
luocheng25:luocheng/moe_gemm_308_opt3

Conversation

@luocheng25

@luocheng25 luocheng25 commented Sep 30, 2026 •

Copy link
Copy Markdown
Contributor

Summary

Part 3/3, follows #5795 and #5932 (both merged). Optimize MoE decoding (1–256 tokens) on MI308X/gfx942. Earlier revisions also covered gfx950 MXFP4/SiTUv2 decoding; that part is dropped and this PR is gfx942-only.

Changes

  • Direct decoding for 2–8 tokens (idea from @coderfeli). Routes run straight from topk_ids without sorting, on batched batch-1 kernels (grid over tokens × routes). It is tunable as 16_16_16_False_True; the fifth tile field is optional, so existing config strings keep their meaning, and test_config_strings covers the new flag. Routes with expert ID −1 (padding rows of topk with num_valid_rows, [ASM] [HIP] [FlyDSL] feat: pad-row routing count, custom all_gatherv, MoE quant-sort race fix #6916) are skipped.
  • Fused Down-output clear. The batch-1 Gate/Up kernel zeroes the Down output, removing the separate fill launch for batch 1 and direct decoding.
  • BN128 sorted-decoding tile. 16_128_64 computes 128 output columns per workgroup next to the BN64 16_16_16, halving the workgroups and activation re-reads. Split-K always uses BK64, so no other BN64 tile is offered. Direct decoding is tuned only for 2–8 tokens, and batch 1 only as 16_16_16.
  • Prefill sort and reduction. The Opus aux sort returns each route's sorted row, replacing the invert_sorted_ids kernel. Routes the sort drops (repeated expert IDs of a token, −1 padding) are left out of the final sum, and per-tensor FP8 zeroes the Gate/Up output so they cannot raise the Down input absmax. The sort no longer clears the output, which sorted_sum writes in full.
  • Retune the decoding rows of the six model CSVs (below).

Performance

MI308X (gfx942)

MI308X/gfx942 (80 CUs, PTL enabled), ROCm 7.2.4, FlyDSL 0.4.0, default MoE sorting. Measured on 7b58f3a457; baseline is main 2bafed4728 (the merge base) with its shipped CSVs. The first three value columns use the default rounding (AITER_FLYDSL_MOE_BF16_RTA_SIMPLIFIED unset), the RTA columns AITER_FLYDSL_MOE_BF16_RTA_SIMPLIFIED=1 on both trees. Values are the per-shape full-MoE GPU kernel-time sums that --run_config reports (10 warmups, 51 iterations, rotating inputs, IQR filtering); each is the geometric mean over shapes of the median of three alternating-order rounds. Speedup is baseline / PR3 − 1; these are not full-model throughput claims.

Batch Shapes Baseline us PR3 us Speedup Baseline us (RTA) PR3 us (RTA) Speedup (RTA)
1 12 19.979 18.339 +8.94% 20.050 18.038 +11.16%
2 12 38.330 26.704 +43.54% 37.979 26.364 +44.06%
4 12 55.539 43.886 +26.55% 55.089 43.169 +27.61%
8 12 84.745 77.000 +10.06% 84.141 75.762 +11.06%
1/2/4/8 combined 48 43.572 35.867 +21.48% 43.345 35.314 +22.74%

Batch 1 keeps 16_16_16_False; its gain comes from the batch-1 kernel changes alone.

Tokens Shapes Baseline us PR3 us Speedup Baseline us (RTA) PR3 us (RTA) Speedup (RTA)
16–256 60 261.930 258.197 +1.45% 260.903 256.043 +1.90%
1–256 (all decoding) 108 118.025 107.386 +9.91% 117.494 106.153 +10.68%
>256 (CSV unchanged) 94 1836.385 1821.785 +0.80% 1790.142 1778.693 +0.64%
All 202 423.314 400.972 +5.57% 417.312 394.089 +5.89%

Runtime recommendation: set AITER_FLYDSL_MOE_BF16_RTA_SIMPLIFIED=1. The decoding rows are tuned with it, and with this PR it is 1.16% faster than the default rounding on the decoding rows (1.75% on all rows). Simplified RTA rounds BF16 halfway cases away from zero instead of to even and does not preserve NaN payloads; op_tests/test_flydsl_moe_gfx942.py passes with error 0 either way.

Rows above 256 tokens keep main's kernels. The 71 FlyDSL prefill rows are +1.09% (+0.89% with RTA), mostly because the sort no longer clears the output; the 23 CK and ASM prefill rows, whose code is unchanged, move by −0.07% (−0.10%), which is run-to-run noise.

Selection changes. 58 of 202 rows change kernel.

  • 2–8 tokens: 34 rows move to direct decoding (30 from BN64, 3 from CK 2-stage, 1 from ASM 1-stage).
  • 16–256 tokens: 24 rows move to BN128 (15 from CK 2-stage, 9 from BN64). On the 24 changed rows above 8 tokens the speedup is +3.48% (+4.62% with RTA); 22 are faster and the other 2 are within 0.9%.
  • Rows above 256 tokens are unchanged.

A row tuned at M tokens also serves M/2+1 to M−1 tokens (get_padded_M). Every token count the retuned rows serve, 1476 points from 2 to 256 tokens, was measured as well: +6.4% on average, worst −1.3%, none more than 2% slower than main.

Tuning. Main's tuned CSVs were the starting point and only decoding shapes (≤256 tokens, 108 of 202) were retuned. The whole-MoE stage (--e2e_tune) ran with the environment of #5932 (TUNE_ONLY=flydslv2,cktile,flydsl,asm, AITER_FMOE_TUNE_EXCLUDE_KERNELS=fmoe_stage1, simplified BF16 RTA). Each decoding shape was then confirmed by a one-off script that re-timed main's selection and every eligible whole-MoE config over three interleaved rounds and kept the lowest median. Three picks that were more than 2% slower than main with the default rounding keep main's selection, and so do seven BN128 picks that were more than 2% slower than main at a token count they serve, or less than 1% faster on average.

Reproduce (MI308X, gfx942, 80 CUs)

Run on this PR. For the baseline, run the --run_config line on main (2bafed4728).

T=csrc/ck_gemm_moe_2stages_codegen/gemm_moe_tune.py
C=aiter/configs/model_configs
for m in hunyuan3_fp8_per_tensor minimax_m3_fp8_ptpc qwen3_5_35b_fp8_ptpc qwen3_5_397b_fp8_ptpc qwen38_flash_next_bf16 qwen38_flash_next_fp8_ptpc; do
  o=/tmp/${m}_tuned_fmoe.csv
  git show 2bafed4728:$C/${m}_tuned_fmoe.csv > $o                                 # main's selections
  awk -F, 'NR == 1 || $1 <= 256' $C/${m}_untuned_fmoe.csv > /tmp/${m}_decode.csv  # decoding shapes
  a="--mp 1 --warmup 10 --iters 51 --all"
  AITER_FLYDSL_MOE_BF16_RTA_SIMPLIFIED=1 TUNE_ONLY=flydslv2,cktile,flydsl,asm AITER_FMOE_TUNE_EXCLUDE_KERNELS=fmoe_stage1 \
    python3 $T -i /tmp/${m}_decode.csv -o $o $a --e2e_tune                        # whole-MoE FlyDSL configs
  python3 $T -i $C/${m}_untuned_fmoe.csv -o $C/${m}_tuned_fmoe.csv $a --run_config $C/${m}_tuned_fmoe.csv  # per-shape latency, with accuracy check
done

Testing (this PR):

export AITER_FLYDSL_MOE_BF16_RTA_SIMPLIFIED=1
# method 1
python3 op_tests/test_moe_2stage.py --no-legacy --csv-filter impl__flydsl_gfx942__
# method 2
python3 -m unittest op_tests.tuning_tests.test_config_shape_collision -v
C=aiter/configs/model_configs
TUNE_TEST_FAMILY=fmoe \
TUNE_TEST_CONFIG=$C/hunyuan3_fp8_per_tensor_tuned_fmoe.csv:$C/minimax_m3_fp8_ptpc_tuned_fmoe.csv:$C/qwen3_5_35b_fp8_ptpc_tuned_fmoe.csv:$C/qwen3_5_397b_fp8_ptpc_tuned_fmoe.csv:$C/qwen38_flash_next_bf16_tuned_fmoe.csv:$C/qwen38_flash_next_fp8_ptpc_tuned_fmoe.csv \
python3 -m unittest op_tests.tuning_tests.test_run_config.TestRunConfigCustom -v
# method 3
python3 op_tests/test_flydsl_moe_gfx942.py

@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 (added automatically when gfx942 configs change); main branch always runs both MI35X and MI300X
ci:triton-355 Run the full Triton test suite on MI35X, not only the tests the change affects
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 5973 --add-label <label>

One backend per PR:
A PR changes one kernel backend: [Triton/Gluon] (Triton and Gluon count as one), [HIP], [ASM], [CK], [OPUS] or [FlyDSL]. If the title ends up with two backend tags, split the PR -- as stacked pull requests when one part cannot merge without the other.

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 stop the title rewrites; labels stay in sync either way.

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

A critical reduction-stride issue remains, alongside validation and architecture-diagnostic corrections.

Review effort: Lite
Findings: 1 High severity

Open (1)
What changed in this PR

Optimizes small-batch FlyDSL MoE decoding for gfx942/gfx950 with fused clearing, new kernel paths, and refreshed tuning configurations.

Changes:

  • Adds direct batch1-style routing and compact Down execution.
  • Adds gfx950 MXFP4/SiTUv2 and interleaved decoding support.
  • Updates tuning logic, dispatch, and model CSV configurations.
File Summary
csrc/​ck_gemm_moe_2stages_codegen/​gemm_moe_tune.py Updates tuning parameters and configuration formats.
aiter/​ops/​flydsl/​kernels/​moe_gemm_2stage/​quant.py Adds cached quantization kernels.
aiter/​ops/​flydsl/​kernels/​moe_gemm_2stage/​moe_reduce.py Adds routing reduction kernels.
aiter/​ops/​flydsl/​kernels/​moe_gemm_2stage/​gemm2.py Adds baseline Down kernels.
aiter/​ops/​flydsl/​kernels/​moe_gemm_2stage/​gemm2_common.py Adds shared Down-kernel utilities.
aiter/​ops/​flydsl/​kernels/​moe_gemm_2stage/​gemm2_8x1_compact.py Adds compact task-table scheduling.
aiter/​ops/​flydsl/​kernels/​moe_gemm_2stage/​__init__.py Exposes the reorganized kernel APIs.
aiter/​ops/​flydsl/​kernels/​moe_gemm_2stage_gfx942_utils.py Removes superseded utilities.
aiter/​ops/​flydsl/​fused_moe_gfx942.py Extends dispatch, validation, and execution paths.
aiter/​ops/​flydsl/​__init__.py Registers gfx950 support.
aiter/​fused_moe.py Extends supported interleaved configurations.
aiter/​configs/​model_configs/​qwen3_5_397b_fp8_ptpc_tuned_fmoe.csv Refreshes tuned selections.
aiter/​configs/​model_configs/​qwen3_5_35b_fp8_ptpc_tuned_fmoe.csv Refreshes tuned selections.
aiter/​configs/​model_configs/​qwen3_5_125b_fp8_ptpc_untuned_fmoe.csv Adds FP8 tuning inputs.
aiter/​configs/​model_configs/​qwen3_5_125b_fp8_ptpc_tuned_fmoe.csv Adds FP8 tuned configurations.
aiter/​configs/​model_configs/​qwen3_5_125b_bf16_untuned_fmoe.csv Adds BF16 tuning inputs.
aiter/​configs/​model_configs/​qwen3_5_125b_bf16_tuned_fmoe.csv Adds BF16 tuned configurations.
aiter/​configs/​model_configs/​minimax_m3_fp8_ptpc_tuned_fmoe.csv Refreshes tuned selections.
aiter/​configs/​model_configs/​kimik3_a16w4_tuned_fmoe.csv Updates gfx950 decoding selections.
aiter/​configs/​model_configs/​hunyuan3_fp8_per_tensor_tuned_fmoe.csv Refreshes tuned selections.

💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

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 unresolved moderate kernel-compilation issue should be addressed before approval.

Review effort: Lite
Findings: 1 Low severity

Open (1)
Resolved since last review (1)

Comment thread aiter/ops/flydsl/fused_moe_gfx942.py Resolved

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

Critical correctness and compilation issues remain in the Down and compact execution paths.

Review effort: Lite
Findings: 3 High severity

Open (3)
Resolved since last review (1)
Previously missed (1)

In code that hasn't changed since last review

Low severity Update BLOCK_N and BLOCK_K validation messages

aiter/​ops/​flydsl/​fused_moe_gfx942.py:89

These checks accept BLOCK_N=16 and BLOCK_K=16, but the rejection text says only BN64/BN128 and BK64. When an invalid config hits these branches, the diagnostic contradicts the actual accepted configuration space and can mislead tuning/debugging; include the 16 variants in both messages.

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

Critical LDS overflow and moderate kernel configuration and cache-growth issues remain unresolved.

Review effort: Lite
Findings: 1 High severity · 1 Low severity

Open (2)
Resolved since last review (3)

Comment thread aiter/ops/flydsl/fused_moe_gfx942.py Resolved

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.

Warning

Copilot couldn't run its full agentic review because it didn't start before the timeout. Make sure your repository has a runner available, or add a copilot-code-review.yml file specifying one with the runs-on attribute. See the docs for more details.

Copilot review overview

Review effort: Lite
Findings: 1 High severity · 3 Medium severity

Open (4)
Resolved since last review (2)

Comment thread aiter/ops/flydsl/fused_moe_gfx942.py Resolved
Comment thread aiter/ops/flydsl/fused_moe_gfx942.py Resolved

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 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.

🔵 Needs a closer look

A moderate unresolved validation issue can mark untuned direct-decoding tile configurations as valid, and the performance-sensitive kernel changes warrant final human review.

No open issues 🎉

Review effort: Lite

Copilot AI lite review requested due to automatic review settings October 25, 2026 09:42

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.

🔵 Needs a closer look

Four unresolved moderate findings remain, including three slower tuned selections and missing dispatch alignment validation.

No open issues 🎉

Review effort: Lite

Comment thread aiter/ops/flydsl/fused_moe_gfx942.py Resolved
Comment thread aiter/ops/flydsl/fused_moe_gfx942.py Resolved
@Bernard-Liu

Copy link
Copy Markdown
Contributor

The performance results cannot be tied to the final HEAD:

  • No measured SHA is given. The last two commits (c8e8158, 4641dd7) changed the prefill sort/reduce path after the CSV retune, so it is unclear whether the 71 published prefill rows were measured with the current code.
  • The description reports FlyDSL 0.3.4.1, but requirements.txt has pinned 0.4.0 since [FlyDSL] [CI] [Build] Bump FlyDSL to 0.4.0 #6424, which predates the cfc37f9a1a baseline.
  • All tuning and benchmarking used AITER_FLYDSL_MOE_BF16_RTA_SIMPLIFIED=1, while the default is 0.
  • Routing is uniform random (randn scores), which favors direct decoding over sorted expert grouping. Only power-of-two token buckets were measured, while 3, 5–7 and 9–15 tokens also resolve to these configs at runtime.
  • Only per-group geometric means are reported, and CI has no gfx942 performance check.

…tput

Since ROCm#6916, routing gives rows past num_valid_rows expert -1 and weight 0
and expects sorting to drop them.
- Batch-1 and direct-decoding kernels read topk_ids without sorting; they now
  skip -1 routes instead of reading weights and scales in front of expert 0.
- Per-tensor prefill zeroes the Gate/Up output: its Down absmax reads every
  route row, including routes sorting dropped (merged repeated IDs, -1 ids).

Tests: pad_rows routing (-1 ids, zero weights). Weights and scales sit behind
a NaN expert and the Gate/Up output starts as inf, so reading expert -1 or a
skipped row fails the check. New edge cases: per-tensor prefill and B2 direct
decoding with pad rows.
Decoding rows (<= 256 tokens) start from main's selections. --e2e_tune ran with
TUNE_ONLY=flydslv2,cktile,flydsl,asm, AITER_FMOE_TUNE_EXCLUDE_KERNELS=fmoe_stage1
and AITER_FLYDSL_MOE_BF16_RTA_SIMPLIFIED=1 on MI308X with PTL enabled
(VECTOR,F8); each shape then keeps the lowest median of main's selection and
every eligible FlyDSL config over three interleaved rounds. Three picks that
are slower than main with the default rounding keep main's selection. 65 rows
change kernel versus main; rows above 256 tokens are main's.
Copilot AI lite review requested due to automatic review settings October 27, 2026 13:39

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

A critical regression test is recursive, and several shipped direct-decoding selections violate the stated tuning safeguards or accept misleading tile configurations.

2 open issues

Review effort: Lite

Comment thread op_tests/test_flydsl_moe_gfx942.py Resolved
Comment thread aiter/ops/flydsl/fused_moe_gfx942.py Resolved
@luocheng25

luocheng25 commented Oct 27, 2026 •

Copy link
Copy Markdown
Contributor Author

The performance results cannot be tied to the final HEAD:

  • No measured SHA is given. The last two commits (c8e8158, 4641dd7) changed the prefill sort/reduce path after the CSV retune, so it is unclear whether the 71 published prefill rows were measured with the current code.
  • The description reports FlyDSL 0.3.4.1, but requirements.txt has pinned 0.4.0 since [FlyDSL] [CI] [Build] Bump FlyDSL to 0.4.0 #6424, which predates the cfc37f9a1a baseline.
  • All tuning and benchmarking used AITER_FLYDSL_MOE_BF16_RTA_SIMPLIFIED=1, while the default is 0.
  • Routing is uniform random (randn scores), which favors direct decoding over sorted expert grouping. Only power-of-two token buckets were measured, while 3, 5–7 and 9–15 tokens also resolve to these configs at runtime.
  • Only per-group geometric means are reported, and CI has no gfx942 performance check.

The description now shows results re-measured on 6f9f5f9557 against main 2bafed4728 (the merge base), with FlyDSL 0.4.0. That SHA includes c8e8158 and 4641dd7, so all 202 rows, including the prefill rows, were measured with the current sort/reduce path. The later af98038f0 only rejects direct-decoding configs with tiles other than 16_16_16, so the shipped configs and kernels are unchanged. The description covers both AITER_FLYDSL_MOE_BF16_RTA_SIMPLIFIED=1 and the default (0); the tables below use the default rounding.

No retuned row is more than 2% slower than main.

Per-shape results, uniform routing (202 rows)
Model M inter_dim E main kernel PR kernel main µs PR µs Speedup
Hunyuan3 FP8 per-tensor 1 192 192 FlyDSL 16_16_16_False same 16.27 15.35 +6.0%
Hunyuan3 FP8 per-tensor 2 192 192 FlyDSL 16_16_16_False FlyDSL 16_16_16_False_True 30.60 20.37 +50.2%
Hunyuan3 FP8 per-tensor 4 192 192 FlyDSL 16_16_16_False FlyDSL 16_16_16_False_True 40.94 30.64 +33.6%
Hunyuan3 FP8 per-tensor 8 192 192 FlyDSL 16_16_16_False FlyDSL 16_16_16_False_True 59.30 52.48 +13.0%
Hunyuan3 FP8 per-tensor 16 192 192 FlyDSL 16_16_16_False FlyDSL 16_128_64_False 91.10 90.32 +0.9%
Hunyuan3 FP8 per-tensor 32 192 192 FlyDSL 16_16_16_False FlyDSL 16_128_64_False 128.98 129.38 -0.3%
Hunyuan3 FP8 per-tensor 64 192 192 FlyDSL 16_16_16_False FlyDSL 16_128_64_False 152.92 147.13 +3.9%
Hunyuan3 FP8 per-tensor 128 192 192 FlyDSL 16_16_16_False FlyDSL 16_128_64_False 187.59 175.65 +6.8%
Hunyuan3 FP8 per-tensor 256 192 192 CK 256x16x64x256 / 64x16x64x64 FlyDSL 16_128_64_False 235.95 223.66 +5.5%
Hunyuan3 FP8 per-tensor 512 192 192 FlyDSL 64_128_256_True:1x4_64x256:128 same 364.54 354.99 +2.7%
Hunyuan3 FP8 per-tensor 1024 192 192 FlyDSL 64_128_256_True:1x4_64x256:128 same 391.89 383.14 +2.3%
Hunyuan3 FP8 per-tensor 2048 192 192 FlyDSL 64_128_256_True:1x4_64x256:128 same 580.59 579.40 +0.2%
Hunyuan3 FP8 per-tensor 4096 192 192 FlyDSL 64_128_256_True:8x1_compact:128 same 869.97 868.83 +0.1%
Hunyuan3 FP8 per-tensor 8192 192 192 FlyDSL 64_128_256_True:8x1_compact:128 same 1479.67 1492.46 -0.9%
Hunyuan3 FP8 per-tensor 16384 192 192 FlyDSL 64_128_256_True:8x1_compact:128 same 2660.54 2689.10 -1.1%
Hunyuan3 FP8 per-tensor 32768 192 192 FlyDSL 64_128_256_True:8x1_compact:128 same 5152.17 5195.29 -0.8%
Hunyuan3 FP8 per-tensor 65536 192 192 FlyDSL 64_128_256_True:8x1_compact:128 same 10251.68 10320.79 -0.7%
Hunyuan3 FP8 per-tensor 131072 192 192 FlyDSL 64_128_256_True:8x1_compact:128 same 20760.10 20937.62 -0.8%
MiniMax-M3 FP8 1 384 128 FlyDSL 16_16_16_False same 21.56 19.64 +9.8%
MiniMax-M3 FP8 1 384 129 FlyDSL 16_16_16_False same 21.46 20.05 +7.0%
MiniMax-M3 FP8 2 384 128 FlyDSL 16_16_16_False FlyDSL 16_16_16_False_True 36.43 27.20 +33.9%
MiniMax-M3 FP8 2 384 129 FlyDSL 16_16_16_False FlyDSL 16_16_16_False_True 38.04 28.03 +35.7%
MiniMax-M3 FP8 4 384 128 FlyDSL 16_16_16_False FlyDSL 16_16_16_False_True 53.40 44.13 +21.0%
MiniMax-M3 FP8 4 384 129 FlyDSL 16_16_16_False FlyDSL 16_16_16_False_True 58.40 52.67 +10.9%
MiniMax-M3 FP8 8 384 128 FlyDSL 16_16_16_False FlyDSL 16_16_16_False_True 82.78 77.00 +7.5%
MiniMax-M3 FP8 8 384 129 CK 128x16x64x128 / 128x16x128x128 FlyDSL 16_16_16_False_True 92.76 92.60 +0.2%
MiniMax-M3 FP8 16 384 128 CK 256x16x128x256 / 128x16x128x128 FlyDSL 16_128_64_False 129.61 126.51 +2.5%
MiniMax-M3 FP8 16 384 129 CK 256x16x64x256 / 128x16x128x128 FlyDSL 16_128_64_False 153.94 152.67 +0.8%
MiniMax-M3 FP8 32 384 128 CK 256x16x128x256 / 128x16x128x128 same 180.51 179.86 +0.4%
MiniMax-M3 FP8 32 384 129 CK 256x16x128x256 / 128x16x128x128 same 221.19 221.19 +0.0%
MiniMax-M3 FP8 64 384 128 CK 256x16x64x256 / 128x16x128x128 same 255.65 255.23 +0.2%
MiniMax-M3 FP8 64 384 129 CK 128x16x64x128 / 128x16x128x128 same 272.36 273.24 -0.3%
MiniMax-M3 FP8 128 384 128 CK 128x16x64x128 / 128x16x128x128 same 297.97 297.66 +0.1%
MiniMax-M3 FP8 128 384 129 CK 256x16x128x256 / 128x16x128x128 same 300.11 299.43 +0.2%
MiniMax-M3 FP8 256 384 128 CK 256x16x128x256 / 128x16x128x128 same 310.10 310.92 -0.3%
MiniMax-M3 FP8 256 384 129 CK 256x16x64x256 / 128x16x128x128 same 336.18 336.72 -0.2%
MiniMax-M3 FP8 512 384 128 CK 256x32x64x128 / 256x32x64x128 same 377.57 377.15 +0.1%
MiniMax-M3 FP8 512 384 129 FlyDSL 64_256_128_True:1x4_64x256:128 same 423.45 427.64 -1.0%
MiniMax-M3 FP8 1024 384 128 FlyDSL 64_256_128_True:1x4_64x256:128 same 458.95 470.50 -2.5%
MiniMax-M3 FP8 1024 384 129 FlyDSL 64_256_128_True:1x4_64x256:128 same 489.31 491.02 -0.3%
MiniMax-M3 FP8 2048 384 128 FlyDSL 64_256_128_True:8x1_compact:128 same 720.60 720.35 +0.0%
MiniMax-M3 FP8 2048 384 129 FlyDSL 64_256_128_True:8x1_compact:128 same 885.39 887.78 -0.3%
MiniMax-M3 FP8 4096 384 128 FlyDSL 64_256_128_True:1x4_64x256:128 same 1087.56 1092.45 -0.4%
MiniMax-M3 FP8 4096 384 129 FlyDSL 64_128_256_True:1x4_64x256:128 same 1300.39 1307.56 -0.5%
MiniMax-M3 FP8 8192 384 128 FlyDSL 64_128_256_True:8x1_compact:128 same 1861.84 1876.13 -0.8%
MiniMax-M3 FP8 8192 384 129 FlyDSL 64_128_256_True:1x4_64x256:128 same 2257.82 2275.23 -0.8%
MiniMax-M3 FP8 16384 384 128 FlyDSL 64_256_128_True:8x1_compact:128 same 3304.04 3323.55 -0.6%
MiniMax-M3 FP8 16384 384 129 FlyDSL 64_256_128_True:8x1_compact:128 same 4031.21 4046.60 -0.4%
MiniMax-M3 FP8 32768 384 128 FlyDSL 64_256_128_True:8x1_compact:128 same 6287.82 6327.21 -0.6%
MiniMax-M3 FP8 32768 384 129 FlyDSL 64_256_128_True:8x1_compact:128 same 7631.15 7673.14 -0.5%
MiniMax-M3 FP8 65536 384 128 FlyDSL 64_256_128_True:8x1_compact:128 same 12283.60 12366.59 -0.7%
MiniMax-M3 FP8 65536 384 129 FlyDSL 64_256_128_True:8x1_compact:128 same 14958.92 15031.15 -0.5%
MiniMax-M3 FP8 131072 384 128 FlyDSL 64_256_128_True:8x1_compact:128 same 24267.75 24362.46 -0.4%
MiniMax-M3 FP8 131072 384 129 FlyDSL 64_256_128_True:8x1_compact:128 same 29715.74 29935.42 -0.7%
Qwen3.8-Flash-Next BF16 1 192 513 FlyDSL 16_16_16_False same 18.93 16.37 +15.6%
Qwen3.8-Flash-Next BF16 2 192 513 FlyDSL 16_16_16_False FlyDSL 16_16_16_False_True 37.13 24.80 +49.7%
Qwen3.8-Flash-Next BF16 4 192 513 FlyDSL 16_16_16_False FlyDSL 16_16_16_False_True 55.41 39.81 +39.2%
Qwen3.8-Flash-Next BF16 8 192 513 FlyDSL 16_16_16_False FlyDSL 16_16_16_False_True 85.77 74.28 +15.5%
Qwen3.8-Flash-Next BF16 16 192 513 FlyDSL 16_16_16_False same 139.12 139.91 -0.6%
Qwen3.8-Flash-Next BF16 32 192 513 FlyDSL 16_16_16_False same 227.45 227.41 +0.0%
Qwen3.8-Flash-Next BF16 64 192 513 FlyDSL 16_16_16_False same 363.37 364.25 -0.2%
Qwen3.8-Flash-Next BF16 128 192 513 FlyDSL 16_16_16_False FlyDSL 16_128_64_False 471.78 454.82 +3.7%
Qwen3.8-Flash-Next BF16 256 192 513 CK 256x32x64x64 / 256x32x64x64 FlyDSL 16_128_64_False 551.96 524.13 +5.3%
Qwen3.8-Flash-Next BF16 512 192 513 CK 256x32x64x128 / 256x32x64x64 same 568.79 567.85 +0.2%
Qwen3.8-Flash-Next BF16 1024 192 513 CK 256x32x64x128 / 256x32x64x64 same 621.41 624.36 -0.5%
Qwen3.8-Flash-Next BF16 2048 192 513 FlyDSL 64_128_128_True same 761.43 764.22 -0.4%
Qwen3.8-Flash-Next BF16 4096 192 513 FlyDSL 64_128_128_True same 1295.40 1292.63 +0.2%
Qwen3.8-Flash-Next BF16 8192 192 513 FlyDSL 64_128_128_True same 2057.13 2025.10 +1.6%
Qwen3.8-Flash-Next BF16 16384 192 513 FlyDSL 64_128_128_True same 3725.26 3733.14 -0.2%
Qwen3.8-Flash-Next BF16 32768 192 513 FlyDSL 64_128_128_True same 6856.19 6847.66 +0.1%
Qwen3.8-Flash-Next BF16 1 320 513 FlyDSL 16_16_16_False same 22.41 21.24 +5.5%
Qwen3.8-Flash-Next BF16 2 320 513 FlyDSL 16_16_16_False FlyDSL 16_16_16_False_True 47.34 35.05 +35.1%
Qwen3.8-Flash-Next BF16 4 320 513 FlyDSL 16_16_16_False FlyDSL 16_16_16_False_True 75.75 61.83 +22.5%
Qwen3.8-Flash-Next BF16 8 320 513 FlyDSL 16_16_16_False FlyDSL 16_16_16_False_True 119.31 111.97 +6.6%
Qwen3.8-Flash-Next BF16 16 320 513 FlyDSL 16_16_16_False FlyDSL 16_128_64_False 192.24 192.31 +0.0%
Qwen3.8-Flash-Next BF16 32 320 513 CK 256x32x64x64 / 256x32x64x64 FlyDSL 16_128_64_False 384.91 349.88 +10.0%
Qwen3.8-Flash-Next BF16 64 320 513 CK 256x32x64x128 / 256x32x64x64 FlyDSL 16_128_64_False 593.96 570.97 +4.0%
Qwen3.8-Flash-Next BF16 128 320 513 CK 256x32x64x64 / 256x32x64x64 FlyDSL 16_128_64_False 778.37 748.97 +3.9%
Qwen3.8-Flash-Next BF16 256 320 513 CK 256x32x64x64 / 256x32x64x64 FlyDSL 16_128_64_False 852.64 846.75 +0.7%
Qwen3.8-Flash-Next BF16 512 320 513 CK 256x32x64x128 / 256x32x64x64 same 895.23 896.06 -0.1%
Qwen3.8-Flash-Next BF16 1024 320 513 CK 256x32x64x64 / 256x32x64x64 same 998.02 998.38 +0.0%
Qwen3.8-Flash-Next BF16 2048 320 513 FlyDSL 64_128_128_True same 1184.01 1176.86 +0.6%
Qwen3.8-Flash-Next BF16 4096 320 513 FlyDSL 64_128_128_True same 2115.75 2116.21 +0.0%
Qwen3.8-Flash-Next BF16 8192 320 513 FlyDSL 64_128_128_True same 3269.60 3270.30 +0.0%
Qwen3.8-Flash-Next BF16 16384 320 513 FlyDSL 64_128_128_True same 5891.08 5870.83 +0.3%
Qwen3.8-Flash-Next BF16 32768 320 513 FlyDSL 64_128_128_True same 12220.64 12197.47 +0.2%
Qwen3.8-Flash-Next BF16 1 640 513 FlyDSL 16_16_16_False same 36.44 35.60 +2.4%
Qwen3.8-Flash-Next BF16 2 640 513 FlyDSL 16_16_16_False FlyDSL 16_16_16_False_True 76.57 61.24 +25.0%
Qwen3.8-Flash-Next BF16 4 640 513 FlyDSL 16_16_16_False FlyDSL 16_16_16_False_True 129.88 116.96 +11.0%
Qwen3.8-Flash-Next BF16 8 640 513 FlyDSL 16_16_16_False same 224.47 225.34 -0.4%
Qwen3.8-Flash-Next BF16 16 640 513 CK 256x32x64x128 / 256x32x64x64 FlyDSL 16_128_64_False 448.81 447.32 +0.3%
Qwen3.8-Flash-Next BF16 32 640 513 CK 256x32x64x64 / 256x32x64x64 FlyDSL 16_128_64_False 830.15 760.56 +9.1%
Qwen3.8-Flash-Next BF16 64 640 513 CK 256x32x64x128 / 256x32x64x64 FlyDSL 16_128_64_False 1233.13 1135.30 +8.6%
Qwen3.8-Flash-Next BF16 128 640 513 CK 256x32x64x128 / 256x32x64x64 FlyDSL 16_128_64_False 1562.40 1466.53 +6.5%
Qwen3.8-Flash-Next BF16 256 640 513 CK 256x32x64x128 / 256x32x64x64 FlyDSL 16_128_64_False 1730.60 1635.99 +5.8%
Qwen3.8-Flash-Next BF16 512 640 513 CK 256x32x64x128 / 256x32x64x64 same 1778.93 1782.60 -0.2%
Qwen3.8-Flash-Next BF16 1024 640 513 CK 256x32x64x64 / 256x32x64x64 same 1891.91 1891.43 +0.0%
Qwen3.8-Flash-Next BF16 2048 640 513 CK 256x64x128x64 / 256x64x64x64 same 2318.82 2308.13 +0.5%
Qwen3.8-Flash-Next BF16 4096 640 513 CK 256x128x128x64 / 256x128x128x64 same 3815.41 3758.80 +1.5%
Qwen3.8-Flash-Next BF16 8192 640 513 CK 256x64x128x64 / 256x64x128x128 same 6302.97 6288.02 +0.2%
Qwen3.8-Flash-Next BF16 16384 640 513 CK 256x64x128x64 / 256x64x128x128 same 13423.41 13429.77 +0.0%
Qwen3.8-Flash-Next BF16 32768 640 513 CK 256x64x128x64 / 256x64x128x128 same 25172.25 25240.11 -0.3%
Qwen3.8-Flash-Next FP8 1 192 513 FlyDSL 16_16_16_False same 14.97 13.72 +9.1%
Qwen3.8-Flash-Next FP8 2 192 513 FlyDSL 16_16_16_False FlyDSL 16_16_16_False_True 30.89 19.25 +60.5%
Qwen3.8-Flash-Next FP8 4 192 513 FlyDSL 16_16_16_False FlyDSL 16_16_16_False_True 41.06 28.90 +42.1%
Qwen3.8-Flash-Next FP8 8 192 513 FlyDSL 16_16_16_False FlyDSL 16_16_16_False_True 60.22 48.12 +25.1%
Qwen3.8-Flash-Next FP8 16 192 513 asm fmoe_bf16_pertokenFp8_g1u1_vs_silu_1tg_32x192 same 90.79 90.34 +0.5%
Qwen3.8-Flash-Next FP8 32 192 513 FlyDSL 16_16_16_False FlyDSL 16_128_64_False 141.65 139.12 +1.8%
Qwen3.8-Flash-Next FP8 64 192 513 FlyDSL 16_16_16_False FlyDSL 16_128_64_False 202.99 197.01 +3.0%
Qwen3.8-Flash-Next FP8 128 192 513 asm fmoe_bf16_pertokenFp8_g1u1_vs_silu_1tg_32x192 same 246.13 245.72 +0.2%
Qwen3.8-Flash-Next FP8 256 192 513 asm fmoe_bf16_pertokenFp8_g1u1_vs_silu_1tg_32x192 same 291.55 296.68 -1.7%
Qwen3.8-Flash-Next FP8 512 192 513 asm fmoe_bf16_pertokenFp8_g1u1_vs_silu_1tg_32x192 same 311.96 316.09 -1.3%
Qwen3.8-Flash-Next FP8 1024 192 513 asm fmoe_bf16_pertokenFp8_g1u1_vs_silu_1tg_32x192 same 349.39 354.53 -1.4%
Qwen3.8-Flash-Next FP8 2048 192 513 FlyDSL 64_128_256_True:1x4_64x256:128 same 503.24 520.26 -3.3%
Qwen3.8-Flash-Next FP8 4096 192 513 FlyDSL 64_128_256_True:1x4_64x256:128 same 919.03 928.18 -1.0%
Qwen3.8-Flash-Next FP8 8192 192 513 FlyDSL 64_128_256_True:1x4_64x256:128 same 1478.67 1479.16 +0.0%
Qwen3.8-Flash-Next FP8 16384 192 513 FlyDSL 64_128_256_True:1x4_64x256:128 same 2731.18 2730.17 +0.0%
Qwen3.8-Flash-Next FP8 32768 192 513 FlyDSL 64_128_256_True:1x4_64x256:128 same 5116.74 5134.63 -0.3%
Qwen3.8-Flash-Next FP8 1 320 513 FlyDSL 16_16_16_False same 18.08 17.25 +4.8%
Qwen3.8-Flash-Next FP8 2 320 513 FlyDSL 16_16_16_False FlyDSL 16_16_16_False_True 36.20 24.82 +45.9%
Qwen3.8-Flash-Next FP8 4 320 513 FlyDSL 16_16_16_False FlyDSL 16_16_16_False_True 51.49 40.54 +27.0%
Qwen3.8-Flash-Next FP8 8 320 513 asm fmoe_bf16_pertokenFp8_g1u1_vs_silu_1tg_32x320 FlyDSL 16_16_16_False_True 73.44 71.44 +2.8%
Qwen3.8-Flash-Next FP8 16 320 513 FlyDSL 16_16_16_False FlyDSL 16_128_64_False 124.82 121.52 +2.7%
Qwen3.8-Flash-Next FP8 32 320 513 asm fmoe_bf16_pertokenFp8_g1u1_vs_silu_1tg_32x320 same 188.55 188.28 +0.1%
Qwen3.8-Flash-Next FP8 64 320 513 CK 128x16x64x128 / 64x16x64x64 same 300.72 300.65 +0.0%
Qwen3.8-Flash-Next FP8 128 320 513 asm fmoe_bf16_pertokenFp8_g1u1_vs_silu_1tg_32x320 same 398.85 398.04 +0.2%
Qwen3.8-Flash-Next FP8 256 320 513 asm fmoe_bf16_pertokenFp8_g1u1_vs_silu_1tg_32x320 same 435.03 439.63 -1.0%
Qwen3.8-Flash-Next FP8 512 320 513 asm fmoe_bf16_pertokenFp8_g1u1_vs_silu_1tg_32x320 same 456.13 451.74 +1.0%
Qwen3.8-Flash-Next FP8 1024 320 513 asm fmoe_bf16_pertokenFp8_g1u1_vs_silu_1tg_32x320 same 495.19 487.58 +1.6%
Qwen3.8-Flash-Next FP8 2048 320 513 FlyDSL 64_128_256_True:1x4_64x256:128 same 738.56 739.83 -0.2%
Qwen3.8-Flash-Next FP8 4096 320 513 asm fmoe_bf16_pertokenFp8_g1u1_vs_silu_1tg_32x320 same 1248.69 1259.16 -0.8%
Qwen3.8-Flash-Next FP8 8192 320 513 FlyDSL 64_128_256_True:1x4_64x256:128 same 2060.30 2070.81 -0.5%
Qwen3.8-Flash-Next FP8 16384 320 513 FlyDSL 64_128_256_True:1x4_64x256:128 same 3765.48 3766.69 +0.0%
Qwen3.8-Flash-Next FP8 32768 320 513 FlyDSL 64_128_256_True:1x4_64x256:128 same 6988.02 6987.55 +0.0%
Qwen3.8-Flash-Next FP8 1 640 513 FlyDSL 16_16_16_False same 26.11 25.15 +3.8%
Qwen3.8-Flash-Next FP8 2 640 513 FlyDSL 16_16_16_False FlyDSL 16_16_16_False_True 51.29 40.36 +27.1%
Qwen3.8-Flash-Next FP8 4 640 513 CK 256x16x64x256 / 128x16x128x128 FlyDSL 16_16_16_False_True 82.74 73.18 +13.1%
Qwen3.8-Flash-Next FP8 8 640 513 CK 256x16x64x256 / 128x16x128x128 same 133.34 133.54 -0.1%
Qwen3.8-Flash-Next FP8 16 640 513 CK 256x16x128x256 / 128x16x128x128 same 212.22 212.24 +0.0%
Qwen3.8-Flash-Next FP8 32 640 513 CK 256x16x64x256 / 128x16x128x128 same 393.24 394.27 -0.3%
Qwen3.8-Flash-Next FP8 64 640 513 CK 128x16x64x128 / 128x16x128x128 same 603.90 611.40 -1.2%
Qwen3.8-Flash-Next FP8 128 640 513 asm fmoe_bf16_pertokenFp8_g1u1_vs_silu_1tg_32x320 same 802.05 798.23 +0.5%
Qwen3.8-Flash-Next FP8 256 640 513 asm fmoe_bf16_pertokenFp8_g1u1_vs_silu_1tg_32x320 same 859.73 848.90 +1.3%
Qwen3.8-Flash-Next FP8 512 640 513 asm fmoe_bf16_pertokenFp8_g1u1_vs_silu_1tg_32x320 same 870.88 877.49 -0.8%
Qwen3.8-Flash-Next FP8 1024 640 513 asm fmoe_bf16_pertokenFp8_g1u1_vs_silu_1tg_ps_32x320 same 975.59 973.44 +0.2%
Qwen3.8-Flash-Next FP8 2048 640 513 FlyDSL 64_256_128_True:1x4_64x256:128 same 1268.85 1275.87 -0.6%
Qwen3.8-Flash-Next FP8 4096 640 513 FlyDSL 64_256_128_True:8x1_compact:128 same 2256.11 2256.56 +0.0%
Qwen3.8-Flash-Next FP8 8192 640 513 FlyDSL 64_256_128_True:1x4_64x256:128 same 3495.52 3511.29 -0.4%
Qwen3.8-Flash-Next FP8 16384 640 513 FlyDSL 64_256_128_True:8x1_compact:128 same 6279.76 6281.86 +0.0%
Qwen3.8-Flash-Next FP8 32768 640 513 FlyDSL 64_256_128_True:8x1_compact:128 same 11461.26 11466.32 +0.0%
Qwen3.5-35B FP8 1 128 257 FlyDSL 16_16_16_False same 12.84 11.33 +13.3%
Qwen3.5-35B FP8 2 128 257 FlyDSL 16_16_16_False FlyDSL 16_16_16_False_True 24.82 12.97 +91.4%
Qwen3.5-35B FP8 4 128 257 FlyDSL 16_16_16_False FlyDSL 16_16_16_False_True 29.10 17.50 +66.3%
Qwen3.5-35B FP8 8 128 257 FlyDSL 16_16_16_False FlyDSL 16_16_16_False_True 39.08 27.83 +40.4%
Qwen3.5-35B FP8 16 128 257 FlyDSL 16_16_16_False same 54.27 54.15 +0.2%
Qwen3.5-35B FP8 32 128 257 FlyDSL 16_16_16_False FlyDSL 16_128_64_False 67.19 67.21 +0.0%
Qwen3.5-35B FP8 64 128 257 FlyDSL 16_16_16_False FlyDSL 16_128_64_False 85.45 83.04 +2.9%
Qwen3.5-35B FP8 128 128 257 FlyDSL 16_16_16_False FlyDSL 16_128_64_False 102.09 96.58 +5.7%
Qwen3.5-35B FP8 256 128 257 CK 256x16x64x256 / 128x16x128x128 FlyDSL 16_128_64_False 125.14 121.22 +3.2%
Qwen3.5-35B FP8 512 128 257 asm fmoe_bf16_pertokenFp8_g1u1_vs_silu_1tg_32x128 same 136.18 135.76 +0.3%
Qwen3.5-35B FP8 1024 128 257 FlyDSL 64_128_256_True:1x4_64x256:128 same 166.56 162.81 +2.3%
Qwen3.5-35B FP8 2048 128 257 FlyDSL 64_256_128_True:1x4_64x256:128 same 253.81 248.62 +2.1%
Qwen3.5-35B FP8 4096 128 257 FlyDSL 64_128_256_True:1x4_64x256:128 same 383.91 378.73 +1.4%
Qwen3.5-35B FP8 8192 128 257 FlyDSL 64_128_256_True:1x4_64x256:128 same 696.73 694.28 +0.4%
Qwen3.5-35B FP8 16384 128 257 FlyDSL 64_256_128_True:1x4_64x256:128 same 1252.31 1254.33 -0.2%
Qwen3.5-35B FP8 32768 128 257 FlyDSL 64_256_128_True:1x4_64x256:128 same 2396.43 2398.63 -0.1%
Qwen3.5-35B FP8 65536 128 257 FlyDSL 64_256_128_True:1x4_64x256:128 same 4715.72 4729.34 -0.3%
Qwen3.5-35B FP8 131072 128 257 FlyDSL 64_256_128_True:1x4_64x256:128 same 9561.20 9623.80 -0.7%
Qwen3.5-35B FP8 1 512 257 FlyDSL 16_16_16_False same 19.71 18.24 +8.1%
Qwen3.5-35B FP8 2 512 257 FlyDSL 16_16_16_False FlyDSL 16_16_16_False_True 36.83 27.32 +34.8%
Qwen3.5-35B FP8 4 512 257 FlyDSL 16_16_16_False FlyDSL 16_16_16_False_True 51.73 42.76 +21.0%
Qwen3.5-35B FP8 8 512 257 CK 256x16x64x256 / 256x16x128x256 FlyDSL 16_16_16_False_True 80.07 76.21 +5.1%
Qwen3.5-35B FP8 16 512 257 CK 256x16x64x256 / 256x16x128x256 same 121.15 121.43 -0.2%
Qwen3.5-35B FP8 32 512 257 CK 256x16x64x256 / 256x16x128x256 same 172.80 173.02 -0.1%
Qwen3.5-35B FP8 64 512 257 CK 256x16x64x256 / 256x16x128x256 same 213.05 212.94 +0.1%
Qwen3.5-35B FP8 128 512 257 CK 256x16x64x256 / 256x16x128x256 same 239.83 239.91 +0.0%
Qwen3.5-35B FP8 256 512 257 CK 256x16x64x256 / 256x16x128x256 same 254.01 254.24 -0.1%
Qwen3.5-35B FP8 512 512 257 CK 256x32x64x128 / 256x32x64x128 same 311.56 311.42 +0.0%
Qwen3.5-35B FP8 1024 512 257 FlyDSL 64_256_128_True same 391.45 389.56 +0.5%
Qwen3.5-35B FP8 2048 512 257 FlyDSL 64_256_128_True same 661.04 661.28 +0.0%
Qwen3.5-35B FP8 4096 512 257 FlyDSL 64_256_128_True same 1018.04 1015.87 +0.2%
Qwen3.5-35B FP8 8192 512 257 FlyDSL 64_256_128_True:8x1_compact:128 same 1716.29 1731.91 -0.9%
Qwen3.5-35B FP8 16384 512 257 FlyDSL 64_256_128_True:8x1_compact:128 same 3161.50 3156.55 +0.2%
Qwen3.5-35B FP8 32768 512 257 FlyDSL 64_256_128_True:8x1_compact:128 same 6052.49 6050.72 +0.0%
Qwen3.5-397B FP8 1 128 513 FlyDSL 16_16_16_False same 17.45 15.88 +9.9%
Qwen3.5-397B FP8 2 128 513 FlyDSL 16_16_16_False FlyDSL 16_16_16_False_True 33.67 21.04 +60.0%
Qwen3.5-397B FP8 4 128 513 FlyDSL 16_16_16_False FlyDSL 16_16_16_False_True 45.55 31.75 +43.5%
Qwen3.5-397B FP8 8 128 513 FlyDSL 16_16_16_False FlyDSL 16_16_16_False_True 65.82 54.27 +21.3%
Qwen3.5-397B FP8 16 128 513 FlyDSL 16_16_16_False FlyDSL 16_128_64_False 99.96 97.54 +2.5%
Qwen3.5-397B FP8 32 128 513 FlyDSL 16_16_16_False FlyDSL 16_128_64_False 152.93 148.50 +3.0%
Qwen3.5-397B FP8 64 128 513 FlyDSL 16_16_16_False FlyDSL 16_128_64_False 224.13 213.17 +5.1%
Qwen3.5-397B FP8 128 128 513 FlyDSL 16_16_16_False FlyDSL 16_128_64_False 313.14 289.57 +8.1%
Qwen3.5-397B FP8 256 128 513 CK 256x16x64x256 / 128x16x128x128 FlyDSL 16_128_64_False 372.59 355.33 +4.9%
Qwen3.5-397B FP8 512 128 513 asm fmoe_bf16_pertokenFp8_g1u1_vs_silu_1tg_32x128 same 412.93 412.86 +0.0%
Qwen3.5-397B FP8 1024 128 513 asm fmoe_bf16_pertokenFp8_g1u1_vs_silu_1tg_ps_32x128 same 446.87 445.33 +0.3%
Qwen3.5-397B FP8 2048 128 513 FlyDSL 64_128_256_True:1x4_64x256:128 same 589.45 587.74 +0.3%
Qwen3.5-397B FP8 4096 128 513 FlyDSL 64_256_128_True:1x4_64x256:128 same 1024.95 1025.04 +0.0%
Qwen3.5-397B FP8 8192 128 513 FlyDSL 64_256_128_True:1x4_64x256:128 same 1640.74 1643.09 -0.1%
Qwen3.5-397B FP8 16384 128 513 FlyDSL 64_256_128_True:1x4_64x256:128 same 3013.72 3024.43 -0.4%
Qwen3.5-397B FP8 32768 128 513 FlyDSL 64_256_128_True:1x4_64x256:128 same 5660.29 5666.47 -0.1%
Qwen3.5-397B FP8 65536 128 513 FlyDSL 64_256_128_True:1x4_64x256:128 same 11165.45 11194.49 -0.3%
Qwen3.5-397B FP8 131072 128 513 FlyDSL 64_256_128_True:1x4_64x256:128 same 22319.11 21853.55 +2.1%

Skewed routing. The router scores get a fixed per-expert bias -alpha * log(1 + rank) (fixed random ranking of the experts), with alpha 0.06–0.09 per model so that, over many tokens, the most popular expert receives 2× the mean load. Three rounds:

Tokens Shapes Geomean Total time Worst / best > 2% faster / slower
1 12 +8.8% +7.7% +3.3% / +19.0% 12 / 0
2 12 +44.3% +39.1% +20.8% / +97.1% 12 / 0
4 12 +28.1% +22.9% +8.7% / +68.9% 12 / 0
8 12 +11.1% +6.9% -0.8% / +41.1% 9 / 0
16–256 60 +1.9% +2.6% -2.7% / +9.9% 24 / 1
1–256 (decoding) 108 +10.5% +3.9% -2.7% / +97.1% 69 / 1

At decoding batch sizes this skew barely changes the routing (at 64 tokens 295 vs 295 active experts on average), and every token group stays within 1% of its uniform-routing speedup.

Per-shape skewed routing (108 rows)
Model M inter_dim E main → PR Active experts main µs PR µs Skewed Uniform
Hunyuan3 FP8 per-tensor 1 192 192 BN64 8 17.64 15.52 +13.7% +6.0%
Hunyuan3 FP8 per-tensor 2 192 192 BN64 → direct 16 30.10 20.26 +48.6% +50.2%
Hunyuan3 FP8 per-tensor 4 192 192 BN64 → direct 31 40.77 31.06 +31.3% +33.6%
Hunyuan3 FP8 per-tensor 8 192 192 BN64 → direct 57 59.32 52.44 +13.1% +13.0%
Hunyuan3 FP8 per-tensor 16 192 192 BN64 → BN128 95 89.90 89.33 +0.6% +0.9%
Hunyuan3 FP8 per-tensor 32 192 192 BN64 → BN128 142 128.76 129.16 -0.3% -0.3%
Hunyuan3 FP8 per-tensor 64 192 192 BN64 → BN128 182 153.61 147.94 +3.8% +3.9%
Hunyuan3 FP8 per-tensor 128 192 192 BN64 → BN128 192 186.22 176.01 +5.8% +6.8%
Hunyuan3 FP8 per-tensor 256 192 192 CK → BN128 192 234.37 223.44 +4.9% +5.5%
MiniMax-M3 FP8 1 384 128 BN64 4 20.95 20.04 +4.5% +9.8%
MiniMax-M3 FP8 2 384 128 BN64 → direct 8 35.88 27.26 +31.6% +33.9%
MiniMax-M3 FP8 4 384 128 BN64 → direct 16 53.02 44.13 +20.1% +21.0%
MiniMax-M3 FP8 8 384 128 BN64 → direct 29 81.83 76.48 +7.0% +7.5%
MiniMax-M3 FP8 16 384 128 CK → BN128 53 129.36 126.13 +2.6% +2.5%
MiniMax-M3 FP8 32 384 128 CK 76 175.17 180.10 -2.7% +0.4%
MiniMax-M3 FP8 64 384 128 CK 112 248.59 248.05 +0.2% +0.2%
MiniMax-M3 FP8 128 384 128 CK 125 297.70 298.44 -0.2% +0.1%
MiniMax-M3 FP8 256 384 128 CK 128 313.40 313.52 +0.0% -0.3%
MiniMax-M3 FP8 1 384 129 BN64 5 20.99 20.22 +3.8% +7.0%
MiniMax-M3 FP8 2 384 129 BN64 → direct 9 37.48 28.01 +33.8% +35.7%
MiniMax-M3 FP8 4 384 129 BN64 → direct 18 56.16 51.67 +8.7% +10.9%
MiniMax-M3 FP8 8 384 129 CK → direct 35 93.18 92.82 +0.4% +0.2%
MiniMax-M3 FP8 16 384 129 CK → BN128 64 148.67 148.75 -0.1% +0.8%
MiniMax-M3 FP8 32 384 129 CK 95 220.98 219.06 +0.9% +0.0%
MiniMax-M3 FP8 64 384 129 CK 120 269.46 269.14 +0.1% -0.3%
MiniMax-M3 FP8 128 384 129 CK 128 292.99 296.93 -1.3% +0.2%
MiniMax-M3 FP8 256 384 129 CK 129 338.02 336.76 +0.4% -0.2%
Qwen3.8-Flash-Next BF16 1 192 513 BN64 11 18.75 15.81 +18.6% +15.6%
Qwen3.8-Flash-Next BF16 2 192 513 BN64 → direct 22 37.29 24.91 +49.7% +49.7%
Qwen3.8-Flash-Next BF16 4 192 513 BN64 → direct 42 55.53 39.30 +41.3% +39.2%
Qwen3.8-Flash-Next BF16 8 192 513 BN64 → direct 84 85.82 73.64 +16.5% +15.5%
Qwen3.8-Flash-Next BF16 16 192 513 BN64 152 139.62 138.78 +0.6% -0.6%
Qwen3.8-Flash-Next BF16 32 192 513 BN64 257 229.61 229.90 -0.1% +0.0%
Qwen3.8-Flash-Next BF16 64 192 513 BN64 384 365.04 365.51 -0.1% -0.2%
Qwen3.8-Flash-Next BF16 128 192 513 BN64 → BN128 473 471.26 452.77 +4.1% +3.7%
Qwen3.8-Flash-Next BF16 256 192 513 CK → BN128 512 551.69 523.14 +5.5% +5.3%
Qwen3.8-Flash-Next BF16 1 320 513 BN64 11 22.23 21.29 +4.4% +5.5%
Qwen3.8-Flash-Next BF16 2 320 513 BN64 → direct 22 47.15 34.98 +34.8% +35.1%
Qwen3.8-Flash-Next BF16 4 320 513 BN64 → direct 41 75.25 61.62 +22.1% +22.5%
Qwen3.8-Flash-Next BF16 8 320 513 BN64 → direct 76 117.48 110.69 +6.1% +6.6%
Qwen3.8-Flash-Next BF16 16 320 513 BN64 → BN128 140 193.28 192.35 +0.5% +0.0%
Qwen3.8-Flash-Next BF16 32 320 513 CK → BN128 241 386.53 364.70 +6.0% +10.0%
Qwen3.8-Flash-Next BF16 64 320 513 CK → BN128 366 582.54 560.26 +4.0% +4.0%
Qwen3.8-Flash-Next BF16 128 320 513 CK → BN128 475 771.11 745.04 +3.5% +3.9%
Qwen3.8-Flash-Next BF16 256 320 513 CK → BN128 511 860.15 849.43 +1.3% +0.7%
Qwen3.8-Flash-Next BF16 1 640 513 BN64 11 36.68 35.52 +3.3% +2.4%
Qwen3.8-Flash-Next BF16 2 640 513 BN64 → direct 22 76.74 63.51 +20.8% +25.0%
Qwen3.8-Flash-Next BF16 4 640 513 BN64 → direct 42 128.91 116.74 +10.4% +11.0%
Qwen3.8-Flash-Next BF16 8 640 513 BN64 83 228.51 229.21 -0.3% -0.4%
Qwen3.8-Flash-Next BF16 16 640 513 CK → BN128 153 471.22 461.41 +2.1% +0.3%
Qwen3.8-Flash-Next BF16 32 640 513 CK → BN128 261 814.37 765.02 +6.5% +9.1%
Qwen3.8-Flash-Next BF16 64 640 513 CK → BN128 388 1248.73 1167.19 +7.0% +8.6%
Qwen3.8-Flash-Next BF16 128 640 513 CK → BN128 477 1557.94 1453.71 +7.2% +6.5%
Qwen3.8-Flash-Next BF16 256 640 513 CK → BN128 513 1684.42 1657.67 +1.6% +5.8%
Qwen3.8-Flash-Next FP8 1 192 513 BN64 11 15.52 13.86 +12.0% +9.1%
Qwen3.8-Flash-Next FP8 2 192 513 BN64 → direct 22 30.19 19.03 +58.6% +60.5%
Qwen3.8-Flash-Next FP8 4 192 513 BN64 → direct 42 41.03 28.92 +41.9% +42.1%
Qwen3.8-Flash-Next FP8 8 192 513 BN64 → direct 84 59.28 47.86 +23.9% +25.1%
Qwen3.8-Flash-Next FP8 16 192 513 asm 152 90.29 90.67 -0.4% +0.5%
Qwen3.8-Flash-Next FP8 32 192 513 BN64 → BN128 257 140.90 138.31 +1.9% +1.8%
Qwen3.8-Flash-Next FP8 64 192 513 BN64 → BN128 384 202.07 197.74 +2.2% +3.0%
Qwen3.8-Flash-Next FP8 128 192 513 asm 473 239.26 237.57 +0.7% +0.2%
Qwen3.8-Flash-Next FP8 256 192 513 asm 512 295.52 286.86 +3.0% -1.7%
Qwen3.8-Flash-Next FP8 1 320 513 BN64 11 18.09 17.19 +5.2% +4.8%
Qwen3.8-Flash-Next FP8 2 320 513 BN64 → direct 22 36.30 24.88 +45.9% +45.9%
Qwen3.8-Flash-Next FP8 4 320 513 BN64 → direct 41 51.33 40.68 +26.2% +27.0%
Qwen3.8-Flash-Next FP8 8 320 513 asm → direct 76 72.75 70.69 +2.9% +2.8%
Qwen3.8-Flash-Next FP8 16 320 513 BN64 → BN128 140 127.85 128.04 -0.1% +2.7%
Qwen3.8-Flash-Next FP8 32 320 513 asm 241 214.72 212.13 +1.2% +0.1%
Qwen3.8-Flash-Next FP8 64 320 513 CK 366 294.00 295.65 -0.6% +0.0%
Qwen3.8-Flash-Next FP8 128 320 513 asm 475 397.63 399.89 -0.6% +0.2%
Qwen3.8-Flash-Next FP8 256 320 513 asm 511 449.16 448.93 +0.1% -1.0%
Qwen3.8-Flash-Next FP8 1 640 513 BN64 11 26.12 25.16 +3.8% +3.8%
Qwen3.8-Flash-Next FP8 2 640 513 BN64 → direct 22 51.31 40.18 +27.7% +27.1%
Qwen3.8-Flash-Next FP8 4 640 513 CK → direct 42 82.19 72.95 +12.7% +13.1%
Qwen3.8-Flash-Next FP8 8 640 513 CK 83 133.97 135.09 -0.8% -0.1%
Qwen3.8-Flash-Next FP8 16 640 513 CK 153 215.28 214.87 +0.2% +0.0%
Qwen3.8-Flash-Next FP8 32 640 513 CK 261 390.11 375.29 +3.9% -0.3%
Qwen3.8-Flash-Next FP8 64 640 513 CK 388 619.12 617.74 +0.2% -1.2%
Qwen3.8-Flash-Next FP8 128 640 513 asm 477 800.62 791.77 +1.1% +0.5%
Qwen3.8-Flash-Next FP8 256 640 513 asm 513 880.58 875.14 +0.6% +1.3%
Qwen3.5-35B FP8 1 128 257 BN64 9 13.24 11.12 +19.1% +13.3%
Qwen3.5-35B FP8 2 128 257 BN64 → direct 18 25.08 12.73 +97.0% +91.4%
Qwen3.5-35B FP8 4 128 257 BN64 → direct 35 29.24 17.32 +68.8% +66.3%
Qwen3.5-35B FP8 8 128 257 BN64 → direct 69 39.11 27.71 +41.1% +40.4%
Qwen3.5-35B FP8 16 128 257 BN64 112 53.68 53.16 +1.0% +0.2%
Qwen3.5-35B FP8 32 128 257 BN64 → BN128 179 65.89 65.80 +0.1% +0.0%
Qwen3.5-35B FP8 64 128 257 BN64 → BN128 237 85.21 82.25 +3.6% +2.9%
Qwen3.5-35B FP8 128 128 257 BN64 → BN128 252 101.69 96.23 +5.7% +5.7%
Qwen3.5-35B FP8 256 128 257 CK → BN128 256 125.60 121.44 +3.4% +3.2%
Qwen3.5-35B FP8 1 512 257 BN64 9 19.69 18.10 +8.8% +8.1%
Qwen3.5-35B FP8 2 512 257 BN64 → direct 18 37.60 27.29 +37.8% +34.8%
Qwen3.5-35B FP8 4 512 257 BN64 → direct 33 52.59 42.68 +23.2% +21.0%
Qwen3.5-35B FP8 8 512 257 CK → direct 61 81.63 76.87 +6.2% +5.1%
Qwen3.5-35B FP8 16 512 257 CK 107 123.26 122.62 +0.5% -0.2%
Qwen3.5-35B FP8 32 512 257 CK 176 171.00 171.41 -0.2% -0.1%
Qwen3.5-35B FP8 64 512 257 CK 228 212.57 211.58 +0.5% +0.1%
Qwen3.5-35B FP8 128 512 257 CK 253 238.37 236.99 +0.6% +0.0%
Qwen3.5-35B FP8 256 512 257 CK 257 252.51 251.91 +0.2% -0.1%
Qwen3.5-397B FP8 1 128 513 BN64 11 17.62 15.98 +10.3% +9.9%
Qwen3.5-397B FP8 2 128 513 BN64 → direct 21 33.70 21.18 +59.1% +60.0%
Qwen3.5-397B FP8 4 128 513 BN64 → direct 43 45.37 31.95 +42.0% +43.5%
Qwen3.5-397B FP8 8 128 513 BN64 → direct 87 65.88 53.14 +24.0% +21.3%
Qwen3.5-397B FP8 16 128 513 BN64 → BN128 154 99.73 97.02 +2.8% +2.5%
Qwen3.5-397B FP8 32 128 513 BN64 → BN128 261 152.53 147.93 +3.1% +3.0%
Qwen3.5-397B FP8 64 128 513 BN64 → BN128 388 222.78 213.02 +4.6% +5.1%
Qwen3.5-397B FP8 128 128 513 BN64 → BN128 478 305.60 278.05 +9.9% +8.1%
Qwen3.5-397B FP8 256 128 513 CK → BN128 510 370.28 351.68 +5.3% +4.9%

Odd token counts. 3 tokens use the 4-token row, 5–7 the 8-token row, 9–15 the 16-token row. Three rounds, speedup = main / PR − 1:

Tokens Shapes Geomean Total time Worst / best > 2% faster / slower
3 12 +32.6% +28.0% +15.5% / +74.3% 12 / 0
5–7 36 +16.3% +11.2% -0.5% / +57.4% 30 / 0
9–15 84 +0.4% +0.8% -4.8% / +14.3% 12 / 9

3–7 tokens keep most of the gain. 9–15 tokens are neutral; 5 of the 9 slower runs are Hunyuan3, whose 16-token row moved to BN128 (-2.2% on average at 9–15).

Per-shape odd token counts (speedup)
Model inter_dim E M=3 M=5 M=6 M=7 M=9 M=10 M=11 M=12 M=13 M=14 M=15
Hunyuan3 FP8 per-tensor 192 192 +31.7% +25.0% +17.9% +13.8% -4.8% -2.8% +1.6% +0.4% -3.8% -3.3% -2.6%
MiniMax-M3 FP8 384 128 +15.5% +11.1% +5.5% +6.0% +14.3% +11.8% +11.2% -1.4% -1.2% -0.3% +1.0%
MiniMax-M3 FP8 384 129 +23.6% +16.3% +12.4% +6.1% +1.8% -0.2% +0.3% +0.7% +1.3% +1.3% +0.7%
Qwen3.8-Flash-Next BF16 192 513 +44.6% +24.6% +22.2% +18.9% -0.3% +0.2% +0.4% +0.1% +0.4% +0.4% +0.3%
Qwen3.8-Flash-Next BF16 320 513 +21.7% +14.5% +11.5% +8.9% -0.3% -2.5% -0.7% -1.9% -1.5% -0.5% -2.2%
Qwen3.8-Flash-Next BF16 640 513 +16.9% -0.2% -0.3% -0.1% +5.7% +5.0% +3.1% +1.9% +3.5% +0.8% +4.7%
Qwen3.8-Flash-Next FP8 192 513 +50.6% +29.8% +26.4% +25.3% +0.1% +0.1% -0.1% -0.5% -0.1% +0.0% -0.5%
Qwen3.8-Flash-Next FP8 320 513 +28.2% +28.2% +15.6% +9.0% +0.7% -2.3% +0.7% -1.4% +0.3% +1.4% +0.3%
Qwen3.8-Flash-Next FP8 640 513 +19.0% -0.1% -0.1% -0.5% -0.1% -0.5% +0.0% +0.2% -1.1% -0.3% -0.8%
Qwen3.5-35B FP8 128 257 +74.3% +57.4% +49.9% +40.9% -1.0% -0.6% -0.9% -0.7% -0.5% -0.7% -0.7%
Qwen3.5-35B FP8 512 257 +34.4% +17.3% +9.7% +5.9% -1.2% +0.0% +0.0% -0.7% -1.2% -0.7% -0.6%
Qwen3.5-397B FP8 128 513 +41.9% +32.7% +30.4% +24.3% -2.2% +3.4% +2.2% -1.9% -1.5% +2.7% +3.4%

CI has no gfx942 performance check, so these manual runs are the only performance evidence for this PR.

Copilot AI lite review requested due to automatic review settings October 27, 2026 14:04

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.

🔵 Needs a closer look

Batch-1 configuration validation must reject tile dimensions other than (16, 16, 16) before approval.

No open issues 🎉

1 previously missed issue

In code that hasn't changed since last review

Medium severity Reject unsupported batch-1 tile dimensions

aiter/​ops/​flydsl/​fused_moe_gfx942.py:92

This validation only checks BLOCK_N, but _run_batch1 hard-codes all three batch-1 tile dimensions (BLOCK_M=16, BLOCK_N=16, and BLOCK_K=16 is not passed through). A config such as 32_16_32_False:default:0 therefore passes unsupported_reason, is serialized as that tile, and executes the fixed 16×16×16 kernels. Reject any non-(16, 16, 16) tile for batch 1, just as the direct-decoding flag is constrained.

2 resolved since last review

Review effort: Lite

@Bernard-Liu

Copy link
Copy Markdown
Contributor

Thanks for the per-shape data. It shows that some configurations still regress against main:

  • Token counts that use a retuned row without being measured at tuning time. Hunyuan's 16-token row moved from BN64 to 16_128_64_False, and get_padded_M also routes 9–15 tokens to it. It is +0.9% at 16 tokens, but −4.8% at 9, −2.8% at 10, −3.8% at 13, −3.3% at 14 and −2.6% at 15 tokens. Other points slower by more than 2% in the same range: Qwen3.8-Flash-Next BF16 (inter_dim 320) at 10 and 15 tokens, Qwen3.8-Flash-Next FP8 (inter_dim 320) at 10 tokens, and Qwen3.5-397B at 9 tokens.
  • Prefill rows whose GEMM selection is unchanged but whose sort/reduce path changed. MiniMax-M3 M=1024/E=128 goes from 458.95 to 470.50 µs (−2.5%), and Qwen3.8-Flash-Next FP8 M=2048/inter_dim=192 goes from 503.24 to 520.26 µs (−3.3%). From 8192 tokens up, every Hunyuan and MiniMax-M3 prefill row is also 0.4–1.1% slower, and the gap grows with M (up to +177 µs and +220 µs at 131072 tokens).

Could you re-measure both performance and accuracy on gfx942 for all configurations that may be affected? That would cover every runtime token count each retuned decoding row serves (not only the tuned buckets) and all 71 prefill rows, with repeated runs for the rows above and the error/status reported next to each latency.

Copilot AI lite review requested due to automatic review settings October 29, 2026 01: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.

🔵 Needs a closer look

The low-level gfx942 routing and kernel changes require head-matched MI308X runtime correctness and performance validation that static review cannot provide.

No open issues 🎉

Review effort: Lite

@luocheng25

Copy link
Copy Markdown
Contributor Author

Could you re-measure both performance and accuracy on gfx942 for all configurations that may be affected? That would cover every runtime token count each retuned decoding row serves (not only the tuned buckets) and all 71 prefill rows, with repeated runs for the rows above and the error/status reported next to each latency.

Done on 7b58f3a457 (on top of af98038f0), against main 2bafed4728 with each tree's own CSVs: MI308X, PTL enabled, FlyDSL 0.4.0, default rounding, --run_config latencies (10 warmups, 51 iterations, rotating inputs), main and PR measured back to back on the same GPU in alternating order. Every latency below is the median of three rounds, or of seven for the points that were more than 1% slower than main after three. err_ratio and status are the ones --run_config reports for that run.

Decoding: every served token count. A row tuned at M tokens also serves M/2+1 to M−1 tokens (get_padded_M), so I measured all 1572 token counts the 65 retuned rows serve. A retuned row is kept only if it is at least 1% faster than main on average over its token counts and no token count is more than 2% slower. Seven BN128 rows fail that and now keep main's BN64 selection, including every point you listed:

Row (tokens) Before the revert: geomean Worst Reason
Hunyuan3 inter_dim 192, M=16 (9–16) −1.9% −5.8% (9) 5 token counts more than 2% slower (9, 10, 13, 14, 15)
Hunyuan3 inter_dim 192, M=32 (17–32) −0.1% −2.7% (21) 2 token counts more than 2% slower (20, 21)
Qwen3.8 BF16 inter_dim 320, M=16 (9–16) +0.4% −1.2% (10) less than 1% faster on average
Qwen3.8 FP8 inter_dim 320, M=16 (9–16) +0.3% −1.2% (12) less than 1% faster on average
Qwen3.5-35B inter_dim 128, M=32 (17–32) −1.7% −3.5% (18) 8 token counts more than 2% slower (18, 19, 20, 26, 27, 28, 29, 30)
Qwen3.5-35B inter_dim 128, M=64 (33–64) +0.8% −2.7% (43) 2 token counts more than 2% slower (43, 44)
Qwen3.5-397B inter_dim 128, M=16 (9–16) +0.8% −2.7% (9) 2 token counts more than 2% slower (9, 12)
Tokens (row M) Rows Token counts Geomean Total time Worst / best > 2% faster / slower
2 (2) 12 12 +42.8% +38.1% +22.8% / +90.0% 12 / 0
3–4 (4) 12 24 +30.4% +25.1% +9.9% / +80.5% 24 / 0
5–8 (8) 10 40 +18.4% +15.2% +0.1% / +58.0% 38 / 0
9–16 (16) 3 24 +3.1% +2.8% −0.8% / +14.1% 8 / 0
17–32 (32) 4 64 +4.2% +5.4% −1.3% / +15.9% 41 / 0
33–64 (64) 5 160 +4.3% +5.9% −0.6% / +9.9% 134 / 0
65–128 (128) 6 384 +4.8% +5.5% −0.9% / +10.6% 352 / 0
129–256 (256) 6 768 +6.2% +5.3% −0.1% / +14.1% 749 / 0
2–256, retuned rows 58 1476 +6.4% +5.5% −1.3% / +90.0% 1358 / 0
2–256, the 7 rows on main's selection 7 96 +0.0% −0.1% −5.5% / +2.7% 1 / 5

The seven reverted rows run the same kernel on both sides, so their spread is the measurement noise of a single token count.

Per row: all 65 retuned rows
Model inter_dim E M Tokens main → PR Rounds Geomean Worst (tokens) Best err_ratio main / PR logits_diff main / PR Status
Hunyuan3 192 192 2 2–2 BN64 → direct 3 +51.4% +51.4% (2) +51.4% 72.2% / 72.3% 0.0011 / 0.0011 ok
Hunyuan3 192 192 4 3–4 BN64 → direct 3 +31.4% +30.2% (3) +32.5% 72.9% / 73.1% 0.0011 / 0.0011 ok
Hunyuan3 192 192 8 5–8 BN64 → direct 3 +17.2% +13.8% (8) +23.2% 73.3% / 73.5% 0.0011 / 0.0011 ok
Hunyuan3 192 192 16 9–16 BN64 (main's) 3 −0.3% −2.4% (11) +2.7% 73.3% / 73.3% 0.0011 / 0.0011 ok
Hunyuan3 192 192 32 17–32 BN64 (main's) 3 +0.1% −2.4% (24) +2.0% 73.2% / 73.2% 0.0011 / 0.0011 ok
Hunyuan3 192 192 64 33–64 BN64 → BN128 3/7 +2.0% −0.6% (41) +4.8% 72.8% / 72.8% 0.0011 / 0.0011 ok
Hunyuan3 192 192 128 65–128 BN64 → BN128 3 +5.2% +3.2% (65) +7.6% 73.0% / 73.0% 0.0011 / 0.0011 ok
Hunyuan3 192 192 256 129–256 CK → BN128 3 +7.1% +2.9% (237) +12.7% 0.2% / 73.0% 0.0000 / 0.0011 ok
MiniMax-M3 384 128 2 2–2 BN64 → direct 3 +31.0% +31.0% (2) +31.0% 80.4% / 80.4% 0.0007 / 0.0007 ok
MiniMax-M3 384 128 4 3–4 BN64 → direct 3 +18.8% +17.1% (3) +20.5% 81.2% / 81.2% 0.0008 / 0.0008 ok
MiniMax-M3 384 128 8 5–8 BN64 → direct 3 +6.4% +5.2% (7) +8.1% 81.4% / 81.5% 0.0008 / 0.0008 ok
MiniMax-M3 384 128 16 9–16 CK → BN128 3/7 +4.8% −0.8% (12) +14.1% 2.8% / 81.9% 0.0000 / 0.0008 ok
MiniMax-M3 384 129 2 2–2 BN64 → direct 3 +33.9% +33.9% (2) +33.9% 82.7% / 82.8% 0.0009 / 0.0009 ok
MiniMax-M3 384 129 4 3–4 BN64 → direct 3 +17.9% +12.3% (4) +23.8% 82.3% / 82.3% 0.0009 / 0.0009 ok
MiniMax-M3 384 129 8 5–8 CK → direct 3 +8.8% +0.1% (8) +16.2% 3.9% / 82.2% 0.0000 / 0.0009 ok
MiniMax-M3 384 129 16 9–16 CK → BN128 3 +1.2% +0.9% (10) +1.5% 3.9% / 81.7% 0.0000 / 0.0008 ok
Qwen3.8 BF16 192 513 2 2–2 BN64 → direct 3 +47.4% +47.4% (2) +47.4% 0.0% / 0.0% 0.0000 / 0.0000 ok
Qwen3.8 BF16 192 513 4 3–4 BN64 → direct 3 +41.2% +38.4% (4) +44.2% 0.0% / 0.0% 0.0000 / 0.0000 ok
Qwen3.8 BF16 192 513 8 5–8 BN64 → direct 3 +19.5% +14.5% (8) +23.0% 0.1% / 0.1% 0.0000 / 0.0000 ok
Qwen3.8 BF16 192 513 128 65–128 BN64 → BN128 3/7 +2.6% −0.9% (87) +8.3% 0.0% / 0.0% 0.0000 / 0.0000 ok
Qwen3.8 BF16 192 513 256 129–256 CK → BN128 3 +7.1% +2.3% (199) +10.9% 0.0% / 0.0% 0.0000 / 0.0000 ok
Qwen3.8 BF16 320 513 2 2–2 BN64 → direct 3 +32.8% +32.8% (2) +32.8% 0.0% / 0.0% 0.0000 / 0.0000 ok
Qwen3.8 BF16 320 513 4 3–4 BN64 → direct 3 +21.6% +20.0% (3) +23.3% 0.1% / 0.0% 0.0000 / 0.0000 ok
Qwen3.8 BF16 320 513 8 5–8 BN64 → direct 3 +10.2% +6.3% (8) +14.3% 0.0% / 0.1% 0.0000 / 0.0000 ok
Qwen3.8 BF16 320 513 16 9–16 BN64 (main's) 3 −0.3% −0.5% (11) −0.1% 0.0% / 0.0% 0.0000 / 0.0000 ok
Qwen3.8 BF16 320 513 32 17–32 CK → BN128 3 +9.1% +5.6% (28) +15.9% 0.0% / 0.0% 0.0000 / 0.0000 ok
Qwen3.8 BF16 320 513 64 33–64 CK → BN128 3 +6.8% +2.0% (55) +9.9% 0.0% / 0.0% 0.0000 / 0.0000 ok
Qwen3.8 BF16 320 513 128 65–128 CK → BN128 3 +5.5% +2.4% (105) +8.4% 0.0% / 0.0% 0.0000 / 0.0000 ok
Qwen3.8 BF16 320 513 256 129–256 CK → BN128 3 +3.4% −0.1% (227) +7.0% 0.0% / 0.0% 0.0000 / 0.0000 ok
Qwen3.8 BF16 640 513 2 2–2 BN64 → direct 3 +22.8% +22.8% (2) +22.8% 0.2% / 0.2% 0.0000 / 0.0000 ok
Qwen3.8 BF16 640 513 4 3–4 BN64 → direct 3 +13.2% +9.9% (4) +16.5% 0.2% / 0.2% 0.0000 / 0.0000 ok
Qwen3.8 BF16 640 513 16 9–16 CK → BN128 3 +3.3% +0.4% (14) +7.8% 0.2% / 0.2% 0.0000 / 0.0000 ok
Qwen3.8 BF16 640 513 32 17–32 CK → BN128 3 +4.9% −0.2% (18) +8.8% 0.2% / 0.2% 0.0000 / 0.0000 ok
Qwen3.8 BF16 640 513 64 33–64 CK → BN128 3 +7.2% +4.6% (61) +9.5% 0.2% / 0.2% 0.0000 / 0.0000 ok
Qwen3.8 BF16 640 513 128 65–128 CK → BN128 3 +6.6% +2.6% (123) +9.1% 0.2% / 0.2% 0.0000 / 0.0000 ok
Qwen3.8 BF16 640 513 256 129–256 CK → BN128 3 +5.3% +2.8% (218) +7.4% 0.2% / 0.2% 0.0000 / 0.0000 ok
Qwen3.8 FP8 192 513 2 2–2 BN64 → direct 3 +54.1% +54.1% (2) +54.1% 59.1% / 59.1% 0.0010 / 0.0010 ok
Qwen3.8 FP8 192 513 4 3–4 BN64 → direct 3 +46.8% +41.0% (4) +52.9% 58.8% / 59.0% 0.0010 / 0.0010 ok
Qwen3.8 FP8 192 513 8 5–8 BN64 → direct 3 +28.4% +24.4% (8) +33.0% 61.6% / 61.8% 0.0011 / 0.0011 ok
Qwen3.8 FP8 192 513 32 17–32 BN64 → BN128 3 +1.5% −0.6% (18) +3.3% 60.5% / 60.5% 0.0010 / 0.0010 ok
Qwen3.8 FP8 192 513 64 33–64 BN64 → BN128 3 +2.5% +0.3% (34) +3.7% 60.0% / 60.0% 0.0011 / 0.0011 ok
Qwen3.8 FP8 320 513 2 2–2 BN64 → direct 3 +45.8% +45.8% (2) +45.8% 64.8% / 64.8% 0.0010 / 0.0010 ok
Qwen3.8 FP8 320 513 4 3–4 BN64 → direct 3 +28.5% +27.1% (4) +30.0% 66.1% / 66.0% 0.0011 / 0.0011 ok
Qwen3.8 FP8 320 513 8 5–8 asm → direct 3 +14.6% +1.6% (8) +33.9% 19.4% / 66.4% 0.0001 / 0.0011 ok
Qwen3.8 FP8 320 513 16 9–16 BN64 (main's) 3 −1.1% −5.5% (15) +0.5% 65.7% / 65.8% 0.0011 / 0.0011 ok
Qwen3.8 FP8 640 513 2 2–2 BN64 → direct 3 +26.9% +26.9% (2) +26.9% 70.5% / 70.6% 0.0010 / 0.0010 ok
Qwen3.8 FP8 640 513 4 3–4 CK → direct 3 +16.0% +10.2% (4) +22.0% 0.2% / 71.4% 0.0000 / 0.0010 ok
Qwen3.5-35B 128 257 2 2–2 BN64 → direct 3 +90.0% +90.0% (2) +90.0% 47.8% / 47.9% 0.0012 / 0.0012 ok
Qwen3.5-35B 128 257 4 3–4 BN64 → direct 3 +73.3% +66.3% (4) +80.5% 51.3% / 51.5% 0.0010 / 0.0010 ok
Qwen3.5-35B 128 257 8 5–8 BN64 → direct 3 +47.0% +38.8% (8) +58.0% 52.0% / 52.0% 0.0009 / 0.0009 ok
Qwen3.5-35B 128 257 32 17–32 BN64 (main's) 3 +0.2% −0.9% (29) +1.5% 50.1% / 50.1% 0.0010 / 0.0010 ok
Qwen3.5-35B 128 257 64 33–64 BN64 (main's) 3 +0.3% −1.2% (63) +1.4% 49.9% / 49.8% 0.0010 / 0.0010 ok
Qwen3.5-35B 128 257 128 65–128 BN64 → BN128 3 +3.4% +0.5% (72) +5.6% 49.7% / 49.8% 0.0010 / 0.0010 ok
Qwen3.5-35B 128 257 256 129–256 CK → BN128 3 +8.4% +2.4% (256) +14.1% 0.7% / 49.6% 0.0000 / 0.0010 ok
Qwen3.5-35B 512 257 2 2–2 BN64 → direct 3 +32.7% +32.7% (2) +32.7% 69.1% / 69.0% 0.0011 / 0.0011 ok
Qwen3.5-35B 512 257 4 3–4 BN64 → direct 3 +26.7% +19.5% (4) +34.4% 69.5% / 69.6% 0.0011 / 0.0011 ok
Qwen3.5-35B 512 257 8 5–8 CK → direct 3 +9.9% +3.2% (7) +19.5% 0.1% / 68.4% 0.0000 / 0.0011 ok
Qwen3.5-397B 128 513 2 2–2 BN64 → direct 3 +56.7% +56.7% (2) +56.7% 67.7% / 67.6% 0.0011 / 0.0011 ok
Qwen3.5-397B 128 513 4 3–4 BN64 → direct 3 +40.8% +39.9% (4) +41.7% 67.1% / 66.8% 0.0010 / 0.0010 ok
Qwen3.5-397B 128 513 8 5–8 BN64 → direct 3 +27.3% +24.3% (8) +33.0% 66.2% / 66.1% 0.0010 / 0.0010 ok
Qwen3.5-397B 128 513 16 9–16 BN64 (main's) 3 −0.1% −0.5% (16) +0.3% 66.1% / 66.1% 0.0010 / 0.0010 ok
Qwen3.5-397B 128 513 32 17–32 BN64 → BN128 3/7 +1.4% −1.3% (17) +3.2% 65.6% / 65.5% 0.0010 / 0.0010 ok
Qwen3.5-397B 128 513 64 33–64 BN64 → BN128 3 +3.3% +0.9% (36) +5.2% 66.3% / 66.3% 0.0011 / 0.0011 ok
Qwen3.5-397B 128 513 128 65–128 BN64 → BN128 3 +5.3% +2.7% (100) +10.6% 66.3% / 66.3% 0.0010 / 0.0010 ok
Qwen3.5-397B 128 513 256 129–256 CK → BN128 3 +5.6% +3.1% (255) +9.6% 2.6% / 66.0% 0.0000 / 0.0010 ok
Per token count: speedup of every point (main / PR − 1, %)
  • Hunyuan3 inter_dim 192 E 192 M=2: 2:+51.4
  • Hunyuan3 inter_dim 192 E 192 M=4: 3:+30.2 4:+32.5
  • Hunyuan3 inter_dim 192 E 192 M=8: 5:+23.2 6:+18.0 7:+14.1 8:+13.8
  • Hunyuan3 inter_dim 192 E 192 M=16 (main's selection): 9:-0.1 10:-0.1 11:-2.4 12:+2.7 13:-2.3 14:+1.7 15:-0.0 16:-1.5
  • Hunyuan3 inter_dim 192 E 192 M=32 (main's selection): 17:-0.5 18:+0.6 19:-0.6 20:+0.7 21:-0.1 22:+0.4 23:+0.2 24:-2.4 25:+0.5 26:+1.6 27:-0.3 28:+2.0 29:-0.3 30:-0.6 31:-0.6 32:+0.9
  • Hunyuan3 inter_dim 192 E 192 M=64: 33:+0.2 34:+1.7 35:+1.9 36:+2.8 37:+1.8 38:+2.5 39:+1.8 40:+0.2 41:-0.6 42:+1.1 43:+1.7 44:+3.5 45:+1.0 46:+0.5 47:+1.1 48:+3.5 49:+0.2 50:+0.7 51:+1.6 52:+2.5 53:+1.3 54:+2.1 55:+2.4 56:+3.4 57:+2.3 58:+3.1 59:+2.6 60:+4.4 61:+2.5 62:+3.0 63:+3.1 64:+4.8
  • Hunyuan3 inter_dim 192 E 192 M=128: 65:+3.2 66:+4.3 67:+3.9 68:+4.6 69:+3.6 70:+3.3 71:+3.8 72:+5.5 73:+3.7 74:+4.0 75:+4.4 76:+5.1 77:+4.1 78:+4.5 79:+4.8 80:+6.1 81:+4.6 82:+4.7 83:+5.2 84:+6.3 85:+4.7 86:+4.9 87:+6.5 88:+6.2 89:+5.2 90:+5.9 91:+7.6 92:+6.9 93:+5.7 94:+6.6 95:+7.1 96:+7.3 97:+4.7 98:+4.1 99:+4.5 100:+4.8 101:+4.0 102:+3.9 103:+5.1 104:+5.1 105:+4.1 106:+4.7 107:+5.7 108:+5.6 109:+4.9 110:+4.9 111:+5.8 112:+5.3 113:+4.8 114:+5.2 115:+6.0 116:+6.3 117:+4.9 118:+5.2 119:+6.5 120:+6.3 121:+5.2 122:+5.8 123:+6.5 124:+6.2 125:+5.4 126:+6.3 127:+6.7 128:+7.4
  • Hunyuan3 inter_dim 192 E 192 M=256: 129:+10.3 130:+10.4 131:+10.1 132:+12.7 133:+9.6 134:+10.1 135:+9.4 136:+11.5 137:+9.2 138:+10.3 139:+9.2 140:+10.1 141:+8.4 142:+9.8 143:+9.1 144:+11.2 145:+7.7 146:+9.5 147:+9.2 148:+10.0 149:+6.7 150:+9.7 151:+8.8 152:+10.8 153:+7.3 154:+9.9 155:+8.2 156:+10.4 157:+7.0 158:+9.1 159:+8.3 160:+10.7 161:+6.9 162:+8.0 163:+8.2 164:+9.5 165:+7.1 166:+8.8 167:+8.3 168:+9.4 169:+7.3 170:+8.1 171:+8.8 172:+9.4 173:+8.1 174:+8.2 175:+8.1 176:+9.4 177:+7.3 178:+8.4 179:+7.3 180:+9.0 181:+6.0 182:+8.6 183:+7.5 184:+8.9 185:+5.6 186:+7.9 187:+7.9 188:+8.2 189:+5.9 190:+7.6 191:+7.2 192:+8.3 193:+4.9 194:+6.9 195:+6.4 196:+7.5 197:+5.7 198:+7.2 199:+7.0 200:+7.5 201:+5.0 202:+7.0 203:+6.9 204:+7.3 205:+5.1 206:+6.7 207:+6.4 208:+7.0 209:+4.7 210:+6.6 211:+6.1 212:+7.2 213:+5.1 214:+6.8 215:+6.3 216:+7.3 217:+5.1 218:+6.7 219:+5.0 220:+6.4 221:+5.9 222:+6.0 223:+6.1 224:+6.2 225:+4.9 226:+6.5 227:+4.8 228:+5.5 229:+4.4 230:+4.7 231:+5.0 232:+5.2 233:+4.0 234:+5.7 235:+4.4 236:+4.9 237:+2.9 238:+5.2 239:+5.0 240:+5.7 241:+4.2 242:+5.1 243:+3.8 244:+4.7 245:+3.9 246:+4.7 247:+4.2 248:+4.8 249:+3.8 250:+5.2 251:+4.2 252:+5.2 253:+3.1 254:+4.3 255:+4.1 256:+5.1
  • MiniMax-M3 inter_dim 384 E 128 M=2: 2:+31.0
  • MiniMax-M3 inter_dim 384 E 128 M=4: 3:+17.1 4:+20.5
  • MiniMax-M3 inter_dim 384 E 128 M=8: 5:+8.1 6:+5.5 7:+5.2 8:+6.9
  • MiniMax-M3 inter_dim 384 E 128 M=16: 9:+14.1 10:+12.2 11:+11.5 12:-0.8 13:-0.4 14:+0.7 15:+0.4 16:+2.2
  • MiniMax-M3 inter_dim 384 E 129 M=2: 2:+33.9
  • MiniMax-M3 inter_dim 384 E 129 M=4: 3:+23.8 4:+12.3
  • MiniMax-M3 inter_dim 384 E 129 M=8: 5:+16.2 6:+13.4 7:+6.3 8:+0.1
  • MiniMax-M3 inter_dim 384 E 129 M=16: 9:+1.4 10:+0.9 11:+1.3 12:+1.1 13:+1.4 14:+1.5 15:+0.9 16:+0.9
  • Qwen3.8 BF16 inter_dim 192 E 513 M=2: 2:+47.4
  • Qwen3.8 BF16 inter_dim 192 E 513 M=4: 3:+44.2 4:+38.4
  • Qwen3.8 BF16 inter_dim 192 E 513 M=8: 5:+23.0 6:+22.8 7:+18.1 8:+14.5
  • Qwen3.8 BF16 inter_dim 192 E 513 M=128: 65:+2.4 66:+2.5 67:+2.2 68:+2.5 69:+3.2 70:+2.1 71:-0.2 72:+2.0 73:+2.9 74:+0.8 75:+1.0 76:+1.3 77:+3.3 78:+2.9 79:+2.9 80:+3.4 81:+3.0 82:+3.2 83:+0.5 84:+0.9 85:+3.3 86:+1.0 87:-0.9 88:+2.9 89:+3.3 90:+2.7 91:+3.0 92:+3.4 93:+3.3 94:+1.8 95:+4.1 96:+3.4 97:+3.6 98:+2.7 99:+8.3 100:+1.2 101:+3.3 102:+3.3 103:+1.6 104:+2.7 105:+3.0 106:+2.2 107:+0.8 108:+0.3 109:+1.8 110:+2.7 111:+2.8 112:+3.7 113:+3.8 114:+1.9 115:+3.6 116:+6.2 117:+4.5 118:+2.9 119:-0.5 120:+3.0 121:+3.4 122:+2.9 123:+5.6 124:+3.5 125:+4.0 126:+2.7 127:-0.6 128:+2.0
  • Qwen3.8 BF16 inter_dim 192 E 513 M=256: 129:+9.4 130:+10.1 131:+7.6 132:+9.3 133:+8.9 134:+10.3 135:+10.2 136:+7.3 137:+9.0 138:+10.9 139:+7.2 140:+8.2 141:+8.6 142:+10.4 143:+8.2 144:+7.4 145:+8.0 146:+10.1 147:+8.5 148:+7.5 149:+7.9 150:+8.3 151:+9.0 152:+6.8 153:+8.0 154:+8.8 155:+8.9 156:+6.6 157:+7.3 158:+7.6 159:+10.2 160:+6.2 161:+7.4 162:+8.1 163:+10.0 164:+6.9 165:+7.4 166:+8.8 167:+8.1 168:+6.0 169:+7.3 170:+8.6 171:+9.0 172:+5.8 173:+7.3 174:+8.3 175:+8.3 176:+6.5 177:+7.4 178:+8.0 179:+6.2 180:+4.9 181:+6.8 182:+7.6 183:+8.1 184:+6.0 185:+7.9 186:+6.7 187:+8.4 188:+7.1 189:+6.5 190:+6.6 191:+5.1 192:+5.7 193:+6.7 194:+6.7 195:+7.7 196:+6.2 197:+5.3 198:+6.9 199:+2.3 200:+5.8 201:+5.7 202:+6.1 203:+5.7 204:+6.2 205:+6.0 206:+6.1 207:+9.1 208:+6.1 209:+6.8 210:+6.3 211:+6.9 212:+6.1 213:+7.4 214:+5.6 215:+8.2 216:+5.1 217:+6.5 218:+6.2 219:+8.6 220:+6.9 221:+6.9 222:+6.5 223:+7.5 224:+6.7 225:+7.9 226:+4.8 227:+4.9 228:+6.6 229:+7.0 230:+6.8 231:+5.9 232:+7.6 233:+7.8 234:+6.6 235:+6.3 236:+6.1 237:+7.2 238:+4.7 239:+5.7 240:+6.3 241:+4.9 242:+5.0 243:+4.6 244:+5.3 245:+6.1 246:+6.0 247:+6.2 248:+5.7 249:+6.3 250:+6.0 251:+6.1 252:+5.2 253:+5.2 254:+6.7 255:+6.7 256:+5.6
  • Qwen3.8 BF16 inter_dim 320 E 513 M=2: 2:+32.8
  • Qwen3.8 BF16 inter_dim 320 E 513 M=4: 3:+20.0 4:+23.3
  • Qwen3.8 BF16 inter_dim 320 E 513 M=8: 5:+14.3 6:+12.5 7:+8.0 8:+6.3
  • Qwen3.8 BF16 inter_dim 320 E 513 M=16 (main's selection): 9:-0.1 10:-0.5 11:-0.5 12:-0.4 13:-0.4 14:-0.3 15:-0.1 16:-0.2
  • Qwen3.8 BF16 inter_dim 320 E 513 M=32: 17:+6.4 18:+7.3 19:+7.6 20:+9.2 21:+12.7 22:+12.8 23:+15.9 24:+7.4 25:+9.8 26:+9.2 27:+9.3 28:+5.6 29:+7.3 30:+6.7 31:+9.9 32:+8.4
  • Qwen3.8 BF16 inter_dim 320 E 513 M=64: 33:+6.8 34:+6.5 35:+7.8 36:+8.1 37:+7.4 38:+7.1 39:+7.9 40:+7.3 41:+6.1 42:+7.7 43:+5.2 44:+6.4 45:+6.4 46:+6.5 47:+5.0 48:+6.9 49:+6.5 50:+9.2 51:+6.7 52:+4.8 53:+8.7 54:+5.8 55:+2.0 56:+5.8 57:+6.7 58:+7.8 59:+9.0 60:+6.0 61:+7.2 62:+7.8 63:+9.9 64:+5.1
  • Qwen3.8 BF16 inter_dim 320 E 513 M=128: 65:+6.4 66:+6.7 67:+6.2 68:+4.6 69:+6.8 70:+6.8 71:+7.7 72:+4.5 73:+6.2 74:+5.1 75:+3.8 76:+5.7 77:+4.3 78:+5.4 79:+5.2 80:+4.7 81:+5.9 82:+5.5 83:+6.4 84:+5.9 85:+6.3 86:+5.9 87:+5.8 88:+4.0 89:+6.9 90:+5.5 91:+5.7 92:+5.2 93:+6.9 94:+5.4 95:+4.0 96:+5.6 97:+6.7 98:+5.2 99:+5.3 100:+5.2 101:+8.4 102:+5.5 103:+3.9 104:+4.7 105:+2.4 106:+6.3 107:+3.5 108:+5.1 109:+8.0 110:+6.1 111:+4.5 112:+5.6 113:+8.1 114:+5.7 115:+3.5 116:+5.4 117:+7.1 118:+5.7 119:+3.8 120:+5.1 121:+6.3 122:+5.6 123:+3.9 124:+5.1 125:+7.8 126:+5.9 127:+3.7 128:+4.5
  • Qwen3.8 BF16 inter_dim 320 E 513 M=256: 129:+5.1 130:+4.8 131:+1.1 132:+4.7 133:+4.6 134:+5.1 135:+3.2 136:+4.6 137:+6.1 138:+4.6 139:+3.3 140:+4.3 141:+3.2 142:+4.4 143:+3.9 144:+4.4 145:+4.2 146:+3.9 147:+3.7 148:+4.2 149:+5.0 150:+4.5 151:+2.0 152:+4.9 153:+6.3 154:+4.5 155:+3.1 156:+4.4 157:+4.3 158:+4.4 159:+4.8 160:+4.1 161:+5.4 162:+3.9 163:+2.6 164:+3.7 165:+7.0 166:+4.8 167:+2.6 168:+4.1 169:+3.4 170:+4.6 171:+1.8 172:+3.1 173:+3.8 174:+3.1 175:+2.0 176:+3.9 177:+3.8 178:+3.9 179:+2.6 180:+2.9 181:+3.3 182:+1.9 183:+2.3 184:+3.9 185:+5.2 186:+3.9 187:+2.7 188:+3.6 189:+4.7 190:+5.6 191:+1.6 192:+3.5 193:+4.2 194:+4.2 195:+2.5 196:+3.6 197:+4.4 198:+3.8 199:+2.3 200:+3.5 201:+5.1 202:+3.9 203:+1.8 204:+4.1 205:+4.0 206:+3.6 207:+2.3 208:+3.3 209:+3.3 210:+4.3 211:+2.5 212:+3.4 213:+3.8 214:+3.2 215:+2.0 216:+3.7 217:+5.3 218:+3.2 219:+1.8 220:+2.6 221:+5.1 222:+3.5 223:+1.0 224:+3.5 225:+3.8 226:+2.8 227:-0.1 228:+3.4 229:+3.3 230:+2.4 231:+1.3 232:+2.0 233:+4.1 234:+3.5 235:+0.8 236:+2.1 237:+4.0 238:+2.8 239:+1.6 240:+3.2 241:+4.7 242:+2.5 243:+0.3 244:+2.3 245:+4.4 246:+1.9 247:+0.5 248:+2.3 249:+3.2 250:+2.2 251:+1.1 252:+2.0 253:+5.6 254:+2.2 255:+1.5 256:+2.0
  • Qwen3.8 BF16 inter_dim 640 E 513 M=2: 2:+22.8
  • Qwen3.8 BF16 inter_dim 640 E 513 M=4: 3:+16.5 4:+9.9
  • Qwen3.8 BF16 inter_dim 640 E 513 M=16: 9:+7.8 10:+7.1 11:+3.8 12:+2.0 13:+4.2 14:+0.4 15:+0.6 16:+0.8
  • Qwen3.8 BF16 inter_dim 640 E 513 M=32: 17:+2.4 18:-0.2 19:+3.8 20:+0.7 21:+4.1 22:+1.5 23:+5.8 24:+7.0 25:+8.7 26:+1.5 27:+7.3 28:+7.5 29:+8.0 30:+5.9 31:+8.8 32:+6.6
  • Qwen3.8 BF16 inter_dim 640 E 513 M=64: 33:+8.6 34:+4.9 35:+6.1 36:+6.6 37:+9.5 38:+7.5 39:+9.2 40:+7.1 41:+7.3 42:+6.5 43:+9.3 44:+9.2 45:+6.7 46:+5.9 47:+6.9 48:+6.4 49:+6.3 50:+8.5 51:+7.9 52:+6.7 53:+5.5 54:+8.0 55:+7.6 56:+6.9 57:+6.7 58:+8.6 59:+9.1 60:+7.6 61:+4.6 62:+7.5 63:+5.1 64:+6.9
  • Qwen3.8 BF16 inter_dim 640 E 513 M=128: 65:+6.9 66:+7.1 67:+5.5 68:+9.1 69:+8.3 70:+6.8 71:+8.4 72:+7.9 73:+5.7 74:+8.5 75:+6.5 76:+8.2 77:+7.0 78:+6.9 79:+8.1 80:+7.5 81:+5.7 82:+8.1 83:+3.6 84:+8.0 85:+7.6 86:+6.6 87:+3.9 88:+8.6 89:+8.2 90:+7.1 91:+7.8 92:+7.7 93:+5.1 94:+7.1 95:+4.1 96:+7.3 97:+8.5 98:+7.4 99:+3.8 100:+5.0 101:+7.3 102:+7.1 103:+3.6 104:+6.7 105:+5.8 106:+6.9 107:+4.5 108:+8.2 109:+7.9 110:+7.2 111:+3.7 112:+7.2 113:+8.2 114:+7.4 115:+2.9 116:+6.2 117:+6.0 118:+7.0 119:+5.1 120:+6.5 121:+5.5 122:+6.8 123:+2.6 124:+7.5 125:+5.0 126:+7.0 127:+5.0 128:+6.6
  • Qwen3.8 BF16 inter_dim 640 E 513 M=256: 129:+5.8 130:+6.7 131:+6.2 132:+6.5 133:+5.4 134:+7.0 135:+7.4 136:+6.4 137:+6.9 138:+6.8 139:+7.1 140:+7.0 141:+5.0 142:+6.6 143:+6.5 144:+4.8 145:+4.1 146:+6.7 147:+7.2 148:+7.1 149:+6.0 150:+6.5 151:+6.1 152:+6.2 153:+5.3 154:+6.4 155:+6.9 156:+6.3 157:+6.5 158:+6.3 159:+6.5 160:+6.8 161:+5.0 162:+5.5 163:+6.5 164:+3.2 165:+6.0 166:+6.8 167:+7.1 168:+5.3 169:+5.2 170:+6.7 171:+6.0 172:+5.6 173:+4.2 174:+6.3 175:+4.9 176:+5.3 177:+4.0 178:+5.5 179:+6.0 180:+6.7 181:+4.8 182:+5.8 183:+6.0 184:+6.6 185:+3.4 186:+5.7 187:+5.6 188:+5.2 189:+5.3 190:+6.1 191:+4.6 192:+3.3 193:+4.6 194:+5.4 195:+5.2 196:+5.0 197:+4.2 198:+5.8 199:+4.8 200:+7.2 201:+4.1 202:+5.9 203:+5.6 204:+6.0 205:+5.3 206:+4.8 207:+4.0 208:+5.1 209:+3.9 210:+5.9 211:+5.9 212:+5.5 213:+4.6 214:+5.8 215:+5.3 216:+3.3 217:+4.8 218:+2.8 219:+3.8 220:+3.0 221:+4.3 222:+5.5 223:+4.8 224:+5.3 225:+4.2 226:+4.6 227:+4.7 228:+4.8 229:+4.3 230:+4.8 231:+4.8 232:+4.9 233:+3.3 234:+4.6 235:+3.8 236:+4.8 237:+4.9 238:+4.4 239:+4.6 240:+4.7 241:+4.0 242:+5.7 243:+4.3 244:+4.7 245:+3.5 246:+5.4 247:+3.9 248:+3.3 249:+4.4 250:+5.1 251:+4.1 252:+5.6 253:+4.5 254:+4.9 255:+4.6 256:+4.5
  • Qwen3.8 FP8 inter_dim 192 E 513 M=2: 2:+54.1
  • Qwen3.8 FP8 inter_dim 192 E 513 M=4: 3:+52.9 4:+41.0
  • Qwen3.8 FP8 inter_dim 192 E 513 M=8: 5:+33.0 6:+30.6 7:+26.0 8:+24.4
  • Qwen3.8 FP8 inter_dim 192 E 513 M=32: 17:+2.6 18:-0.6 19:+0.5 20:+2.3 21:+2.3 22:+0.6 23:+0.9 24:+2.3 25:+0.7 26:+1.8 27:+1.6 28:+3.0 29:+0.6 30:+1.0 31:+1.2 32:+3.3
  • Qwen3.8 FP8 inter_dim 192 E 513 M=64: 33:+2.0 34:+0.3 35:+0.3 36:+1.7 37:+2.1 38:+2.8 39:+2.9 40:+1.4 41:+2.1 42:+2.6 43:+2.3 44:+2.6 45:+3.1 46:+2.3 47:+2.3 48:+3.2 49:+3.2 50:+3.4 51:+3.7 52:+3.5 53:+2.6 54:+2.6 55:+1.4 56:+2.6 57:+2.8 58:+3.4 59:+2.2 60:+3.4 61:+2.4 62:+3.1 63:+2.6 64:+3.3
  • Qwen3.8 FP8 inter_dim 320 E 513 M=2: 2:+45.8
  • Qwen3.8 FP8 inter_dim 320 E 513 M=4: 3:+30.0 4:+27.1
  • Qwen3.8 FP8 inter_dim 320 E 513 M=8: 5:+33.9 6:+15.3 7:+10.1 8:+1.6
  • Qwen3.8 FP8 inter_dim 320 E 513 M=16 (main's selection): 9:-0.2 10:-0.1 11:-0.2 12:+0.2 13:+0.5 14:-3.4 15:-5.5 16:+0.3
  • Qwen3.8 FP8 inter_dim 640 E 513 M=2: 2:+26.9
  • Qwen3.8 FP8 inter_dim 640 E 513 M=4: 3:+22.0 4:+10.2
  • Qwen3.5-35B inter_dim 128 E 257 M=2: 2:+90.0
  • Qwen3.5-35B inter_dim 128 E 257 M=4: 3:+80.5 4:+66.3
  • Qwen3.5-35B inter_dim 128 E 257 M=8: 5:+58.0 6:+51.4 7:+40.6 8:+38.8
  • Qwen3.5-35B inter_dim 128 E 257 M=32 (main's selection): 17:-0.1 18:+0.5 19:-0.0 20:+0.1 21:-0.2 22:+0.4 23:+0.2 24:-0.0 25:+0.4 26:+0.6 27:-0.2 28:+0.5 29:-0.9 30:+0.5 31:+1.5 32:+0.5
  • Qwen3.5-35B inter_dim 128 E 257 M=64 (main's selection): 33:-0.3 34:+1.4 35:-0.1 36:+0.6 37:-0.0 38:+0.1 39:+0.0 40:+0.8 41:+0.5 42:+0.2 43:+0.0 44:+0.8 45:-0.6 46:+1.4 47:+0.0 48:+0.8 49:-0.1 50:+0.5 51:+0.1 52:+0.6 53:-1.0 54:+0.8 55:+0.1 56:+0.9 57:-0.4 58:+0.2 59:+0.5 60:+0.7 61:+0.0 62:+0.8 63:-1.2 64:+0.3
  • Qwen3.5-35B inter_dim 128 E 257 M=128: 65:+3.3 66:+3.2 67:+3.3 68:+3.3 69:+3.4 70:+3.1 71:+2.7 72:+0.5 73:+0.7 74:+1.3 75:+1.4 76:+0.9 77:+0.9 78:+1.8 79:+1.7 80:+1.2 81:+1.4 82:+1.5 83:+1.8 84:+1.8 85:+1.3 86:+2.0 87:+2.2 88:+2.2 89:+2.2 90:+2.8 91:+3.2 92:+3.2 93:+2.3 94:+2.7 95:+3.3 96:+3.0 97:+3.4 98:+3.3 99:+3.1 100:+3.6 101:+3.5 102:+3.9 103:+4.2 104:+3.9 105:+3.8 106:+4.1 107:+4.0 108:+4.4 109:+4.5 110:+4.5 111:+5.3 112:+4.9 113:+5.1 114:+4.9 115:+5.6 116:+5.4 117:+4.7 118:+5.3 119:+5.1 120:+5.2 121:+5.0 122:+5.2 123:+5.2 124:+5.1 125:+5.2 126:+5.6 127:+5.2 128:+5.6
  • Qwen3.5-35B inter_dim 128 E 257 M=256: 129:+13.9 130:+14.0 131:+12.3 132:+11.8 133:+14.1 134:+13.3 135:+12.3 136:+11.1 137:+13.3 138:+12.8 139:+11.8 140:+11.1 141:+12.5 142:+12.3 143:+11.6 144:+10.7 145:+12.2 146:+12.3 147:+10.6 148:+10.8 149:+12.0 150:+11.9 151:+10.7 152:+9.8 153:+12.3 154:+11.5 155:+10.7 156:+9.6 157:+11.9 158:+11.3 159:+9.9 160:+9.9 161:+10.6 162:+10.8 163:+10.5 164:+10.0 165:+9.9 166:+11.2 167:+10.6 168:+9.2 169:+11.9 170:+10.6 171:+10.4 172:+9.3 173:+10.8 174:+11.1 175:+8.6 176:+7.7 177:+9.6 178:+9.8 179:+9.1 180:+7.6 181:+9.9 182:+11.0 183:+9.1 184:+8.5 185:+9.2 186:+10.0 187:+8.5 188:+8.7 189:+9.5 190:+9.2 191:+8.7 192:+6.8 193:+9.2 194:+8.8 195:+8.7 196:+7.5 197:+9.3 198:+8.6 199:+8.2 200:+7.8 201:+9.4 202:+9.3 203:+7.9 204:+7.1 205:+8.6 206:+8.3 207:+8.3 208:+6.5 209:+8.4 210:+7.1 211:+7.1 212:+6.8 213:+9.0 214:+8.8 215:+6.7 216:+6.7 217:+7.0 218:+8.1 219:+6.3 220:+6.1 221:+7.9 222:+6.5 223:+5.7 224:+5.0 225:+6.5 226:+5.4 227:+5.7 228:+4.8 229:+6.3 230:+5.8 231:+5.7 232:+4.6 233:+7.5 234:+5.9 235:+5.6 236:+4.3 237:+5.9 238:+4.9 239:+6.5 240:+4.3 241:+5.5 242:+5.7 243:+5.0 244:+2.9 245:+4.4 246:+3.6 247:+3.5 248:+3.1 249:+4.5 250:+4.2 251:+4.3 252:+3.1 253:+4.2 254:+3.7 255:+3.4 256:+2.4
  • Qwen3.5-35B inter_dim 512 E 257 M=2: 2:+32.7
  • Qwen3.5-35B inter_dim 512 E 257 M=4: 3:+34.4 4:+19.5
  • Qwen3.5-35B inter_dim 512 E 257 M=8: 5:+19.5 6:+13.5 7:+3.2 8:+4.1
  • Qwen3.5-397B inter_dim 128 E 513 M=2: 2:+56.7
  • Qwen3.5-397B inter_dim 128 E 513 M=4: 3:+41.7 4:+39.9
  • Qwen3.5-397B inter_dim 128 E 513 M=8: 5:+33.0 6:+27.5 7:+24.7 8:+24.3
  • Qwen3.5-397B inter_dim 128 E 513 M=16 (main's selection): 9:+0.1 10:+0.3 11:-0.3 12:+0.2 13:-0.0 14:-0.0 15:-0.3 16:-0.5
  • Qwen3.5-397B inter_dim 128 E 513 M=32: 17:-1.3 18:-0.8 19:+0.2 20:+2.5 21:+2.8 22:+3.1 23:-0.2 24:+0.7 25:+1.4 26:+0.6 27:+3.2 28:+3.2 29:+2.0 30:+0.5 31:+2.1 32:+2.5
  • Qwen3.5-397B inter_dim 128 E 513 M=64: 33:+2.6 34:+2.9 35:+4.1 36:+0.9 37:+1.1 38:+1.1 39:+3.8 40:+3.4 41:+3.4 42:+3.5 43:+4.2 44:+1.8 45:+1.7 46:+2.5 47:+3.9 48:+4.3 49:+3.6 50:+3.9 51:+5.1 52:+5.2 53:+4.7 54:+2.5 55:+3.0 56:+2.7 57:+2.6 58:+3.0 59:+3.5 60:+3.3 61:+3.3 62:+3.9 63:+4.8 64:+4.2
  • Qwen3.5-397B inter_dim 128 E 513 M=128: 65:+4.7 66:+4.6 67:+4.7 68:+5.1 69:+5.2 70:+2.9 71:+3.4 72:+2.8 73:+3.0 74:+3.4 75:+4.2 76:+3.2 77:+3.6 78:+4.2 79:+4.2 80:+4.6 81:+5.4 82:+5.4 83:+5.1 84:+6.0 85:+4.3 86:+5.5 87:+5.6 88:+5.1 89:+4.9 90:+4.5 91:+6.8 92:+6.5 93:+4.5 94:+4.3 95:+6.1 96:+3.8 97:+3.5 98:+5.4 99:+5.2 100:+2.7 101:+3.9 102:+3.4 103:+5.8 104:+4.0 105:+3.7 106:+4.4 107:+8.2 108:+5.4 109:+5.7 110:+6.9 111:+6.4 112:+5.5 113:+5.9 114:+6.7 115:+8.2 116:+7.0 117:+8.2 118:+6.7 119:+10.6 120:+8.4 121:+10.0 122:+6.5 123:+5.4 124:+5.4 125:+7.0 126:+5.1 127:+4.8 128:+5.1
  • Qwen3.5-397B inter_dim 128 E 513 M=256: 129:+7.6 130:+8.7 131:+6.1 132:+9.0 133:+7.0 134:+8.3 135:+7.4 136:+7.3 137:+6.2 138:+8.0 139:+7.4 140:+9.6 141:+8.2 142:+8.5 143:+8.4 144:+6.8 145:+7.2 146:+8.0 147:+7.6 148:+9.1 149:+6.5 150:+6.4 151:+6.2 152:+6.1 153:+6.2 154:+7.2 155:+6.8 156:+8.2 157:+6.5 158:+6.5 159:+6.1 160:+6.9 161:+5.6 162:+4.9 163:+5.5 164:+6.7 165:+6.5 166:+5.6 167:+5.5 168:+5.4 169:+5.8 170:+5.1 171:+5.6 172:+6.7 173:+5.3 174:+5.3 175:+6.0 176:+6.3 177:+6.2 178:+4.9 179:+5.5 180:+5.1 181:+5.5 182:+6.9 183:+6.6 184:+6.1 185:+5.0 186:+4.8 187:+6.6 188:+6.3 189:+5.9 190:+6.1 191:+5.3 192:+6.8 193:+5.6 194:+5.4 195:+5.5 196:+5.3 197:+5.3 198:+5.1 199:+5.4 200:+4.9 201:+5.7 202:+5.5 203:+4.5 204:+5.2 205:+5.5 206:+5.6 207:+6.2 208:+5.4 209:+5.9 210:+5.2 211:+4.7 212:+4.9 213:+4.1 214:+4.8 215:+4.7 216:+4.5 217:+4.4 218:+5.0 219:+5.7 220:+4.5 221:+5.2 222:+4.6 223:+4.2 224:+5.3 225:+4.9 226:+4.6 227:+4.7 228:+4.4 229:+5.5 230:+4.1 231:+4.4 232:+5.5 233:+3.7 234:+3.5 235:+4.9 236:+4.3 237:+3.7 238:+3.7 239:+4.7 240:+4.1 241:+4.0 242:+4.6 243:+4.0 244:+3.8 245:+6.5 246:+5.9 247:+3.8 248:+4.1 249:+5.2 250:+3.8 251:+4.2 252:+4.7 253:+3.3 254:+3.9 255:+3.1 256:+3.3

Prefill. The sort/reduce changes did cost time. At 131072 tokens the aux sort is 41–68 µs slower than the plain sort (the removed invert_sorted_ids saved 19–32 µs), and Hunyuan3's per-tensor clear of the Gate/Up output adds about 130 µs. The prefill sort also cleared the whole [tokens, model_dim] output, which sorted_sum overwrites row by row anyway; main does the same. 7b58f3a457 drops that clear (accumulate=False), which saves 3 µs at 1024 tokens and 300–480 µs at 131072 tokens, more than the costs above. The per-tensor Gate/Up clear stays, since it keeps dropped routes out of the Down absmax. All 94 prefill rows, three rounds:

Prefill rows Rows Geomean Total time Worst / best > 2% faster / slower
FlyDSL (changed path) 71 +1.0% +1.3% −0.3% / +3.6% 5 / 0
CK and ASM (unchanged code) 23 +0.2% +0.0% −0.6% / +2.4% 1 / 0
All 94 +0.8% +1.1% −0.6% / +3.6% 6 / 0

The rows you listed: MiniMax-M3 M=1024/E=128 is now +1.6%, Qwen3.8-Flash-Next FP8 M=2048/inter_dim=192 −0.3%, and every Hunyuan and MiniMax-M3 row from 8192 tokens up is 0.7% to 2.4% faster than main. MiniMax-M3 M=1024/E=129 measured −2.1% in the first three rounds; over eleven rounds on two GPUs it is −0.2%, and the per-kernel times put the difference in the Down GEMM, whose code is unchanged.

Per row: all 94 prefill rows
Model M inter_dim E Kernel Rounds main µs PR µs Speedup err_ratio main / PR logits_diff main / PR Status
Hunyuan3 512 192 192 64_128_256_True 3 354.27 352.42 +0.5% 0.0% / 0.0% 0.0000 / 0.0000 ok
Hunyuan3 1024 192 192 64_128_256_True 3 384.15 378.68 +1.4% 0.0% / 0.0% 0.0000 / 0.0000 ok
Hunyuan3 2048 192 192 64_128_256_True 3 573.76 562.92 +1.9% 0.0% / 0.0% 0.0000 / 0.0000 ok
Hunyuan3 4096 192 192 64_128_256_True 3 869.80 863.09 +0.8% 0.0% / 0.0% 0.0000 / 0.0000 ok
Hunyuan3 8192 192 192 64_128_256_True 3 1486.57 1472.36 +1.0% 0.0% / 0.0% 0.0000 / 0.0000 ok
Hunyuan3 16384 192 192 64_128_256_True 3 2679.22 2660.10 +0.7% 0.0% / 0.0% 0.0000 / 0.0000 ok
Hunyuan3 32768 192 192 64_128_256_True 3 5092.76 5057.20 +0.7% 0.0% / 0.0% 0.0000 / 0.0000 ok
Hunyuan3 65536 192 192 64_128_256_True 3 10225.49 10144.39 +0.8% 0.0% / 0.0% 0.0000 / 0.0000 ok
Hunyuan3 131072 192 192 64_128_256_True 3 20709.73 20567.62 +0.7% 0.0% / 0.0% 0.0000 / 0.0000 ok
MiniMax-M3 512 384 128 CK 3 380.07 371.10 +2.4% 6.0% / 6.0% 0.0000 / 0.0000 ok
MiniMax-M3 1024 384 128 64_256_128_True 11 446.89 440.00 +1.6% 4.8% / 4.8% 0.0000 / 0.0000 ok
MiniMax-M3 2048 384 128 64_256_128_True 3 713.09 710.38 +0.4% 4.3% / 4.3% 0.0000 / 0.0000 ok
MiniMax-M3 4096 384 128 64_256_128_True 3 1074.46 1057.40 +1.6% 4.7% / 4.7% 0.0000 / 0.0000 ok
MiniMax-M3 8192 384 128 64_128_256_True 3 1868.83 1839.72 +1.6% 4.7% / 4.7% 0.0000 / 0.0000 ok
MiniMax-M3 16384 384 128 64_256_128_True 3 3279.14 3221.28 +1.8% 4.8% / 4.8% 0.0000 / 0.0000 ok
MiniMax-M3 32768 384 128 64_256_128_True 3 6289.28 6171.90 +1.9% 4.7% / 4.7% 0.0000 / 0.0000 ok
MiniMax-M3 65536 384 128 64_256_128_True 3 12160.27 11937.88 +1.9% 4.7% / 4.7% 0.0000 / 0.0000 ok
MiniMax-M3 131072 384 128 64_256_128_True 3 24251.69 23790.58 +1.9% 4.8% / 4.8% 0.0000 / 0.0000 ok
MiniMax-M3 512 384 129 64_256_128_True 3 423.04 421.54 +0.4% 4.3% / 4.3% 0.0000 / 0.0000 ok
MiniMax-M3 1024 384 129 64_256_128_True 11 462.95 463.84 −0.2% 4.6% / 4.6% 0.0000 / 0.0000 ok
MiniMax-M3 2048 384 129 64_256_128_True 3 892.31 883.21 +1.0% 4.3% / 4.3% 0.0000 / 0.0000 ok
MiniMax-M3 4096 384 129 64_128_256_True 3 1301.71 1291.79 +0.8% 4.6% / 4.6% 0.0000 / 0.0000 ok
MiniMax-M3 8192 384 129 64_128_256_True 3 2269.17 2239.18 +1.3% 4.5% / 4.5% 0.0000 / 0.0000 ok
MiniMax-M3 16384 384 129 64_256_128_True 3 4019.96 3956.61 +1.6% 4.5% / 4.5% 0.0000 / 0.0000 ok
MiniMax-M3 32768 384 129 64_256_128_True 3 7646.91 7547.09 +1.3% 4.6% / 4.6% 0.0000 / 0.0000 ok
MiniMax-M3 65536 384 129 64_256_128_True 3 14895.42 14671.70 +1.5% 4.6% / 4.6% 0.0000 / 0.0000 ok
MiniMax-M3 131072 384 129 64_256_128_True 3 29844.40 29151.30 +2.4% 4.6% / 4.6% 0.0000 / 0.0000 ok
Qwen3.8 BF16 512 192 513 CK 3 565.90 567.16 −0.2% 0.0% / 0.0% 0.0000 / 0.0000 ok
Qwen3.8 BF16 1024 192 513 CK 3 630.17 629.02 +0.2% 0.0% / 0.0% 0.0000 / 0.0000 ok
Qwen3.8 BF16 2048 192 513 64_128_128_True 3 751.89 748.12 +0.5% 0.0% / 0.0% 0.0000 / 0.0000 ok
Qwen3.8 BF16 4096 192 513 64_128_128_True 3 1296.71 1289.21 +0.6% 0.0% / 0.0% 0.0000 / 0.0000 ok
Qwen3.8 BF16 8192 192 513 64_128_128_True 3 2011.41 1990.46 +1.1% 0.0% / 0.0% 0.0000 / 0.0000 ok
Qwen3.8 BF16 16384 192 513 64_128_128_True 3 3720.54 3682.46 +1.0% 0.0% / 0.0% 0.0000 / 0.0000 ok
Qwen3.8 BF16 32768 192 513 64_128_128_True 3 6750.76 6710.82 +0.6% 0.0% / 0.0% 0.0000 / 0.0000 ok
Qwen3.8 BF16 512 320 513 CK 3 887.03 886.21 +0.1% 0.0% / 0.0% 0.0000 / 0.0000 ok
Qwen3.8 BF16 1024 320 513 CK 3 984.56 982.11 +0.2% 0.0% / 0.0% 0.0000 / 0.0000 ok
Qwen3.8 BF16 2048 320 513 64_128_128_True 3 1187.10 1175.59 +1.0% 0.0% / 0.0% 0.0000 / 0.0000 ok
Qwen3.8 BF16 4096 320 513 64_128_128_True 3 2075.03 2069.51 +0.3% 0.0% / 0.0% 0.0000 / 0.0000 ok
Qwen3.8 BF16 8192 320 513 64_128_128_True 3 3268.75 3255.90 +0.4% 0.0% / 0.0% 0.0000 / 0.0000 ok
Qwen3.8 BF16 16384 320 513 64_128_128_True 3 5832.21 5815.87 +0.3% 0.0% / 0.0% 0.0000 / 0.0000 ok
Qwen3.8 BF16 32768 320 513 64_128_128_True 3 12182.53 12165.09 +0.1% 0.0% / 0.0% 0.0000 / 0.0000 ok
Qwen3.8 BF16 512 640 513 CK 6 1689.80 1686.64 +0.2% 0.2% / 0.2% 0.0000 / 0.0000 ok
Qwen3.8 BF16 1024 640 513 CK 3 1918.31 1921.85 −0.2% 0.2% / 0.2% 0.0000 / 0.0000 ok
Qwen3.8 BF16 2048 640 513 CK 3 2296.72 2302.93 −0.3% 0.2% / 0.2% 0.0000 / 0.0000 ok
Qwen3.8 BF16 4096 640 513 CK 3 3763.93 3752.30 +0.3% 0.2% / 0.2% 0.0000 / 0.0000 ok
Qwen3.8 BF16 8192 640 513 CK 3 6199.60 6202.24 +0.0% 0.2% / 0.2% 0.0000 / 0.0000 ok
Qwen3.8 BF16 16384 640 513 CK 3 13404.53 13426.52 −0.2% 0.2% / 0.2% 0.0000 / 0.0000 ok
Qwen3.8 BF16 32768 640 513 CK 3 25213.49 25228.18 −0.1% 0.2% / 0.2% 0.0000 / 0.0000 ok
Qwen3.8 FP8 512 192 513 asm 3 313.80 312.22 +0.5% 8.0% / 8.0% 0.0001 / 0.0001 ok
Qwen3.8 FP8 1024 192 513 asm 3 357.23 356.98 +0.1% 7.8% / 7.8% 0.0001 / 0.0001 ok
Qwen3.8 FP8 2048 192 513 64_128_256_True 3 479.31 480.73 −0.3% 1.3% / 1.3% 0.0000 / 0.0000 ok
Qwen3.8 FP8 4096 192 513 64_128_256_True 3 917.04 917.87 −0.1% 1.1% / 1.1% 0.0000 / 0.0000 ok
Qwen3.8 FP8 8192 192 513 64_128_256_True 3 1467.13 1457.65 +0.7% 1.3% / 1.3% 0.0000 / 0.0000 ok
Qwen3.8 FP8 16384 192 513 64_128_256_True 3 2712.16 2689.55 +0.8% 1.2% / 1.2% 0.0000 / 0.0000 ok
Qwen3.8 FP8 32768 192 513 64_128_256_True 3 5045.88 5011.20 +0.7% 1.2% / 1.2% 0.0000 / 0.0000 ok
Qwen3.8 FP8 512 320 513 asm 3 459.81 462.62 −0.6% 14.3% / 14.3% 0.0001 / 0.0001 ok
Qwen3.8 FP8 1024 320 513 asm 3 495.31 497.15 −0.4% 14.1% / 14.1% 0.0001 / 0.0001 ok
Qwen3.8 FP8 2048 320 513 64_128_256_True 3 754.34 752.66 +0.2% 1.7% / 1.7% 0.0000 / 0.0000 ok
Qwen3.8 FP8 4096 320 513 asm 3 1238.48 1239.66 −0.1% 13.9% / 13.9% 0.0001 / 0.0001 ok
Qwen3.8 FP8 8192 320 513 64_128_256_True 3 2068.84 2047.54 +1.0% 1.6% / 1.6% 0.0000 / 0.0000 ok
Qwen3.8 FP8 16384 320 513 64_128_256_True 3 3741.42 3720.37 +0.6% 1.6% / 1.6% 0.0000 / 0.0000 ok
Qwen3.8 FP8 32768 320 513 64_128_256_True 3 6953.90 6902.24 +0.7% 1.6% / 1.6% 0.0000 / 0.0000 ok
Qwen3.8 FP8 512 640 513 asm 3 870.28 864.26 +0.7% 53.8% / 53.8% 0.0004 / 0.0004 ok
Qwen3.8 FP8 1024 640 513 asm 3 995.54 988.36 +0.7% 53.9% / 53.9% 0.0004 / 0.0004 ok
Qwen3.8 FP8 2048 640 513 64_256_128_True 3 1290.02 1278.18 +0.9% 2.1% / 2.1% 0.0000 / 0.0000 ok
Qwen3.8 FP8 4096 640 513 64_256_128_True 3 2264.15 2258.07 +0.3% 1.8% / 1.8% 0.0000 / 0.0000 ok
Qwen3.8 FP8 8192 640 513 64_256_128_True 3 3455.67 3446.31 +0.3% 2.0% / 2.0% 0.0000 / 0.0000 ok
Qwen3.8 FP8 16384 640 513 64_256_128_True 3 6301.86 6274.98 +0.4% 1.9% / 1.9% 0.0000 / 0.0000 ok
Qwen3.8 FP8 32768 640 513 64_256_128_True 3 11399.53 11345.79 +0.5% 1.9% / 1.9% 0.0000 / 0.0000 ok
Qwen3.5-35B 512 128 257 asm 3 134.89 135.16 −0.2% 3.3% / 3.3% 0.0001 / 0.0001 ok
Qwen3.5-35B 1024 128 257 64_128_256_True 3 163.52 158.62 +3.1% 0.6% / 0.6% 0.0000 / 0.0000 ok
Qwen3.5-35B 2048 128 257 64_256_128_True 3 252.52 247.43 +2.1% 0.7% / 0.7% 0.0000 / 0.0000 ok
Qwen3.5-35B 4096 128 257 64_128_256_True 3 380.42 372.80 +2.0% 0.6% / 0.6% 0.0000 / 0.0000 ok
Qwen3.5-35B 8192 128 257 64_128_256_True 3 690.19 680.74 +1.4% 0.7% / 0.7% 0.0000 / 0.0000 ok
Qwen3.5-35B 16384 128 257 64_256_128_True 3 1230.75 1209.12 +1.8% 0.7% / 0.7% 0.0000 / 0.0000 ok
Qwen3.5-35B 32768 128 257 64_256_128_True 3 2385.62 2340.06 +1.9% 0.7% / 0.7% 0.0000 / 0.0000 ok
Qwen3.5-35B 65536 128 257 64_256_128_True 3 4610.54 4546.10 +1.4% 0.7% / 0.7% 0.0000 / 0.0000 ok
Qwen3.5-35B 131072 128 257 64_256_128_True 3 9434.55 9295.21 +1.5% 0.7% / 0.7% 0.0000 / 0.0000 ok
Qwen3.5-35B 512 512 257 CK 3 307.14 307.52 −0.1% 1.5% / 1.5% 0.0000 / 0.0000 ok
Qwen3.5-35B 1024 512 257 64_256_128_True 3 389.98 385.79 +1.1% 1.5% / 1.5% 0.0000 / 0.0000 ok
Qwen3.5-35B 2048 512 257 64_256_128_True 3 658.81 658.60 +0.0% 1.5% / 1.5% 0.0000 / 0.0000 ok
Qwen3.5-35B 4096 512 257 64_256_128_True 3 1015.85 1010.31 +0.5% 1.4% / 1.4% 0.0000 / 0.0000 ok
Qwen3.5-35B 8192 512 257 64_256_128_True 3 1724.92 1708.76 +0.9% 1.5% / 1.5% 0.0000 / 0.0000 ok
Qwen3.5-35B 16384 512 257 64_256_128_True 3 3123.82 3108.96 +0.5% 1.5% / 1.5% 0.0000 / 0.0000 ok
Qwen3.5-35B 32768 512 257 64_256_128_True 3 6051.12 6021.21 +0.5% 1.4% / 1.4% 0.0000 / 0.0000 ok
Qwen3.5-397B 512 128 513 asm 3 412.44 410.77 +0.4% 13.8% / 13.8% 0.0001 / 0.0001 ok
Qwen3.5-397B 1024 128 513 asm 3 446.22 445.95 +0.1% 13.2% / 13.2% 0.0001 / 0.0001 ok
Qwen3.5-397B 2048 128 513 64_128_256_True 3 567.40 567.64 +0.0% 1.6% / 1.6% 0.0000 / 0.0000 ok
Qwen3.5-397B 4096 128 513 64_256_128_True 3 1028.63 1018.31 +1.0% 1.6% / 1.6% 0.0000 / 0.0000 ok
Qwen3.5-397B 8192 128 513 64_256_128_True 3 1626.90 1609.94 +1.1% 1.7% / 1.7% 0.0000 / 0.0000 ok
Qwen3.5-397B 16384 128 513 64_256_128_True 3 3025.59 2987.76 +1.3% 1.7% / 1.7% 0.0000 / 0.0000 ok
Qwen3.5-397B 32768 128 513 64_256_128_True 3 5579.11 5525.54 +1.0% 1.7% / 1.7% 0.0000 / 0.0000 ok
Qwen3.5-397B 65536 128 513 64_256_128_True 3 11110.80 10969.20 +1.3% 1.8% / 1.8% 0.0000 / 0.0000 ok
Qwen3.5-397B 131072 128 513 64_256_128_True 3 22253.08 21474.98 +3.6% 1.8% / 1.8% 0.0000 / 0.0000 ok

Accuracy. Every decoding and prefill point reports status ok. err_ratio is the element-wise ratio outside atol/rtol against the --run_config reference, which quantizes the activations to FP8; its status also accepts logits_diff ≤ 0.01. FlyDSL decoding (BN64, BN128 and direct) reads BF16 activations even with FP8 weights, so its err_ratio is high on main as well (Hunyuan3 BN64: 73%). Where a row moves from CK or ASM, which quantize the activations like the reference, to FlyDSL decoding, err_ratio rises: 9 rows, Hunyuan3 inter_dim 192 E 192 M=256 0.2% → 73.0%; MiniMax-M3 inter_dim 384 E 128 M=16 2.8% → 81.9%; MiniMax-M3 inter_dim 384 E 129 M=8 3.9% → 82.2%; MiniMax-M3 inter_dim 384 E 129 M=16 3.9% → 81.7%; Qwen3.8 FP8 inter_dim 320 E 513 M=8 19.4% → 66.4%; Qwen3.8 FP8 inter_dim 640 E 513 M=4 0.2% → 71.4%; Qwen3.5-35B inter_dim 128 E 257 M=256 0.7% → 49.6%; Qwen3.5-35B inter_dim 512 E 257 M=8 0.1% → 68.4%; Qwen3.5-397B inter_dim 128 E 513 M=256 2.6% → 66.0%. logits_diff, recorded in a separate pass over all 1666 points, is at most 0.0012 on main and 0.0012 on the PR. The prefill rows keep main's kernels and their err_ratio matches main's. On the final tree, op_tests/test_flydsl_moe_gfx942.py, whose reference keeps BF16 activations for the decoding paths, passes with error 0 in both roundings (153 MoE rows, 32 sorted_sum rows), and op_tests/test_moe_2stage.py --no-legacy --csv-filter impl__flydsl_gfx942__ passes all 153 rows (largest logits_diff 0.0071).

The description is updated to these numbers.

@coderfeli coderfeli left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

LGTM

@coderfeli
coderfeli merged commit 269675d into ROCm:main Oct 29, 2026
54 checks passed
solinzby1 pushed a commit that referenced this pull request Nov 2, 2026
* refactor: extract the legacy monolithic kernel into seperate files

* optimize down kernel and add qwen3.5 125b tuned csv

* apply review comments

* apply review comment

* opt batch2-8

* apply review comment

* apply review comments.

* apply review comments

* retune decoding csv: 1-8 tokens +24.3%

* avoid repeated expert IDs of a token

* use Opus aux sort for the sorted_sum route lookup to avoid call cost to `invert_sorted_ids`

* skip -1 pad-row routes in direct decoding; zero per-tensor Gate/Up output

Since #6916, routing gives rows past num_valid_rows expert -1 and weight 0
and expects sorting to drop them.
- Batch-1 and direct-decoding kernels read topk_ids without sorting; they now
  skip -1 routes instead of reading weights and scales in front of expert 0.
- Per-tensor prefill zeroes the Gate/Up output: its Down absmax reads every
  route row, including routes sorting dropped (merged repeated IDs, -1 ids).

Tests: pad_rows routing (-1 ids, zero weights). Weights and scales sit behind
a NaN expert and the Gate/Up output starts as inf, so reading expert -1 or a
skipped row fails the check. New edge cases: per-tensor prefill and B2 direct
decoding with pad rows.

* retune decoding csv on FlyDSL 0.4.0

Decoding rows (<= 256 tokens) start from main's selections. --e2e_tune ran with
TUNE_ONLY=flydslv2,cktile,flydsl,asm, AITER_FMOE_TUNE_EXCLUDE_KERNELS=fmoe_stage1
and AITER_FLYDSL_MOE_BF16_RTA_SIMPLIFIED=1 on MI308X with PTL enabled
(VECTOR,F8); each shape then keeps the lowest median of main's selection and
every eligible FlyDSL config over three interleaved rounds. Three picks that
are slower than main with the default rounding keep main's selection. 65 rows
change kernel versus main; rows above 256 tokens are main's.

* apply review comment

* skip the prefill output clear; batch 1 requires the 16_16_16 tile; 7 decoding rows keep main's selection
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants