AMD XDNA2 NPU — Independent Research Survey

← Phase 11  ·  Literature review of NPU performance, AIE utilisation, and LLM inference across vendors.  ·  GitHub

Ryzen AI MAX 385  ·  RyzenAI-npu5 (XDNA2)  ·  Survey date: 2026-03-30
0

Executive Summary

Key findings from independent research, academic papers, and community reports

Core finding

Our Phase 11 discovery of 0.6% AIE utilisation is consistent with the academic literature for unoptimised kernels. Expert-optimised GEMM kernels on the same XDNA2 silicon achieve 38 TOPS (76% of peak) — a 127× improvement. The gap is entirely in the AIE kernel, not host-side dispatch.

Industry-wide pattern

No vendor’s NPU beats its companion GPU for LLM token generation. Intel, Qualcomm, Apple, and AMD all show the same structural mismatch: LLM decode is memory-bandwidth-bound, not compute-bound. TOPS ratings are irrelevant when every token must read the full model weights from shared DRAM.

Project context

This project appears to be the furthest any independent developer has publicly reached with custom NPU workloads on XDNA2. No other llama.cpp NPU backend exists for any vendor. Community sentiment is that NPU software stacks across all vendors remain immature.

1

XDNA2 Independent GEMM Benchmarks

What others have achieved on the same silicon

“Striking the Balance” — arXiv:2512.13282 (Dec 2025)

Ramezani et al. performed the most rigorous independent GEMM benchmark on both XDNA (Phoenix) and XDNA2 (Strix Point) NPUs, using optimised kernels with DMA-compute overlap and proper vectorisation.

Precision XDNA (10 TOPS peak) XDNA2 (50 TOPS peak) XDNA2 % of peak
int8 × int8 6.76 TOPS 38.05 TOPS 76.1%
int8 × int16 6.05 TOPS 31.52 TOPS 63.0%
int8 × int32 4.57 TOPS 25.31 TOPS 50.6%
bf16 × bf16 3.14 TOPS 14.71 TOPS 29.4%

Key findings: L1 core memory utilisation 94–97%. Effective DRAM bandwidth ~50 GB/s (XDNA2). Without DMA-compute overlap, a 28% performance drop occurs. Optimal GEMM sizes were ~4K × 4K × 4K.

Our int8 × int32 pipeline maps to 25.31 TOPS achievable (50.6%) — not the full 38 TOPS of int8 × int8. Even so, that is ~8,600× our measured 2.93 GOPS. The kernel quality gap is enormous.

NPU-Only LLM Inference — 7shi / Zenn.dev (Oct 2025)

Direct comparison on Ryzen AI Max+ 395, 64 GB VRAM, using Ollama (CPU/GPU) vs FastFlowLM (NPU). Model: gpt-oss:20b.

Device Prompt eval (t/s) Generation (t/s)
GPU (Vulkan) 401.46 44.58
CPU 92.58 17.04
NPU (FastFlowLM) 18.20 10.94

Author’s conclusion: “The GPU was the fastest, the CPU showed higher performance than the NPU, and the NPU was the slowest.” GPU recommended for desktop LLM use. FastFlowLM is AMD-backed purpose-built NPU software — this represents the best-case NPU scenario.

FastFlowLM Best-Case Numbers
Model Tokens/sec NPU power
Llama 3.2 1B Q4_1 66 <2W
Llama 3.2 3B 28 <2W
GPT-OSS 20B (MoE) 19 <2W

The NPU’s sole advantage is power efficiency: ~2W vs ~25W for GPU. Over 10× better perf/watt claimed. For battery-powered, background inference this matters. For throughput, it does not.

2

AIE Utilisation Spectrum: 0.6% to 98%

Where unoptimised kernels sit in the literature

Key insight

The 0.6% utilisation we measured is the expected result for a first-pass kernel without vectorisation, DMA double-buffering, and compute-communication overlap. It is not an anomaly — it is well-documented in the literature.

Expert-Optimised Kernels (80–98%)
Source Hardware Data type Utilisation
AIE4ML (arXiv:2512.15946) Versal VEK280, 304 tiles i8 × i8 95.8% single-kernel
AIE4ML VEK280, full array i8 end-to-end 82.2% (160 / 194 TOPS)
GAMA (arXiv:2504.09688) Versal VEK280, 288 tiles int8 85% (165 TOPS)
GAMA VEK280 bf16 86% (83 TFLOPS)
ARIES (FPGA 2025) Versal VCK190 INT8 ~87% (45.94 TOPS)
Automated / Mid-Range (30–80%)
Source Hardware Data type Utilisation
MLIR-AIR (arXiv:2510.14871) AIE I16 78.7%
MLIR-AIR AIE I8 59.1%
FCCM 2024 (arXiv:2404.11066) Versal VC1902 int8 58.9–60.1%
MLIR-AIR AIE BF16 48.6%
Naive / Unoptimised (0.5–10%)
Source Hardware Observation Context
NPUEval (arXiv:2507.14403) XDNA ~10% mean vectorisation LLM-generated AIE kernels
DPUV4E (arXiv:2506.11441) Versal ACAP <5% of theoretical Small BERT MM layers
This project (Phase 11) XDNA2 Strix Halo 0.6% mlir-aie whole_array example kernel
Optimisation Effort vs. Utilisation

The literature reveals a clear progression. Each step requires substantially more effort than the last:

Optimisation level Expected utilisation Effort
Naive scalar kernel, single tile 0.5–5% Hours
Vectorised kernel, single tile 10–30% Days
Vectorised + double-buffered, single tile 50–80% Days–weeks
Expert-optimised, multi-tile GEMM 80–98% Weeks–months
Full array, end-to-end with overhead 60–87% Months (GAMA/ARIES level)
3

Why 0.6% Happens: Root Causes from Literature

DMA stalls, missing vectorisation, and compute-communication overlap

Five factors identified in the academic literature explain the gap between our 0.6% and the 76–98% achieved by expert kernels:

# Factor Impact Source
1 No DMA-compute overlap 28% loss from this alone Striking the Balance
2 Missing vectorisation ~10% mean for auto-generated code NPUEval
3 No double-buffering / ping-pong DMA AIE stalls completely during data movement GAMA, AIE4ML
4 Sub-optimal tile sizes for 64 KB SRAM Wasted MACs on padding DPUV4E
5 int8×int32 accumulation (our pipeline) 50.6% peak vs 76.1% for int8×int8 Striking the Balance

The single biggest gain comes from DMA pre-fetch / double-buffering: overlap the next tile’s DMA transfer with the current tile’s compute. Without this, compute duty cycle drops to compute_time / (compute_time + dma_time), which can be <1% for bandwidth-limited transfers.

The GAMA paper quantifies compute-to-communication ratio (γ) ranging from 0.72 to 0.96. For int8×int32 (our pipeline), γ = 0.72 — meaning 28% of time is spent waiting for data even in the optimised case. Custom buffer placement recovers 12% of lost performance from memory stalls.

4

NPU vs GPU for LLM Inference: Industry-Wide Comparison

The structural mismatch is not AMD-specific

Universal finding

No vendor’s NPU beats its companion GPU for LLM token generation. This is a structural architectural mismatch, not a software maturity issue.

Cross-Vendor Decode Performance
Vendor NPU NPU decode GPU decode Source
AMD (this project) XDNA2 (50 TOPS) ~0.7 t/s 44 t/s (Vulkan) Phase 11
AMD (FastFlowLM) XDNA2 10.94 t/s 44.58 t/s 7shi / Zenn.dev
Intel NPU 4 (48 TOPS) ~2.9 t/s (Llama3-8B) ~5.3 t/s NITRO (arXiv:2412.11053)
Qualcomm Hexagon (45 TOPS) ~18–20 t/s comparable ASPLOS’25
Apple ANE (38 TOPS) CPU beats ANE 30–40 t/s (Metal) Orion (arXiv:2603.06728)
Hailo Hailo-10H 6.9 t/s 131.7 t/s (RTX 4050) arXiv:2603.23640
Why TOPS ≠ LLM Performance

Autoregressive LLM decode has fundamentally different characteristics from the workloads NPUs were designed for:

LLM decode characteristic NPU design assumption
Single token at a time (batch=1) High batch parallelism
Variable sequence length Fixed static shapes
Memory-bandwidth-bound Compute-bound
Requires FP16/BF16 for LayerNorm, softmax Optimised for INT8/INT4
Dynamic KV cache growing per token Static tensor shapes

The memory bandwidth wall: During decode, the entire model weights must be read from DRAM for every single token. A 7B INT4 model is ~3.5 GB. At LPDDR5X-8533 bandwidth (~68 GB/s), the theoretical maximum is ~19 tok/s regardless of NPU compute capacity. The NPU shares DRAM bandwidth with the CPU and iGPU — it has no dedicated memory channel.

Vendor-Specific Findings
Intel (NITRO, arXiv:2412.11053)

INT8 and INT4 symmetric quantisation compilation failed entirely on Intel NPU. GPU consistently 1.8–2.3× faster across all configurations. Intel’s own docs acknowledge decode is “mostly limited by DRAM bandwidth rather than compute capability.”

Qualcomm (ASPLOS’25, arXiv:2407.05858)

FP16 matmul on NPU is 159× slower than CPU INT8. Per-group quantisation (needed for activation outliers) incurs 10.7× overhead. Graph compilation takes 11+ seconds per prompt for variable-length inputs. NPU compiler lacks native RoPE, flash attention, dynamic KV caching.

Apple (Orion, arXiv:2603.06728)

ANE has 2.3 ms IOSurface round-trip overhead per dispatch. CPU baseline (283 tok/s on GPT-2 124M) outperforms ANE decode (170 tok/s). llama.cpp and MLX both ignore the ANE entirely and run on GPU through Metal.

5

Developer Ecosystem & Community Reports

What independent developers have experienced with XDNA NPUs

Community sentiment

Across Reddit (r/LocalLLaMA, r/AMD), Phoronix, Hacker News, and developer blogs, the overwhelming sentiment is: “Great hardware, nonexistent software stack.”

Key observations from community reports:

Source Finding
r/LocalLLaMA NPU limited to INT8 ONNX models through AMD’s pipeline. No general-purpose compute API. Multiple users report NPU sitting completely idle.
Phoronix Kernel driver landed (Linux 6.11+) but userspace tooling essentially nonexistent. XRT described as “designed for FPGAs first, NPUs second.”
Framework Community Hardware detection works but no practical inference path on Linux. Windows-only for LLM acceleration.
GitHub xdna-driver Active issues about driver/toolchain version mismatches. Linux driver “lags about a year” behind AMD’s internal implementation.
AMD’s own forums Support threads about Ryzen AI SDK installation failures. Setup process described as “fragile.”

No upstream llama.cpp NPU backend exists for any vendor. A ggml-hsa branch for AMD was discussed in llama.cpp issue #14377 but auto-closed for inactivity. AMD has not contributed an NPU backend. The official AMD path is Windows-only ONNX Runtime GenAI.

This project’s approach — direct XRT dispatch with custom xclbin kernels on Linux — is essentially what no one outside AMD has successfully done for a production workload.

6

Path Forward: What Would Close the Gap

Kernel optimisation priorities from the literature

Prioritised kernel improvements
  • DMA double-buffering (ping-pong): Overlap next tile’s DMA with current tile’s compute. Biggest single gain — 28% recovery from this alone (Striking the Balance). Requires restructuring the ObjectFIFO pipeline in mlir-aie.
  • Vectorised int8 MAC: Fully utilise the 16-wide int8 SIMD lanes on AIE2P. Current whole_array kernel may run scalar or under-vectorised. NPUEval shows ~10% mean vectorisation for auto-generated code.
  • Larger per-core tiles: Current micro-tiles are 64×64×64. The 64 KB local SRAM per core can fit larger tiles, reducing DMA overhead relative to compute. GAMA uses carefully tuned tile sizes for 98–100% memory utilisation.
  • Block FP16: XDNA2-specific format sharing one exponent across a block of values. AMD claims INT8-equivalent TOPS at FP16-class accuracy. Would improve quantisation quality without throughput loss.
  • Dedicated LLaMA kernel: The whole_array example is general-purpose. A kernel optimised for specific (M, K, N) shapes from LLaMA layers could achieve significantly higher utilisation.
  • AMD Ryzen AI SDK kernels: FastFlowLM achieves 66 tok/s on Llama 3.2 1B — orders of magnitude better than our kernel. AMD’s proprietary kernels are not compatible with the open XRT dispatch model used here, but their existence proves the silicon is capable.
Realistic targets

With DMA double-buffering and vectorisation (days–weeks of mlir-aie kernel work), the literature suggests 50–80% utilisation is achievable — translating to 12.5–20 TOPS for our int8×int32 pipeline. This would make NPU prefill competitive with Vulkan for small context. However, NPU decode would remain bandwidth-bound and uncompetitive.

Structural limitation

Even with perfect kernel utilisation, NPU LLM decode cannot beat GPU decode. The 4 MB on-chip SRAM cannot hold model weights; every dispatch requires DRAM reads through shared LPDDR5 bandwidth. The NPU has no dedicated memory channel. This is a hardware constraint, not a software one.

7

XDNA2 Architecture Reference

Hardware specifications from technical deep-dives

Generation Comparison
Feature XDNA (Phoenix) XDNA2 (Strix Point/Halo)
Array topology 4×5 (20 tiles) 4×8 (32 tiles)
MACs/tile/cycle (int8) 128 256 (2×)
Peak INT8 TOPS 10–16 50–55
L2 SRAM 2560 KB 4096 KB
Tile local SRAM 64 KB 64 KB (unchanged)
Cascade bus 384-bit 512-bit
Concurrent contexts 6 16
BF16 / Block FP16 BF16 only BF16 + Block FP16
Memory Hierarchy

Per compute tile: 64 KB SRAM (4 banks × 16 KB). No caches — fixed-latency, software-managed. Dedicated DMA engines independent of compute.

Per memory tile (1 per column): 512 KB scratchpad, serves as L2 for 4 compute tiles in its column.

On-chip aggregate: ~800 GB/s SRAM bandwidth. 512-bit cascade bus at 80 GB/s.

Off-chip: Shared LPDDR5/5X with CPU and iGPU. No dedicated NPU memory channel. LPDDR5X-7500: ~120 GB/s shared.

Programming Model

Explicit data movement: The programmer must describe ALL data movement via circuit- or packet-switched routes. No automatic prefetching.

No caches, no stalling: The compiler must schedule all instructions to avoid hazards. Powerful for deterministic throughput but brutal for programmability.

Vectorisation is hard: NPUEval shows even GPT-4.1 achieves only 71.6% functional pass rate on AIE kernel compilation after 5 iterative attempts (29.4% on first try).

8

Bibliography

Papers, benchmarks, and community sources

Academic Papers
  • [1] Ramezani et al., “Striking the Balance: GEMM Performance Optimization Across Generations of Ryzen AI NPUs,” arXiv:2512.13282, Dec 2025. XDNA/XDNA2 GEMM benchmarks, 38 TOPS achieved on Strix Point.
  • [2] “GAMA: High-Performance GEMM on AMD AIE-ML,” arXiv:2504.09688, FPL 2025. 85% peak utilisation, 165 TOPS INT8 on Versal VEK280.
  • [3] “AIE4ML: End-to-End NN Inference Framework for AIE,” arXiv:2512.15946, Dec 2025. 95.8% single-kernel efficiency, 82.2% end-to-end.
  • [4] “ARIES: MLIR-Based Compilation for AIE,” FPGA 2025 (Cornell). 45.94 TOPS INT8, ~87% efficiency on VCK190.
  • [5] “MLIR-AIR: Spatial AI Compiler,” arXiv:2510.14871. 48.6–78.7% of peak across data types.
  • [6] “NPUEval: LLM-Generated NPU Kernels,” arXiv:2507.14403. ~10% mean vectorisation for auto-generated AIE code.
  • [7] “Unlocking the AMD NPU for ML Training,” arXiv:2504.03083, Apr 2025. Bare-metal IRON programming, 3.1× CPU speedup on Phoenix.
  • [8] “DPUV4E: CNN on Versal ACAP,” arXiv:2506.11441. <5% utilisation for small BERT MM layers.
  • [9] “Efficient GEMM on AMD Versal vs Intel Stratix,” arXiv:2404.11066, FCCM 2024. 58.9% utilisation, DDR bandwidth as primary bottleneck.
  • [10] “NITRO: LLM Inference on Intel Laptop NPUs,” arXiv:2412.11053, Dec 2024. GPU 1.8–2.3× faster than Intel NPU for LLM.
  • [11] “Fast On-device LLM Inference with NPUs,” arXiv:2407.05858, ASPLOS’25. Qualcomm NPU: FP16 matmul 159× slower than CPU INT8.
  • [12] “LLM Inference at the Edge: NPU and GPU Trade-offs,” arXiv:2603.23640, Mar 2026. Hailo NPU 19× slower than RTX 4050, comparable J/token.
  • [13] “Orion: Programming Apple’s Neural Engine for LLM,” arXiv:2603.06728, Mar 2026. CPU outperforms ANE for decode; 2.3 ms dispatch overhead.
Independent Benchmarks & Community
  • [14] 7shi, “LLM Inference Speed on Ryzen AI Max+ 395,” Zenn.dev, Oct 2025. NPU slowest of GPU/CPU/NPU.
  • [15] lhl, “Strix Halo LLM Benchmarks,” Level1Techs, Jul–Dec 2025. GPU-only results (NPU not functional enough to test).
  • [16] Lockal, “AMDXDNA,” Gentoo Wiki. xrt-smi validate: 51.0 TOPS synthetic, 74 µs latency.
  • [17] Hardware Corner, “AMD Targets Faster Local LLMs,” hardware-corner.net, 2025. Hybrid NPU+iGPU, 2K–3K context cap.
  • [18] FastFlowLM. AMD-backed NPU LLM inference: 66 tok/s on 1B, <2W.
  • [19] Framework Community, NPU support thread. Linux: driver loads, no practical inference path.
  • [20] AMD, Ryzen AI Software 1.4 LLM Overview. Hybrid execution, supported models, Windows-only.
  • [21] AMD, IRON for Ryzen AI Tutorial (ISCA 2025). Bare-metal AIE programming guide.

← All phases  ·  Phase 11 — Dispatch Reduction Investigation