Written by Jakub Rusinowski · Last updated August 17, 2026
Every number on this site is either a measurement with a source or the output of one of the two formulas below. This page publishes both, the constants they use, and the cases where we know the model is wrong.
What must be resident in memory for the model to load at all.
vram_gb = weights_gb + kv_cache_gb + overhead_gb weights_gb = totalParamsB x bits_per_weight / 8 <- TOTAL parameters kv_cache_gb = 2 x layers x kv_heads x head_dim x ctx x kv_bytes / 1e9 overhead_gb = 0.8 framework + CUDA context
Effective on-disk width including block scales and metadata, which is why the 4-bit formats land above 4.0.
| Quantization | Bits per weight |
|---|---|
Q2_K | 2.63 |
Q3_K_M | 3.41 |
Q4_K_M | 4.83 |
Q5_K_M | 5.67 |
Q6_K | 6.56 |
Q8_0 | 8.50 |
F16 | 16.00 |
Tokens per second during generation. Three physically distinct terms, not a single bandwidth division.
t_token_ms = (W_active + KV(ctx)) / (BW × η_arch) × 1000 memory streaming
+ W_offloaded / (BW_host × η_host) × 1000 offload penalty
+ t_fixed_ms framework floor
tokens_per_sec = 1000 / t_token_ms
| Term | What it is | Why it is there |
|---|---|---|
W_active | Quantized bytes of the weights actually read per token. | For a dense model this is the whole file. For a Mixture-of-Experts model it is only the routed experts, which is why a 109B MoE can decode as fast as a 17B dense model. Note this is the SPEED input only — the FIT check uses total weights, because every expert must be resident. |
KV(ctx) | 2 × n_layers × n_kv_heads × head_dim × ctx × bytes_per_element, from each model's published config.json. | The KV cache is re-read every token, so it adds to the streaming cost and grows linearly with context. This is the single biggest omission in a plain roofline model: an 8B Q4 loses roughly half its throughput between 4K and 65K context purely because of this term. Models using Multi-head Latent Attention (DeepSeek, Kimi) cache one compressed latent instead of K and V, which is 10-20× smaller, and are computed separately. |
η_arch | Fraction of theoretical memory bandwidth a decode loop actually sustains, fitted per GPU architecture. | Sustained bandwidth is a property of the memory subsystem, not of the model being run. Ada and Ampere sit about 0.30 apart in our fit, so a single global constant would misattribute an architectural difference to every model on the page. |
t_fixed | Per-token latency that does not scale with model size: kernel launch, graph dispatch, sampling. Fitted per backend. | This is why a 0.5B model does not run 40× faster than a 20B one on the same card. It also replaces the hardcoded 400 tok/s ceiling this page used to carry: throughput now approaches 1000/t_fixed as weights shrink, so the ceiling is a consequence of the backend rather than a number someone chose. |
W_offloaded / BW_host | Weights that do not fit in VRAM, read from system RAM by the CPU. | llama.cpp does not stream non-resident weights to the GPU across PCIe — it computes those layers on the CPU, reading them from system DRAM, and only the activation tensor crosses the link. So the bottleneck is host memory bandwidth, not link bandwidth. On unified-memory systems (Apple, DGX Spark, Strix Halo) there is no second tier at all and this term is zero. |
A decode step is memory-bound: the weights that are read per token have to cross the memory bus, and no real runtime sustains 100% of a card's theoretical peak. Assuming 1.0 would overstate throughput by 25-40%. This site fits a per-architecture efficiency to published llama-bench runs rather than assuming a single figure, because sustained bandwidth is a property of the memory subsystem and not of LLMs. The fitted values are in the table below. End-to-end, after the fixed framework cost is included, the effective utilization these produce lands between roughly 0.45 and 0.85 depending on card and model size.
| GPU architecture | η | Fitted? | Basis |
|---|---|---|---|
| NVIDIA Blackwell | 0.850 | seed assumption | assumption — no calibration data for this architecture |
| NVIDIA Ada Lovelace | 0.927 | fitted | solved from 12 measurements |
| NVIDIA Ampere | 0.622 | fitted | solved from 1 measurement |
| NVIDIA Hopper | 0.850 | seed assumption | assumption — no calibration data for this architecture |
| AMD RDNA 4 | 0.700 | seed assumption | assumption — no calibration data for this architecture |
| AMD RDNA 3 / 3.5 | 0.650 | seed assumption | assumption — no calibration data for this architecture |
| Intel Xe2 (Battlemage) | 0.600 | seed assumption | assumption — no calibration data for this architecture |
| Apple Silicon | 0.548 | fitted | solved from 1 measurement |
| Custom hardware (unclassified) | 0.750 | seed assumption | assumption — no calibration data for this architecture |
| CPU (system RAM) | 0.350 | seed assumption | assumption — no calibration data for this architecture |
Kernel launch, graph dispatch and sampling cost the same whether the model is 0.5B or 70B. As the weights shrink, that fixed cost comes to dominate and throughput asymptotes to 1000/t_fixed rather than rising without limit. This site models that as a measured per-backend constant (t_fixed) instead of a hardcoded ceiling, so the flattening is an emergent property of the backend and different small models still return different numbers. A hard clamp was removed precisely because it made a 1B model and a 109B model report the same value, and a test fails the build if one reappears.
| Backend | t_fixed (ms) | Implied ceiling (tok/s) | Fitted? |
|---|---|---|---|
| CUDA | 2.25 ms | — | fitted |
| ROCM | 3.50 ms | — | seed assumption |
| METAL | 3.00 ms | — | seed assumption |
| VULKAN | 4.00 ms | — | seed assumption |
| CPU | 5.00 ms | — | seed assumption |
Fitted against 14 published llama-bench runs. Mean absolute percentage error 7.68% (10.68% counting only rows whose exact checkpoint is confirmed). Worst single residual 31.53%. 3 of 10 GPU architectures have measurements behind them; the rest carry seed values and are flagged as uncalibrated wherever they appear.
No number is published bare. Every throughput figure carries one of these:
| Label | Meaning |
|---|---|
| MEASURED | From verified benchmark submissions for this exact GPU, model, quantization and context. Shown with its spread and sample count. |
| COMMUNITY | A measured value whose runs all came from readers of this site, shown with its sample count. |
| ESTIMATED | No measurement exists for this pair. The range is what the calibrated latency model predicts, and it is shown as a range because a single number would imply precision the model does not have. |
| INTERPOLATED | Measured on this GPU for a closely related model, rescaled by the ratio the latency model predicts between them. |
Published because a reader who finds these independently trusts the rest of the page less than one who was told.