Hardware notes#

This is the knowledge oldiron doctor applies. It is short on purpose: these are the few facts that decide whether an old card works at all.

The 2025-2026 cutoff for old NVIDIA cards#

Two separate deprecations landed close together, and they bite in different ways.

CUDA 13.0 removed Maxwell, Pascal and Volta — everything below compute capability 7.5. A CUDA 13 toolkit either refuses to build for these architectures or produces a binary the card cannot run.

Driver branch 580 is the last one that supports them. Installing a 590-series driver on a Pascal card can leave it not enumerating at all. Distributions that moved to 590 by default usually keep a legacy package around (nvidia-580xx-dkms on Arch, for example).

So for a P40, P100, M40 or V100 the working combination is CUDA 12.x with driver 580 or older, and the thing to guard against is an unattended system upgrade.

Architecture

Compute capability

Last CUDA

Last driver

Kepler

3.5, 3.7

11.8

470

Maxwell

5.0, 5.2

12.9

580

Pascal

6.0, 6.1

12.9

580

Volta

7.0

12.9

580

Turing and newer

7.5+

current

current

Pascal is two different cards#

The P100 (GP100, cc 6.0) has full-rate FP16 — twice FP32 — and HBM2 at 732 GB/s. The P40 and the GTX 10-series (GP102/GP104, cc 6.1) run FP16 arithmetic at 1/64 rate. On those, FP16 cuBLAS paths are a trap: building with -DGGML_CUDA_FORCE_MMQ=ON keeps matrix multiplication on the integer kernels, which is both faster and lighter on VRAM.

oldiron doctor adds that flag only for cc 6.1, not for the P100.

CPUs without AVX2#

A Sandy Bridge or Ivy Bridge Xeon has AVX but not AVX2 or FMA. Most prebuilt binaries and most PyPI wheels containing native code are compiled for AVX2, and on these CPUs they die with SIGILL — an illegal instruction — often from a transitive dependency you never chose. The fixes are to build llama.cpp from source with -DGGML_NATIVE=ON, and to use pip install --no-binary :all: for native packages that crash.

This is also why oldiron itself has no dependencies: it has to install on the machine that is having the problem.

Apple Silicon#

Metal does not get “VRAM” — it gets a share of unified memory. The default ceiling is roughly 75% of total RAM, so a 16 GB Mac offers about 12 GB to the GPU, and the model plus KV cache must fit under that, not under the full figure. It can be raised:

sudo sysctl iogpu.wired_limit_mb=N

Leave several GiB for macOS; setting it near 100% causes memory pressure rather than speed. oldiron reads the current value if you have set one.

The other Apple-specific detail is core layout: these chips have performance and efficiency cores, and giving llama.cpp every core usually makes it slower. oldiron recommends -t with the performance-core count.

A note on feature detection, since it caused a real bug here: macOS spells these sysctl keys the way Arm does, so it is hw.optional.arm.FEAT_DotProd in mixed case while FEAT_I8MM and FEAT_BF16 are not, and sysctl keys are case-sensitive.

Memory bandwidth by device#

Decode reads every weight once per generated token, so bandwidth sets the speed ceiling (see Memory and speed).

Device

Bandwidth

Tesla P100

732 GB/s

Tesla P40

347 GB/s

Tesla M40

288 GB/s

Apple M1 / M2 / M3

68 / 100 / 100 GB/s

Apple M4

120 GB/s

Apple M1-M3 Max

400 GB/s

Apple M4 Max

546 GB/s

If your device is missing or wrong, oldiron doctor --json output attached to an issue is enough to add it.