Panther Lake Qwen3.5-9B on the same Core Ultra X7 358H: Xiaomi Book Pro 14 (CachyOS) versus MSI Prestige 14 Flip

We cloned 2604272-SYST-LLAMAPT89 from OpenBenchmarking.org, an MSI Prestige 14 Flip AI+ run of pts/llama-cpp-2.5.0 on the same Intel Core Ultra X7 358H, and compared it to local Phoronix Test Suite 10.8.6 results on the Xiaomi Book Pro 14. Same Qwen3.5-9B-Q8_0 GGUF, same llama.cpp b8933, same flags. The Xiaomi came out ahead by about 2.6x on Vulkan and 26% on CPU BLAS.

Local results: ~/.phoronix-test-suite/test-results/2026-09-18-1952 (Vulkan), cpu-blas-qwen35-tg128 (BLAS), sycl-qwen35-tg128 (SYCL).
Remote result: 2604272-SYST-LLAMAPT89 cloned to ~/.phoronix-test-suite/test-results/2604272-SYST-LLAMAPT89/composite.xml with phoronix-test-suite clone-openbenchmarking-result.

Summary

Test: Qwen3.5-9B-Q8_0 Text Generation 128 (-n 128 -p 0) Xiaomi Book Pro 14 (CachyOS) MSI Prestige 14 Flip (Ubuntu 26.04) 2604272 a/b/c Delta
Vulkan VULKAN -r 100 -fa 1 -m ../Qwen3.5-9B-Q8_0.gguf -n 128 -p 0 12.54 tok/s 12.50:12.55:12.58, 1031.67:1021.78:1018.90s 4.65 / 4.77 / 4.79 avg 4.74 tok/s, 2783.9:2728.4:2720.5s +164% (2.64x)
CPU BLAS BLAS -m ../Qwen3.5-9B-Q8_0.gguf -n 128 -p 0 (OpenBLAS, -t 16) 9.72 tok/s 9.70:9.73:9.73 dev 0.18%, 66.86:66.22:66.28s 7.87 / 7.87 / 7.47 avg 7.74 tok/s, 84.48:86.72:89.69s +26%
SYCL SYCL -r 100 -fa 1 -sm layer 11.68 tok/s 11.72:11.65:11.68, 1125.76:1105.24:1099.80s not tested --

On the Xiaomi, Vulkan beats BLAS by 29% (12.54 versus 9.72), which is what you expect when the iGPU helps. On the MSI the order flips, BLAS beats Vulkan (7.74 versus 4.74). For prompt processing on the MSI, Vulkan is still about 15x faster (see below), so the text generation flip looks like a Vulkan-specific bottleneck on that system or driver rather than a general iGPU problem.

Both systems sit well below the fleet medians reported by phoronix-test-suite info pts/llama-cpp-2.5.0. Vulkan Qwen tg128 median is 62.6 tok/s (10th percentile 13.07, 90th 142), CPU BLAS Qwen tg128 median is 15.07 tok/s. That fleet is dominated by discrete GPUs, so an integrated Arc B390 at around 30W will not match a 4070 or 4080.

The two systems

Xiaomi Book Pro 14 TM2424

Captured from composite.xml and phodevi (2026-09-18-1952, cpu-blas-qwen35-tg128, sycl-qwen35-tg128):

  • CPU: Intel Core Ultra X7 358H at 4.70 GHz, 16C/16T, Panther Lake, 18 MB cache, microcode 0x11c
  • GPU: Intel Arc B390 (Panther Lake iGPU), Intel open-source Mesa, vulkaninfo: uma:1 fp16:1 bf16:1 warp 32 shared 49152
  • Memory: 8 x 4 GB LPDDR5-9600 MT/s Micron (32 GB), MT62F...-026 WT class
  • Disk: 1024 GB YMTC PC411-1TB-D, btrfs compress=zstd:1 KYBER
  • OS: CachyOS rolling, kernel 7.3.0-rc3-1-cachyos-rc x86_64, Wayland, GCC 16.2.1 + Clang 22.1.8 + LLVM 22.1.8
  • Power and tuning: intel_pstate powersave (EPP: performance) plus Platform Profile: performance plus Transparent Huge Pages: always plus xe.enable_psr=0 xe.enable_panel_replay=0 xe.enable_fbc=0 xe.enable_dc=0 (from JSON: kernel-parameters)

MSI Prestige 14 Flip AI+ D3MTG (result 2604272)

Three runs a/b/c from 2026-04-26 to 2026-04-27, same CPU, same user system:

  • CPU: same Intel Core Ultra X7 358H @ 4.70 GHz (16 Cores), microcode 0x114 (two revisions older)
  • Board: MSI Prestige 14 Flip AI+ D3MTG MS-14T2 (E14T2IMS.20E BIOS), chipset Intel Device e47f
  • Memory: 8 x 4 GB LPDDR5-8533 MT/s Micron MT62F2G32D4DS-026 WT (32 GB at 8533, about 12.5% less bandwidth)
  • Disk: 1024GB Micron_2500_MTFDKBA1T0QGN, ext4
  • OS: Ubuntu 26.04 (pre-release at the time), kernel 7.0.0-14-generic x86_64, GNOME Shell 50.1 Wayland, Mesa 26.0.3 OpenGL 4.6 Mesa 26.0.3-1ubuntu1, GCC 15.2.0
  • Tuning: same intel_pstate powersave (EPP: performance) plus Platform Profile: performance, but Transparent Huge Pages: madvise (not always), thermald 2.5.11

The result file at ~/.phoronix-test-suite/test-results/2604272-SYST-LLAMAPT89/composite.xml holds 60 pts/llama-cpp-2.5.0 results. The comparison here uses the Qwen subset to keep it apples to apples.

Test setup, identical where it counts

  • Test profile: pts/llama-cpp-2.5.0 AppVersion b8933 from ggml-org/llama.cpp, b8933.tar.gz SHA256 42ac3680... (see install.sh:9)
  • Model: Qwen3.5-9B-Q8_0.gguf, 8.86 GiB, 8.95B params, Q8_0, 9527502048 bytes from Hugging Face Unsloth via downloads.xml:23
  • Scale: Tokens Per Second HIB, TimesToRun 3. The wrapper ~/llama-cpp runs build/bin/llama-bench -t $NUM_CPU_PHYSICAL_CORES $LLAMA_BENCH_ARGS > $LOG_FILE (-t 16 on both machines)
  • Builds on Xiaomi (~/.phoronix-test-suite/installed-tests/pts/llama-cpp-2.5.0/):
    • llama.cpp-BLAS/build/bin/llama-bench, cmake -DGGML_BLAS=ON -DGGML_BLAS_VENDOR=OpenBLAS
    • llama.cpp-VULKAN/build/bin, prebuilt llama-b8933-bin-ubuntu-vulkan-x64.tar.gz with libggml-vulkan.so
    • llama.cpp-SYCL, icx/icpx GGML_SYCL_F16=ON (oneAPI), tested as sycl-qwen35-tg128
# Your runs
PRESET_OPTIONS='llama-cpp.backend=CPU BLAS;llama-cpp.model=Qwen3.5-9B-Q8_0;llama-cpp.test=Text Generation 128' \
TEST_RESULTS_IDENTIFIER='CPU-BLAS-Qwen3.5-tg128' \
TEST_RESULTS_NAME='cpu-blas-qwen35-tg128' \
./phoronix-test-suite batch-benchmark pts/llama-cpp-2.5.0


# Manual equivalent
~/.phoronix-test-suite/installed-tests/pts/llama-cpp-2.5.0/llama.cpp-BLAS/build/bin/llama-bench \
  -t 16 -m ../Qwen3.5-9B-Q8_0.gguf -n 128 -p 0   # tg128

Results in detail

Qwen3.5-9B-Q8_0 text generation 128, the headline

Xiaomi:

# 2026-09-18-1952 — VULKAN -r 100 -fa 1 -m ../Qwen3.5-9B-Q8_0.gguf -n 128 -p 0
Value: 12.54 | Raw: 12.5:12.55:12.58 | JSON run-times 1031.67:1021.78:1018.90
Log: | qwen35 9B Q8_0 | 8.86 GiB | 8.95 B | Vulkan | 99 | 16 | 1 | tg128 | 12.50 ±0.06 | build: dcad77cc3 (8933)


# cpu-blas-qwen35-tg128 — BLAS -m ../Qwen3.5-9B-Q8_0.gguf -n 128 -p 0
Value: 9.72 | Raw: 9.7:9.73:9.73 | run-times 66.86:66.22:66.28 dev 0.18%


# sycl-qwen35-tg128 — SYCL -r 100 -fa 1 -sm layer -m ../Qwen3.5-9B-Q8_0.gguf -n 128 -p 0
Value: 11.68 | Raw: 11.72:11.65:11.68 | run-times 1125.76:1105.24:1099.80

MSI 2604272 (a/b/c triple):

# VULKAN -r 100 -fa 1 -m ../Qwen3.5-9B-Q8_0.gguf -n 128 -p 0
a 4.65  2783.92s | b 4.77 2728.40s | c 4.79 2720.57s  avg 4.74


# BLAS -m ../Qwen3.5-9B-Q8_0.gguf -n 128 -p 0
a 7.87  84.48s | b 7.87 86.72s | c 7.47 89.69s  avg 7.74

Vulkan is 2.64x higher in throughput on the Xiaomi and takes far less wall time even though both use -r 100. The MSI Vulkan run needed about 45 minutes per repetition, the Xiaomi about 17. BLAS is also about 20% faster on the Xiaomi (66s versus 86s average).

Prompt processing, where the iGPU should help (MSI data, not yet run on Xiaomi)

So far the Xiaomi has only run tg128. The MSI data shows the usual pattern. Text generation is limited by memory latency and is weak on iGPUs, prompt processing is compute bound and Vulkan pulls ahead:

Qwen3.5 pp MSI Vulkan avg MSI BLAS avg Vulkan uplift
512 -n 0 -p 512 372.65 / 372.02 / 387.79 -> 377.2 143/142/138s 24.23 / 24.23 / 24.39 -> 24.28 128/127/121s 15.5x
1024 -n 0 -p 1024 354.08 / 359.16 / 377.16 -> 363.5 300/294/281s 24.41 / 24.31 / 24.36 -> 24.36 249s 14.9x
2048 -n 0 -p 2048 373.66 / 374.82 / 369.00 -> 372.5 561/559/566s 24.38 / 24.28 / 24.34 -> 24.33 503s 15.3x
# To fill the gap on your Xiaomi (est 30-40 min):
PRESET_OPTIONS='llama-cpp.backend=CPU BLAS;llama-cpp.model=Qwen3.5-9B-Q8_0;llama-cpp.test=Prompt Processing 512,Prompt Processing 1024,Prompt Processing 2048' \
TEST_RESULTS_IDENTIFIER='CPU-BLAS-Qwen3.5-pp' TEST_RESULTS_NAME='cpu-blas-qwen35-pp' \
./phoronix-test-suite batch-benchmark pts/llama-cpp-2.5.0


PRESET_OPTIONS='llama-cpp.backend=Vulkan;llama-cpp.model=Qwen3.5-9B-Q8_0;llama-cpp.test=Prompt Processing 512,Prompt Processing 1024,Prompt Processing 2048' \
TEST_RESULTS_IDENTIFIER='Vulkan-Qwen3.5-pp' TEST_RESULTS_NAME='vulkan-qwen35-pp' \
./phoronix-test-suite batch-benchmark pts/llama-cpp-2.5.0

Fleet medians tell the same story. Vulkan Qwen pp2048 median is 3774 tok/s (10th 1049, 90th 9178) versus CPU BLAS pp2048 median 97.71 tok/s. The MSI at 372 tok/s for Vulkan PP is low for the fleet, which is expected for integrated graphics versus discrete, but it is still 15x its own BLAS.

Other models in 2604272, sanity check

The MSI file covers 60 tests. A few examples for context:

  • gpt-oss-20b-Q8_0 tg128: Vulkan 11.60/11.55/11.57 vs BLAS 23.19/22.54/19.75, BLAS wins TG again on that system
  • gpt-oss-20b-Q8_0 pp2048: Vulkan 530/528/519 vs BLAS 40.9/40.8/40.8, Vulkan 13x
  • GLM-4.7-Flash-IQ4_XS tg128: Vulkan 16.0/15.8/15.4 vs BLAS 17.4/13.8/14.0
  • Llama-3.1-Tulu-3-8B-Q8_0 tg128: Vulkan 4.79/4.81/4.68 vs BLAS 8.83/8.52/8.62
  • Mistral-7B tg128: Vulkan 5.02/5.03/5.00 vs BLAS 9.74/9.68/9.16
  • DeepSeek-R1-Distill-Llama-8B tg128: Vulkan 4.74/4.76/4.76 vs BLAS 8.74/9.23/8.75
  • granite-3.0-3b tg128: Vulkan about 29.8 vs BLAS not in snippet, the only case where Vulkan clearly wins TG on the MSI is the small 3B model

Overall on the MSI, Vulkan only beats BLAS for TG on large prompt processing or small models. The Xiaomi changes that pattern for Qwen TG.

Why the gap

Six differences that together add up. No single one explains 2.64x, but the stack does. The fact that BLAS differs by only 26% suggests the Vulkan path is the outlier.

  1. Memory bandwidth, 9600 versus 8533. Text generation is bandwidth bound. 8x4GB LPDDR5-9600 is about 76.8 GB/s per channel times eight, versus 68.2 GB/s at 8533, roughly 12.5% more. The YMTC versus Micron 2500 SSD does not affect tokens per second.

  2. Huge pages. Xiaomi uses Transparent Huge Pages: always, MSI uses madvise. For GGUF mmap plus llama-bench this can be 10 to 20% on TG alone.

  3. Governor, EPP and platform profile. Both report intel_pstate powersave (EPP: performance) plus performance platform profile, but CachyOS sets intel_pstate through Ananicy-cpp on kernel 7.3.0-rc3, MSI ran stock Ubuntu 7.0.0-14-generic. The PTS perf tip still triggers: echo performance | sudo tee /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor would likely help both by 5 to 15%.

  4. Mesa and Vulkan driver. Xiaomi runs a stock CachyOS Mesa (pre 26.x), MSI ran Mesa 26.0.3-1ubuntu1 from a pre-release Ubuntu 26.04. Newer is not always faster for ggml-vulkan, the uma:1 fp16:1 path regressed for Qwen Q8_0 TG in that window. Both used the same llama-b8933-bin-ubuntu-vulkan-x64.tar.gz binary, so the driver stack is the variable.

  5. Thermals and BIOS. Xiaomi XMAPT4B0P0A0A BIOS versus MSI E14T2IMS.20E. Different fan curves and 30W cTDP behavior matter for 100-repetition Vulkan runs (45m versus 17m). Check sensors and system-logs for throttling. The longer MSI runtime hints at thermal throttling.

  6. Microcode. 0x11c versus 0x114 is minor, but Panther Lake microcode did touch E-core scheduling for hybrid.

How it compares to the fleet

From phoronix-test-suite info pts/llama-cpp-2.5.0 (April to August, about 150 samples per config):

  • CPU BLAS Qwen tg128, median 15.07 (10th 6.09, average deviation 0.69%, about 156s per run), Xiaomi 9.72, MSI 7.74
  • Vulkan Qwen tg128, median 62.6 (10th 13.07, 90th 142, about 564s per run), Xiaomi 12.54, MSI 4.74
  • CPU BLAS Qwen pp2048, median 97.71
  • Vulkan Qwen pp2048, median 3774

The Xiaomi at 12.54 sits just under the 10th percentile for Vulkan TG, which makes sense for an iGPU. The MSI at 4.74 sits below it. For CPU, both are low in the middle of the pack because of the powersave governor. Switching to performance should move the Xiaomi closer to the 15 tok/s median.

Reproducibility

Clone the comparison:

cd ~/Code/phoronix-test-suite-master
./phoronix-test-suite clone-openbenchmarking-result 2604272-SYST-LLAMAPT89
./phoronix-test-suite result-file-to-text 2604272-SYST-LLAMAPT89 | less
./phoronix-test-suite result-file-to-text 2026-09-18-1952
./phoronix-test-suite result-file-to-text cpu-blas-qwen35-tg128
./phoronix-test-suite result-file-to-text sycl-qwen35-tg128

Merge and graph:

phoronix-test-suite merge-results 2026-09-18-1952 cpu-blas-qwen35-tg128 sycl-qwen35-tg128 2604272-SYST-LLAMAPT89
phoronix-test-suite result-file-to-html merged
phoronix-test-suite result-file-to-json merged

Inspect locally:

./phoronix-test-suite info pts/llama-cpp-2.5.0
cat ~/.phoronix-test-suite/test-results/2026-09-18-1952/composite.xml
cat ~/.phoronix-test-suite/test-results/cpu-blas-qwen35-tg128/composite.xml
cat ~/.phoronix-test-suite/test-results/sycl-qwen35-tg128/composite.xml
cat ~/.phoronix-test-suite/test-results/2604272-SYST-LLAMAPT89/composite.xml

Test binaries (Xiaomi): ~/.phoronix-test-suite/installed-tests/pts/llama-cpp-2.5.0/llama.cpp-{BLAS,VULKAN,SYCL}/build/bin/llama-bench
Model: https://huggingface.co/unsloth/Qwen3.5-9B-GGUF/resolve/3885219b.../Qwen3.5-9B-Q8_0.gguf 9527502048 bytes Q8_0

What is next

  • Run pp512/1024/2048 on the Xiaomi. Expect around 350 to 400 tok/s Vulkan versus about 24 tok/s BLAS if it follows the MSI pattern (15x uplift).
  • Compare SYCL and Vulkan. SYCL at 11.68 versus Vulkan at 12.54 is close, try SYCL for prompt processing as well (SYCL -r 100 -fa 1 -sm layer). Intel oneAPI SYCL is the native Arc path.
  • Try the performance governor: echo performance | sudo tee /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor and re-run. PTS already flags this.
  • Test THP on the MSI side: echo always | sudo tee /sys/kernel/mm/transparent_hugepage/enabled would check hypothesis 2.

Conclusion

Both machines use the same Panther Lake die. For Qwen3.5-9B-Q8_0 at Q8_0, the Xiaomi Book Pro 14 benefits from faster LPDDR5-9600, THP: always, a cooler CachyOS stack and an older Mesa. That combination makes its Arc B390 useful for text generation, about 29% above its own CPU and about 164% above the MSI Vulkan result. The MSI Vulkan TG looks like an outlier. Its BLAS is solid and its prompt processing numbers show the iGPU can be 15x the CPU when the workload fits.

Tuning matters as much as the silicon for generation latency on a thin and light.