About 7×
the GPU matmul of a Dimensity 9500s on a Snapdragon 8 Elite
Hardware, 13 and 27 July 2026
Snapdragon 8 Elite against Dimensity 9500s.
What unprivileged code can do for AI on two flagship phone chips: NPU, CPU, GPU and on-device training.
What we found
The Snapdragon leads every measured workload
About 3× on NPU int8, about 2.5× on CPU LLM throughput and about 7× on GPU matmul, 479 against 67 GFLOP/s.
The NPUs are real, reachable and inference-only
On both chips the gaps are software. NPU training is architecturally impossible on either.
They invert on openness
On MediaTek the GPU compute door is Vulkan and OpenCL is walled off. On Qualcomm OpenCL is public and tuned while Vulkan quantized inference is broken. The Snapdragon platform is the more open of the two: public OpenCL, public FastRPC, redistributable QNN.
The best recipe is opposite on each
GPU OpenCL prefill with CPU decode on the Snapdragon. CPU prefill with GPU Vulkan decode on the Dimensity.
Thermal headroom beats a performance mode
Re-benchmarked in HyperOS Ultimate mode while charging, the Dimensity phone gained modestly on the CPU, prefill 74 to 79 tok/s, but GPU matmul fell from 67 to 45 GFLOP/s over a 17-minute back-to-back suite.
The results
The Snapdragon leads every test
NPU, CPU and GPU, with the same workloads on both chips. Each row has its own scale.
Snapdragon 8 EliteDimensity 9500s
NPU int8, 8-layer FC
GOPS
About 3×
8 Elite 4,307D9500s 1,100 to 1,470Gemma 3 1B prefill on the CPU
tok/s
About 2.6×
8 Elite 171 to 173D9500s 58 to 74Gemma 3 1B decode on the CPU
tok/s
About 2.4×
8 Elite 62 to 64D9500s 22 to 31Gemma 3 1B prefill on the GPU
tok/s
About 18×
8 Elite 717 to 723D9500s about 39Gemma 3 1B decode on the GPU
tok/s
About 1.6×
8 Elite 41.5 to 42.5D9500s about 27Matmul on the GPU, 4096³ f32
GFLOP/s
About 7×
8 Elite 479D9500s 67Transformer-layer training step on the GPU
GFLOP/s
About 8×
8 Elite 403D9500s about 50
Where a result is a range, from benchmarks run twice, the bar is solid to the low end and faint to the high end. Multiples use the middle of each range.
What each GPU adds over its own CPU
This compares each chip with itself, so it shows how much the GPU is worth on that phone.
Snapdragon 8 EliteDimensity 9500s
Matmul, 4096³ f32
GPU as a multiple of the CPU
8 Elite 6.9×D9500s 1.69×Transformer-layer training step
GPU as a multiple of the CPU
8 Elite 6.5×D9500s 1.1× to 1.4×
The best recipe is opposite on each chip
Which processor to use for each job, for Gemma 3 1B in tokens per second.
Snapdragon 8 Elite
Prefill
- GPU, OpenCL717 to 723, the pick
- CPU171 to 173
Decode
- GPU, OpenCL41.5 to 42.5
- CPU62 to 64, the pick
Dimensity 9500s
Prefill
- GPU, Vulkanabout 39
- CPU58 to 74, the pick
Decode
- GPU, Vulkanabout 27, the pick
- CPU22 to 31
Every test, side by sideThe full comparison as a table, including APIs and trainingShowHide
| Test | Snapdragon 8 Elite | Dimensity 9500s |
|---|---|---|
| NPU | Hexagon HTP V79 | MDLA (NPU 890) |
| NPU runtime access | QNN 2.48 from Maven Central and public FastRPC, no SDK gate | NeuroPilot 8.2.26, preinstalled as public system libraries |
| NPU int8, 8-layer FC (32×2048×2048) | 4,307 GOPS, 0.50 ms | 1,100 to 1,470 GOPS, 1.46 ms |
| NPU fp16 inference | 1,089 GFLOP/s | Runs, not quantified |
| NPU training | Architecturally impossible | Architecturally impossible |
| CPU | 2× Oryon at 4.09 GHz and 6× at 2.78 GHz | 1× X925 at 3.73 GHz, 3× X4 and 4× A720 |
| Gemma 3 1B Q4, CPU prefill and decode, 8 threads | 171 to 173 and 62 to 64 tok/s | 58 to 74 and 22 to 31 tok/s |
| GPU | Adreno 830 | Immortalis-G925 MC11 |
| Working GPU compute API | OpenCL (public library; Vulkan broken for quantized inference) | Vulkan (OpenCL blocked by namespace) |
| Gemma 3 1B Q4, GPU prefill and decode | 717 to 723 and 41.5 to 42.5 tok/s, OpenCL | About 39 and about 27 tok/s, Vulkan |
| Matmul, 4096³ f32 | 479 GFLOP/s, 6.9× its CPU | 67 GFLOP/s, 1.69× its CPU (coopmat and f32 only) |
| Transformer-layer training step, GPU and CPU | 403 and 62.5 GFLOP/s, 6.5×, OpenCL | About 50 and 37 GFLOP/s, 1.1× to 1.4× |
| GPU training (ggml MLP and AdamW) | Vulkan, no flags, converges identically to CPU | Vulkan with GGML_VK_DISABLE_COOPMAT=1, converges worse |
| Best local LLM recipe | GPU OpenCL prefill and CPU decode | CPU prefill and GPU Vulkan decode |
Ranges are from benchmarks run twice. LLM throughput is llama-bench with a 128-token prompt and 64 generated tokens.
How we ran it
- Phones
- Dimensity 9500s (mt6991) in a POCO X8 Pro Max. Snapdragon 8 Elite (SM8750) in a QRD reference device on Qualcomm Device Cloud.
- NPU workload
- 8 chained int8 fully connected layers, M=32 and K=N=2048, plus a single fp16 layer.
- LLM workload
- llama.cpp, Gemma 3 1B Q4_K_M.
- GPU workload
- ggml f32 mul_mat at 1024, 2048 and 4096 cubed.
- Training
- The same 385-parameter MLP, AdamW, MSE, 60 epochs.
Limits
- Access paths
- A retail phone through Termux against a QRD through adb and the NDK. Both execute as unprivileged user code; the QDC shell happens to be root, but nothing measured uses root-only facilities.
- NPU drivers
- MediaTek's Neuron Adapter is called raw. Qualcomm's QNN is driven through ONNX Runtime's QNN provider with CPU fallback disabled, because raw QNN graph composition needs gated SDK headers. Both measure a quantized graph fully resident on the NPU.
- llama.cpp builds
- MediaTek numbers were taken on 2026-07-13 on the then-current llama.cpp, Snapdragon numbers on commit 8e8681e on 2026-07-27. Treat small differences between the chips accordingly.
- Thermals
- The phone was benched warm and cold, and the ranges are reported. The QDC QRD idles cool and varied under 4% across runs.