"There is exactly one way onto Apple's GPU, and everything else is a door built in front of it."
The One Way In
Every program that runs on an Apple GPU does so through Metal: Apple's graphics and compute API, the only one the hardware exposes. A Metal compute kernel is a small function in the Metal Shading Language, compiled by Apple's compiler, dispatched over a grid of threads by a command queue. That is the door. There is no CUDA, no OpenCL that Apple still maintains, no Vulkan from Apple. When a framework says it "supports Apple silicon", it means it has written or borrowed Metal kernels for the operations it needs. The code block writes one of those kernels through MLX's fast.metal_kernel, which lets you hand Metal Shading Language source to the GPU from Python and get an array back.
The Doors Built in Front of It
| Door | What it is | Who walks through it | Evidence |
|---|---|---|---|
| Metal Performance Shaders (MPS) | Apple's library of pre-written Metal kernels — matrix multiply, convolution, image ops | Core ML underneath; PyTorch's backend, which took its name from it | vendor (Apple docs) |
| MLX | Apple's array framework: its own Metal kernels (and a CPU backend), lazy evaluation, unified-memory-native | mlx-lm, Ollama's MLX engine, this quest's lab, most of the household's local inference | vendor (MLX docs) |
| PyTorch MPS backend | PyTorch tensors placed on 'mps', dispatched to Metal (originally via MPS, now largely custom kernels) | Hugging Face pipelines, diffusers, anything written for CUDA first — the household's image-generation engine | vendor (PyTorch docs) |
| llama.cpp's Metal backend | Hand-written Metal kernels for quantized inference | llama.cpp, LM Studio, Ollama's original engine | vendor (llama.cpp README: "Apple silicon is a first-class citizen — optimized via ARM NEON, Accelerate and Metal frameworks") |
| Core ML | A compiled-model runtime that chooses CPU, GPU or Neural Engine per layer | App-embedded models; the household's on-device speech recognizer | vendor (Apple docs) |
| Metal 4 Tensor APIs | MTLTensor and tensor operations in Metal 4 (macOS 26+); the way to program the M5 GPU's Neural Accelerators directly | MLX from 0.30 ("Support for Neural Accelerators on M5 (macOS >= 26.2)") | vendor (Apple, MLX release notes) |
The table has a shape worth noticing. The doors that dominate local language-model inference — MLX, llama.cpp — are the ones with hand-written kernels for quantized matrix-vector products, because decode is bandwidth-bound and a kernel that reads each weight exactly once at full width is the whole game. The doors that dominate everything else — PyTorch, Core ML — are the ones that inherited a programming model from somewhere else and pay a translation cost for it. Ollama's 2026 move is the clearest sign of where the wind blows: "Ollama is now powered by MLX on Apple Silicon in preview", with llama.cpp kept alongside.
The M5 Door, Stated as a Claim
With the M5 generation Apple put a Neural Accelerator in every GPU core and opened it through Metal 4: "Developers can also build solutions for their apps by directly programming the Neural Accelerators using Tensor APIs in Metal 4." MLX's own post says it "leverages the Tensor Operations (TensorOps) and Metal Performance Primitives framework introduced with Metal 4", and requires macOS 26.2 or later for it. Apple's numbers for the effect are the prefill numbers from track one — "up to 4x speedup compared to a M4 baseline for time-to-first-token" — and, for decode, a "19-27% performance boost … thanks to its greater memory bandwidth". Read that second clause carefully: Apple itself attributes the decode gain to bandwidth, not to the accelerators. Every M5 statement in this lesson is a vendor claim; this quest measures no GPU past M3 (the M5 Max laptop in the house sits under the plan's no-M5-measurement ruling), and the accelerators are a door this quest has not walked through.