Executable programs and extensions
Last updated
Two RTX 3090s with NVLink: how much it actually changes inference
In inference NVLink was about a 5 percent difference, and the default setup works without a bridge at all.
The RTX 3090 has an NVLink 3.0 connector, but a bridge must be physically installed and most consumer setups do not have one. In a 2x RTX 3090 vLLM tensor-parallel community benchmark, NVLink led at 85.0 vs 81.1 tok/s, about 5 percent, with a steadier p95 of 239.1 vs 277.6 seconds. The default multi-GPU path runs on PCIe with P2P off.
What an NVLink bridge does
The RTX 3090 supports NVLink 3.0 on GA102, so a pair of cards can carry four links of 112.5 Gbit/s each for 112.5 GB/s bidirectional in total, 56.25 GB/s per direction. PCIe 4.0 x16 provides about 32 GB/s per direction, so the dedicated path between cards is much wider.
Having an NVLink connector on the 3090 is not the same as having a bridge installed. The reference notes state that a bridge has to be physically installed and that most consumer setups do not have one. Without it, multi-card setups run over PCIe.

Measured: NVLink on and off at TP=2
A community benchmark ran the same model on two 3090s with vLLM tensor parallelism1 (TP=2). With Devstral Small 2505 Q8_0, 50 code generation prompts2 and responses averaging about 1650 tokens3, NVLink gave 85.0 tok/s against 81.1 tok/s over PCIe alone, roughly a 5 percent difference.
The tail latency stands out more: the 95th percentile response time was 239.1 seconds with NVLink against 277.6 seconds without, so NVLink was steadier. If variance on long requests matters more than average throughput4, that difference counts. The author concluded that for inference5 alone the money is better spent on VRAM6 or a card than on a bridge.
| Setup | Throughput | p95 response |
|---|---|---|
| NVLink enabled | 85.0 tok/s | 239.1 s |
| PCIe only | 81.1 tok/s | 277.6 s |
The default is PCIe with P2P off
The 2x3090 operating notes describe the default dual and multi-card path as PCIe-only with P2P off: NCCL_P2P_DISABLE=1 and custom all-reduce disabled, chosen so it works out of the box on any consumer rig without tuning.
The same notes say enabling P2P over PCIe can add a workload-dependent few percent up to about 20 percent. The emphasis is on order: confirm the default PCIe path works, then read the topology and enable P2P to compare, which makes problems easier to isolate.
Three layers to check whether P2P is on
P2P is not one question but three stacked ones: whether the driver grants direct GPU-to-GPU access, whether NCCL7 uses that path for transfers, and whether vLLM's extra custom all-reduce kernel is active. Conflating them makes it impossible to explain why P2P looks enabled yet does not speed anything up.
vLLM's gate checks for NVLink by name, but that check is a cheap pre-filter ahead of an expensive one. As a result, rigs with three or more cards over PCIe keep custom all-reduce off by design, because they lack a fully connected NVLink mesh. That is intended behaviour rather than misconfiguration, and P2P benefits can still flow through the NCCL layer.
| Layer | How to check |
|---|---|
| Driver | nvidia-smi topo -p2p rw reports OK |
| NCCL | NCCL_P2P_LEVEL setting with driver permission |
| vLLM custom all-reduce | check the startup log for a disabled notice |

What TP=2 costs and requires
In vLLM, tensor parallelism shards the weights across the cards. The vLLM documentation notes that this leaves more KV cache8 space per card but can add synchronization overhead, so context length9 and concurrency have to be tuned alongside it.
Enabling chunked prefill10 splits compute-bound prefill and bandwidth-bound decode11 so both resources get used at once. Power limits apply per card, so two cards mean watching the combined draw and case heat. As the chart above shows, lowering a 3090's power limit lowers decode speed with it.
nvidia-smi topo -m
nvidia-smi topo -p2p rw
CUDA_VISIBLE_DEVICES=0,2 CUDA_DEVICE_ORDER=PCI_BUS_ID \
vllm serve /models/model.gguf \
--tensor-parallel-size 2 \
--max-num-seqs 4 --max-model-len 64000 \
--gpu-memory-utilization 0.95 \
--max-num-batched-tokens 16384 --enable-chunked-prefill \
--quantization ggufSo should you buy a bridge
For inference, a bridge is the last item to consider. The measured gain was about 5 percent throughput and a better tail, while larger differences come from whether a model can be split across two 24 GB cards or must live on one larger card. With two cards, confirm the default PCIe path works first.
Work that keeps card-to-card traffic running, such as training or fine-tuning, is a different story. The common assessment is that NVLink's bandwidth advantage shows up more in training than in inference, and the benchmark above reached the same conclusion for inference: about 5 percent. Decide whether your use is inference or training before committing.

Terminology notes
Tensor parallelism — A method that splits matrices and computations within a model layer across devices for joint execution. Devices communicate to combine partial results.
Back to the textPrompt — The input text sent to a model. For generative models it describes the desired result and strongly shapes the output.
Back to the textToken — A unit into which a model divides input or output for processing.
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 textInference — The process of using a trained model to compute an output for an input. Here, local inference means running the model on the user’s device.
Back to the textVRAM — Memory used by a graphics card’s GPU to store model weights and intermediate values.
Back to the textNCCL — A collective-communication library for exchanging and combining data across NVIDIA GPUs.
Back to the textKV cache — Memory that stores attention keys and values from earlier tokens for reuse during later token generation. Its size depends on context length and batch size.
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 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 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 has an NVLink 3.0 connector, but a bridge must be physically installed and most consumer setups do not have one. In a 2x RTX 3090 vLLM tensor-parallel community benchmark, NVLink led at 85.0 vs 81.1 tok/s, about 5 percent, with a steadier p95 of 239.1 vs 277.6 seconds. The default multi-GPU path runs on PCIe with P2P off.
Read next
Executable programs and extensions
Running local LLMs across two or more GPUs
Executable programs and extensions
The RTX 3090 48 GB mod: what to verify before you accept the card
Executable programs and extensions
RTX 3090 BF16 unlock: what opens and what stays the same
Executable programs and extensions
How to Back Up and Restore a Local LLM You Already Use
