Executable programs and extensions
Last updated
Does the 3090 unlock speed up local LLMs? Prefill, batching, decode
The difference can appear in prefill, concurrent requests and fine-tuning rather than single-request decode.
The RTX 3090 BF161 unlock raises matrix throughput2, but single-request token3 generation is bound by memory bandwidth4. Prefill5 of long documents, batched requests and LoRA6 fine-tuning carry more compute, so they may see an effect. No public 3090 measurement exists yet, so set an expectation and measure it yourself.
Decode is bound by bandwidth, not compute
Generating one token at a time means reading weights from memory at every step. The RTX 3090's 936 GB/s decides how long those reads take, not the BF16 matrix throughput. A higher compute rate therefore barely moves single-request tok/s.
The 3090 measurements published on this site point the same way: Qwen3.8 27B UD-Q4_K_XL with MTP7 n-max 3 ran at 68.9 tok/s at 350 W and 51.0 tok/s at 250 W. Lowering the power limit slows it down, which is a clock and power effect, not a compute one.
- RTX 3090 24GB memory, speed and price
- Prefill vs decode: should you look at TTFT or tok/s?
- GGUF vs MLX: which model format should you download?
- LLM memory bandwidth vs compute: how to find the speed bottleneck
- The RTX 3090 48 GB mod: what to verify before you accept the card
- Two RTX 3090s with NVLink: how much it actually changes inference

Prefill is compute-bound and may change
Prefill reads a long document at once and runs matrix products over every input token, a compute-bound stage. A runtime8 that prefills in BF16 may see a shorter time to first token9 after the unlock. Paths that do not use BF16 matrix products, such as llama.cpp's quantized kernels, see little effect.
Which runtime prefills in BF16 depends on the model and kernel, and vLLM and llama.cpp do not take the same path for the same model. To estimate the prefill gain, start with the kernels your runtime uses.
Concurrency and batching widen the gap
Serving several requests at once reuses the same weights, reducing bandwidth pressure and raising the compute share. BF16 throughput can then set aggregate throughput, which is why a continuously batching server such as vLLM may show more benefit.
In a single-user, one-request-at-a-time setup, no batch forms and this advantage mostly disappears. Expectations differ between a server operator and a personal desktop user.
Fine-tuning and image generation are separate cases
LoRA fine-tuning uses many BF16 matrix products, so it is theoretically where the unlock helps most. The 3090's 24 GB of VRAM10 limits batch size11 and sequence length, though, so memory becomes the constraint before compute does. Larger batches have more room to benefit.
In image generation, the compute and memory shares depend on model, resolution and step count. Compute-heavy FP1612 sections may benefit, while high resolutions hit VRAM and bandwidth first. The before-and-after difference in image generation varies with the model, resolution and step count, so measuring your own settings answers it fastest.

Measure with power fixed, before and after
Record a baseline at the same model, quantization13, context length14 and power limit, then repeat after the unlock with a cold boot. Decode15 alone will show almost nothing, so log prefill time and concurrent throughput as well.
| Workload | Bottleneck | Expectation |
|---|---|---|
| Single-request decode | Memory bandwidth | Minimal |
| Long-document prefill | Matrix compute | Depends on runtime kernels |
| Concurrent requests | Matrix compute | Larger with bigger batches |
| LoRA fine-tuning | Matrix compute, VRAM | VRAM binds first |
So should you buy one
The unlock is an experiment on compute headroom you already own. It is a weak reason to buy a card; if decode is the goal, look at other options such as a 5090 or a 48 GB mod. The 3090's strength is 24 GB of capacity and price, not compute rate.
The decision comes from measurement, so decide after running the same card before and after.

Terminology notes
BF16 — A 16-bit floating-point format for model values. Its exponent has the same width as FP32, giving it a similarly wide value range.
Back to the textThroughput — The amount of work processed or generated over time. Comparisons need the unit, such as tokens per second or requests per second.
Back to the textToken — A unit into which a model divides input or output for processing.
Back to the textMemory bandwidth — The amount of data transferable between memory and a processor per unit time, usually expressed in bytes per second (B/s).
Back to the textPrefill — The stage where an LLM reads the input prompt and computes representations for its tokens. Longer prompts contain more tokens to process.
Back to the textLoRA — A method that learns and applies small additional weights to adapt a base model. The adapter is used with the base model for purposes such as style adaptation or few-step generation.
Back to the textMTP — A training objective or model component for predicting multiple future tokens at once. In speculative decoding, those predictions can be proposed as candidate tokens.
Back to the textRuntime — The software environment that provides facilities needed while a program runs. In local AI, it can also refer to a model execution engine.
Back to the textTime to First Token — The time from sending a request until its first output token arrives.
Back to the textVRAM — Memory used by a graphics card’s GPU to store model weights and intermediate values.
Back to the textBatch size — The number of inputs or requests processed together in one batch.
Back to the textFP16 — A 16-bit floating-point format. It uses the same bit width as BF16 but allocates bits differently between exponent and significand.
Back to the textQuantization — A way to represent model weights or values with fewer bits, reducing storage and memory use. The coarser representation can also affect accuracy.
Back to the textContext window — The token span of input and generated content a model can handle in one request. The supported limit and memory use depend on the model and runtime settings.
Back to the textToken decoding — The stage that generates successive output tokens using the input and the response produced so far.
Back to the text
Frequently asked questions
- What should you check first in this article?
- The RTX 3090 BF16 unlock raises matrix throughput, but single-request token generation is bound by memory bandwidth. Prefill of long documents, batched requests and LoRA fine-tuning carry more compute, so they may see an effect. No public 3090 measurement exists yet, so set an expectation and measure it yourself.
- How much memory does it need?
- Generating one token at a time means reading weights from memory at every step. The RTX 3090's 936 GB/s decides how long those reads take, not the BF16 matrix throughput. A higher compute rate therefore barely moves single-request tok/s.
Read next
Executable programs and extensions
Two RTX 3090s with NVLink: how much it actually changes inference
Executable programs and extensions
Verifying a 3090 unlock: boot logs, GEMM and llama-bench
Executable programs and extensions
RTX 3090 BF16 unlock: what opens and what stays the same
Purchases and Costs
GPU power limits for local AI: RTX 3090, 4090, 5090 and DGX Spark
