Skip to content
All research

2.9×

the X2 Elite's GPU prefill on the M5, Gemma 3 1B Q4_0. On the CPU, the X2 Elite leads by 1.9×

Hardware, 27 July 2026

Apple M5 against Snapdragon X2 Elite.

A MacBook Air against a Qualcomm reference board on AI work: CPU, GPU and NPU, inference and training, with the same llama.cpp release and byte-identical weights.

What we found

  • The M5 wins every llama.cpp GPU test

    With the same llama.cpp release and byte-identical Q4_0 weights, the M5's Metal path runs 2.1× to 3.1× the Adreno X2-90's prefill and 1.4× to 1.9× its decode.

  • The X2 Elite wins every llama.cpp CPU test

    Its 18 Oryon cores beat the M5's 10 on the same llama.cpp CPU build: 1.9× to 3.2× on prefill and 1.1× to 1.4× on decode, so the margins are similar in both directions.

  • The NPUs nearly tie on fp16

    Hexagon does 15.2 TFLOP/s and the Neural Engine 14.1, 8% apart on the same graph and weights. They diverge on int8, where quantise and dequantise nodes cost Hexagon more than the int8 matmul saves at this shape.

  • Training on the X2 is a software story

    PyTorch on Windows on Arm delivers 0.11 to 0.12 TFLOP/s at any thread count, against 1.25 on the M5's CPU. llama.cpp shows the X2's CPU is the faster one, so the 10× deficit is PyTorch's ARM64 Windows kernels, not the processor.

  • Q4_0's speed is not free

    It costs about 17% higher perplexity than Q4_K_M on both machines, in exchange for up to 2.5× CPU prefill. It is the headline format because it is the only one fairly optimised everywhere, not because it is the one to use.

  • The fanless Air held up

    With a desk fan pointed at it, over a 10-minute loop, it held 98.8% of peak prefill, against 99.1% on the cooled X2 board, giving ground only on decode: 89.4% against 98.2%.

The results

The GPU goes to the M5, the CPU to the X2 Elite

Same llama.cpp release and byte-identical Q4_0 files. Every llama.cpp GPU test leans one way and every CPU test the other.

Apple M5 leadsX2 Elite leads

On the GPU

  • Gemma 3 1B prefill, 512 tokens

    M5 5,604, X2 1,921

    2.9×
  • Gemma 3 1B prefill, 2,048 tokens

    M5 5,293, X2 1,712

    3.1×
  • Gemma 3 1B decode

    M5 143.8, X2 74.5

    1.9×
  • Qwen3 8B prefill, 512 tokens

    M5 642.6, X2 306.1

    2.1×
  • Qwen3 8B prefill, 2,048 tokens

    M5 561.7, X2 254.4

    2.2×
  • Qwen3 8B decode

    M5 25.6, X2 18.2

    1.4×

On the CPU

  • Gemma 3 1B prefill, 512 tokens

    M5 889.2, X2 1,689

    1.9×
  • Gemma 3 1B decode

    M5 116.3, X2 127.9

    1.1×
  • Qwen3 8B prefill, 512 tokens

    M5 85.3, X2 270.7

    3.2×
  • Qwen3 8B decode

    M5 17.2, X2 23.4

    1.4×

Tokens per second, with the best thread count per machine on the CPU.

The NPUs: level on fp16, apart on int8

One model exported to both runtimes, with identical GEMMs and weights.

Apple M5, Neural EngineX2 Elite, Hexagon

  • fp16

    GFLOP/s

    M5 14,137
    X2 15,205
  • int8

    GFLOP/s

    M5 15,593
    X2 8,602

The M5 also runs a language model on its NPU: Anemll gives the Neural Engine 2,616 tok/s prefill and 47 tok/s decode on Llama 3.2 1B. The Hexagon has no publicly installable generative runtime.

Training

PyTorch 2.8.0 and an identical script. The X2's number is PyTorch on Windows on Arm, since llama.cpp shows its CPU is the faster one.

Apple M5X2 Elite

  • CPU

    TFLOP/s

    M5 1.25
    X2 0.11 to 0.12, at 4, 12 or 18 threads
  • GPU

    TFLOP/s

    M5 2.30, MPS

    X2: no Adreno backend exists

X2 GPU training is blocked: ggml's OpenCL backend lacks memset_tensor, and the identical binary trains on CPU.

What the usual format costs in speed

Moving Gemma 3 1B from Q4_0 to Q4_K_M. A longer bar is a bigger loss, and the two machines lose in different places.

Apple M5X2 Elite

  • CPU prefill

    M5 −43%
    X2 −60%
  • CPU decode

    M5 −39%
    X2 −15%
  • GPU prefill

    M5 −17%
    X2 −6%
  • GPU decode

    M5 −38%
    X2 −12%

Ten minutes under load

The fanless Air, with a desk fan pointed at it, holds prefill as well as the cooled board and gives ground only on decode. The scale starts at 85%.

Apple M5X2 Elite

85%90%95%100%
  • Prefill kept over 10 minutes

    Apple M5 98.8%, X2 Elite 99.1%

  • Decode kept over 10 minutes

    Apple M5 89.4%, X2 Elite 98.2%

Qwen3 8B Q4_0 on the GPU, the same loop on both. Retention is the steady rate as a share of peak.

Every numberThe llama.cpp, NPU and training results as tables, and perplexityShow
ModelTestApple M5Snapdragon X2 EliteWinner
Gemma 3 1BGPU prefill, 512 tokens5,6041,921M5 2.9×
Gemma 3 1BGPU prefill, 2,048 tokens5,2931,712M5 3.1×
Gemma 3 1BGPU decode14474.5M5 1.9×
Gemma 3 1BCPU prefill, 512 tokens889.2 (10 threads)1,689.3 (12 threads)X2 1.9×
Gemma 3 1BCPU decode116.3 (6 threads)127.9 (8 threads)X2 1.1×
Qwen3 8BGPU prefill, 512 tokens643306M5 2.1×
Qwen3 8BGPU prefill, 2,048 tokens562254M5 2.2×
Qwen3 8BGPU decode25.618.2M5 1.4×
Qwen3 8BCPU prefill, 512 tokens85.3 (10 threads)270.7 (18 threads)X2 3.2×
Qwen3 8BCPU decode17.2 (6 threads)23.4 (12 threads)X2 1.4×
WeightsApple M5Snapdragon X2 Elite
fp1614.1 TFLOP/s (Neural Engine)15.2 TFLOP/s (Hexagon)
int815.6 TFLOP/s (Neural Engine)8.6 TOPS (Hexagon)
Apple M5Snapdragon X2 Elite
CPU1.25 TFLOP/s0.11 to 0.12 TFLOP/s, at 4, 12 or 18 threads
GPU2.30 TFLOP/s (MPS)No Adreno backend exists

Perplexity on an identical corpus

Apple M5Snapdragon X2 EliteAgreement
Gemma 3 1B Q4_034.4694 ± 1.3034.6233 ± 1.310.45%
Gemma 3 1B Q4_K_M29.5493 ± 1.0829.5508 ± 1.080.005%
Quality cost of Q4_0+16.7%+17.2%

llama-perplexity on a byte-identical wikitext-2 corpus, 40 chunks, GPU backend. Lower is better. The two backends agree to 0.005% on Q4_K_M, so both platforms compute the same answers.

How we ran it

Apple M5
MacBook Air (Mac17,3), 4 performance and 6 efficiency cores, 10-core GPU, 16-core Neural Engine, 24 GB at about 153 GB/s, macOS 26.5.2. An external fan was pointed at it during runs.
Snapdragon X2 Elite
X2E88100 on a Qualcomm reference board reached over Qualcomm Device Cloud: 18-core Oryon Gen 3 at 4.03 GHz, Adreno X2-90, Hexagon HTP v81, 32 GB at about 152 GB/s, Windows 11 ARM64.
LLM
llama.cpp b10152, the official prebuilt release on each OS, with GGUF files SHA-256 verified identical and the same arguments. Thread sweeps instead of one fixed count, so neither core layout is favoured.
NPU
One PyTorch source model exported to Core ML and to ONNX Runtime's QNN provider: identical GEMMs, identical weights.
Training
PyTorch 2.8.0 and an identical script. Adreno has no PyTorch backend, so its missing lane is reported as a capability gap.
Sustained
The same 10-minute loop on both, to expose the difference between a fanless Air with a desk fan on it and an actively cooled board.

Limits

18 cores against 10
An actively cooled reference board against a fanless ultrabook is not a per-core or per-watt comparison.
No efficiency claims
There is no equal-quality power measurement on Windows.
The NPU lane
It is a controlled GEMM microbenchmark, not an end-to-end comparison of a language model on each NPU.
One board
Retail X2 laptops will perform below this reference board under sustained load.

Read the methodology before quoting these numbers.

Sources

Keep reading

All research
  • 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.

  • 9 of 9

    models were fastest with NPU prefill

    OpenWeights, 2 to 4 November 2026

    Prefill and decode on CPU, GPU and NPU

    Which processor should prefill and which should decode: nine models, every pairing, on a Snapdragon 8 Elite Gen 5.

  • 42%

    of 24 real tasks with Qwen3.6 on an RTX 4090, against 92% on Copilot Pro+ Auto

    GGUF, October 2026

    When is local Copilot worth it?

    The same Copilot CLI agent on the same real tasks: open-weight GGUF models on an RTX 4090 and a MacBook Air M5, against hosted Copilot.