Issues / #2329

#2329 Community benchmark: RX 7900 XT 20 GB (gfx1100, Windows), engine 0.1.44 - the CPU prompt share and the route tail skip both pay on RDNA3

open · @zspitzer · 0 commentaires · Sur GitHub

BenchmarksSetup & installServer & APIMulti-GPUAMD / HIPModels & quantsDocumentationWindows

Description

Measurements from one machine on 2026-10-13/14, engine 0.1.44 (`ed4773eb`), Qwen3.8-Flash-Next IQ2_XS. The 0.1.43 notes say gfx11 keeps its 0.1.42 behaviour because there was no RDNA3 card to measure on, and the CPU prompt share stays off on HIP for the same reason, so here are numbers for both from a gfx1100 card. No engine source changes; only settings in the run config.

## The machine

- AMD Radeon RX 7900 XT 20 GB (gfx1100), PCIe 4.0 x16 (engine probe 28.2 GB/s host-to-device), Smart Access Memory on, Adrenalin "GPU Undervolt" preset, driver 32.0.31036.15. No display on the card (monitors on the iGPU).
- Ryzen 9 9950X3D (16 cores), 64 GB DDR5-6000 CL30 (2x32, EXPO), PCIe 5.0 NVMe, Windows 11 (10.0.26300).
- Prebuilt HIP engine 0.1.44 (bundled ROCm 10.2.0a20260930, hipBLASLt 100500).
- IQ2_XS, every expert in RAM (35.5 GB arena, fully page-locked), ~7,700-8,300 expert cache slots in VRAM, 131,072-token context, `--kv int8 --kv-resident 32768`, `--spec 4 --mtp`.
- Page file fixed at 32 GB (see the note at the end).

## 1. Stock against tuned, `tools/strata_bench.py --long`

Both runs the same day, 3 runs per test, medians. "Stock" is the config setup wrote (shipped 100500 table, no opt-ins, bare `--prefill auto`, which 0.1.44 caps at 6,144 on Windows HIP). "Tuned" adds:

```text
--prefill auto:32768                      (the engine settles at ~20K-token chunks on this card)
STRATA_HIPBLASLT_TUNING  = the shipped 100500 table + 11 rows for the expert GEMM (PR to follow)
STRATA_PF_FUSED=1  STRATA_PF_GEMM=1  STRATA_PF_SWITCH_MIN_T=4096
STRATA_PREFILL_CPU_SHARE=auto
STRATA_ROUTE_TAIL_SKIP=7
--conversation-cache-mib 6144 --conversation-cache-slots 3
```

| Metric | Stock | Tuned | Change |
|---|---:|---:|---:|
| chat decode tok/s | 77.9 (70.0-89.3) | 81.7 (75.9-94.7) | +4.9% |
| 4K prompt tok/s | 1,220 | 1,214 | flat |
| 16K prompt tok/s | 1,300 | 1,671 | **+28.5%** |
| 32K prompt tok/s | 1,249 | 1,636 | **+31.0%** |
| agent turn first token (s) | 3.11 | 3.23 | +4% |
| agent decode tok/s | 83.8 (73.1-95.0) | 80.2 (67.5-116.9) | -4% (ranges overlap) |

The 16K/32K gain is mostly the prompt chunk (~20K against the 6,144 cap) plus the PF opt-ins and the table rows; the ~20K chunk has run stably here for days, with the fixed page file. The two settings this issue is about show up better in sections 2 and 3: the suite's agent turns mostly read just over the share's 3,072-token limit, and its answers are short at under 16K of context, where few experts miss.

## 2. CPU prompt share (`STRATA_PREFILL_CPU_SHARE=auto`) on gfx1100

Isolated A/B, our own harness, fresh prompts, one run each, the same config with only `STRATA_PREFILL_CPU_SHARE=auto` added: 872 tokens 327 -> 529 tok/s (+62%), 1,408 tokens 445 -> 754 tok/s (+69%); prompts of 6K and up and decode unchanged.

In the suite above (stock against tuned, so several settings differ), the agent session's first-token times split cleanly at the share's 3,072-token limit:

| Agent turn | New tokens read | Stock | Tuned | Change |
|---|---:|---:|---:|---:|
| 0 (nothing cached) | 609 | 2.34-2.39 s | 1.43-1.56 s | **-35%** |
| 2 | ~1,470 | 2.70-2.73 s | 2.00-2.22 s | **-20 to -26%** |
| 1, 3, 4, 5 | 2,862-3,451 | 3.1-3.4 s | 3.1-3.4 s | same |

In a real agent client session (Pi, 78 requests, context to 92K) reads of 500-3,500 new tokens ran at 697 tok/s at 30-60K of context and 523 at 60-90K, against 395 and 365 with the same client on 0.1.41 without the share (all settings together, not the share alone).

`STRATA_PREFILL_CPU_SHARE_MAX=4096` on top (tuned config, suite without `--long`): **4K fresh prompt 1,214 -> 1,445 tok/s (+19.0%)**, 16K flat; 6144 gave the same as 4096. Agent turns of 2.9-3.5K new tokens on a 5-12K cached context did not move with the higher limit. So on this CPU the share pays above 3,072 tokens on fresh prompts too.

Note: with only ~1 GiB of Windows commit left (system-managed page file), 0.1.44 rightly refuses to arm the share by default, and warns; with an explicit `auto` it ran fine here.

## 3. Route tail skip (`STRATA_ROUTE_TAIL_SKIP=7`) on gfx1100

Our harness: one fresh server per arm, 600 generated tokens with thinking on, decode at a short prompt and at ~22K and ~90K of context, one run per arm (MTP acceptance in brackets, since it swings decode):

| Arm | Short | ~22K | ~90K |
|---|---:|---:|---:|
| tail skip off | 71.2 (62%) | 88.3 (90%) | 79.7 (72%) |
| tail skip 7 | 77.2 (67%) | 95.1 (84%) | 90.5 (78%) |

+8% / +8% / +14%, and faster at ~22K even with lower acceptance. A second pair on another day: short 73.2 -> 76.4, ~22K 84.4 -> 102.8 (acceptance 82% -> 89%, so part of that is drafts). Prompt speed unchanged. Decode expert hit rate here is ~89-93%, under the 90%-cached line in most runs.

Two other opt-ins, same harness, for completeness:

- `STRATA_ROUTE_RESIDENT=0.25`: 73.0 / 100.9 / 85.4 (faster at ~22K), but we did not keep it because of the KL in #1737's table at that margin.
- `--adapt-async 1` (arena, one GPU): 71.8 / 79.7 / 86.7, and the log said `asynchronous adaptive tier: 0 rounds, 0 experts swapped in`. Is it expected to stay idle in the arena mode on HIP, or should it have run rounds here?

## 4. Expert-GEMM rows for the gfx1100 100500 table

With `STRATA_HIPBLASLT_VERBOSE=1` the default path had 913 fallbacks, all `f16 N=1280 K=2560 ldy=1280` (the per-expert-group GEMM). The 100401 table has rows for that shape; the 100500 one has none. 11 rows calibrated with `tune_hipblaslt` against hipBLASLt 100500 on this card (T 8 to 2,048; same solution IDs as the 100401 rows) take the fallbacks to 0 and give +2-3% prefill on the default path (+3-4% with the PF opt-ins). The kernels themselves are 4-12x the plain hipBLAS fallback, but a small share of prompt time on this card. I will open a PR with the rows, in the shape of #2148.

## Note: page file

A system-managed page file left this box with 1.1 GiB of commit at the engine's start (limit 82.6 GiB after it grew); 0.1.44's new warning caught it. A fixed 32 GB page file (93.4 GiB limit) removed the warning and also brought 6K/26K prompts back up by 6-8% in our harness (one run each). That matches the page file advice in the docs (#60), as a data point for gfx1100.

The three `strata_bench.py` reports (stock, tuned, share-max 4096: README, results.json, engine log excerpt) are in the attached zip; happy to send them as a PR under `bench/results/` instead if you prefer them there.

Thanks for Strata and for the pace of the releases: it runs an agent all day on this card, and every update has made it faster. Hopefully the gfx11 numbers above help close the "no RDNA3 card to measure on" gap.

[strata-bench-rx7900xt-gfx1100-2026-10-14.zip](https://github.com/user-attachments/files/33408854/strata-bench-rx7900xt-gfx1100-2026-10-14.zip)

Sur le site

Liens install, modèles, releases.