Steam on Dual GPUs: Mastering GPU Selection and Offload on Linux

Running Steam on a dual-GPU Linux machine can feel like herding pixels through quantum chaos. In this guide, we’ll untangle NVIDIA offload magic, identify which GPU is doing the work, and show how to make Steam—and your games—use the right one every time.

Steam on Dual GPUs: Mastering GPU Selection and Offload on Linux

A complete guide to understanding GPU selection, configuration, and control in Steam on Linux

1. Introduction

Running Steam on Linux with multiple GPUs — especially two discrete NVIDIA cards — can be both powerful and confusing. Linux doesn’t provide a single “Use GPU 1” button, and Steam itself has no built-in selector for which GPU to use. Instead, GPU selection relies on environment variables, driver settings, and Vulkan/OpenGL provider mappings.

This guide will show you how to:

  • Detect which GPU your display is connected to.
  • Identify which GPU Linux and Steam are using.
  • Explicitly tell Steam (and its games) to use a specific GPU.
  • Set this globally so you don’t have to edit every game.
  • Understand what each variable means and why it matters.

This walkthrough is based on Ubuntu 25.04 (or any modern distribution using NVIDIA drivers 580+) with two NVIDIA RTX 2080 Ti cards.

2. Understanding the Linux GPU Stack

Before we start tweaking, let’s clarify what’s happening under the hood.

  • GPU 0 and GPU 1 are identifiers assigned by the NVIDIA driver, not hardware order.
  • Each GPU has a PCI Bus ID, such as 00000000:03:00.0 or 00000000:04:00.0.
  • The display output (Disp.A) shows which GPU your monitor is connected to.
  • Steam and games launched under Xorg/Wayland will, by default, use the GPU associated with the display server — often GPU 0, even if your display is on GPU 1.

We’ll use commands to make sure Steam and your games always use the GPU connected to your monitor for better performance.

3. Step 1 – Detect Which GPU the Display Uses

Open a terminal and run:

nvidia-smi

Example output:

+-----------------------------------------------------------------------------------------+
| NVIDIA-SMI 580.95.05              Driver Version: 580.95.05      CUDA Version: 13.0     |
+-----------------------------------------+------------------------+----------------------+
| GPU  Name                 Persistence-M | Bus-Id          Disp.A | Volatile Uncorr. ECC |
| Fan  Temp   Perf          Pwr:Usage/Cap |           Memory-Usage | GPU-Util  Compute M. |
|                                         |                        |               MIG M. |
|=========================================+========================+======================|
|   0  NVIDIA GeForce RTX 2080 Ti     On  |   00000000:03:00.0 Off |                  N/A |
| 18%   40C    P8             21W /  250W |     594MiB /  11264MiB |      4%      Default |
|                                         |                        |                  N/A |
+-----------------------------------------+------------------------+----------------------+
|   1  NVIDIA GeForce RTX 2080 Ti     On  |   00000000:04:00.0  On |                  N/A |
| 24%   65C    P2             66W /  250W |    2126MiB /  11264MiB |      3%      Default |
|                                         |                        |                  N/A |
+-----------------------------------------+------------------------+----------------------+

Look for Disp.A: On.
In this example, GPU 1 (00000000:04:00.0) drives the monitor — this is the one Steam and games must render on.

4. Step 2 – Check GPU Mapping in Linux

To verify PCI IDs and driver detection:

lspci -nn | grep VGA

You’ll see something like:

03:00.0 VGA compatible controller: NVIDIA Corporation Device [10de:1e07]
04:00.0 VGA compatible controller: NVIDIA Corporation Device [10de:1e07]

This confirms GPU 0 → Bus 03:00.0 and GPU 1 → Bus 04:00.0.
We’ll use these IDs in environment variables.

5. Step 3 – Finding Which GPU Steam Is Using

Launch Steam normally and start a game.
Then, in another terminal, run:

nvidia-smi

Look under “Processes.” You’ll see which GPU is handling the game.
If the game appears under GPU 0, but your display is on GPU 1, rendering will be inefficient or may fail entirely.
That’s why we must explicitly set Steam to use the correct GPU.

6. Step 4 – Direct Steam to a Specific GPU (Per-Game Method)

Steam supports per-game environment variables via Launch Options.

For NVIDIA GPUs:

  1. Right-click your game in the Steam Library.
  2. Select Properties → General → Launch Options.
  3. Enter:
__NV_PRIME_RENDER_OFFLOAD=1 %command%

This tells OpenGL games to offload rendering to an NVIDIA GPU.

For Vulkan-based titles (most Proton games), add:

__NV_PRIME_RENDER_OFFLOAD=1 __VK_LAYER_NV_optimus=NVIDIA_only VK_ICD_FILENAMES=/usr/share/vulkan/icd.d/nvidia_icd.json %command%

For AMD/Intel (Mesa) setups:

DRI_PRIME=1 %command%

or for complete isolation:

DRI_PRIME=1! %command%

However, in dual-NVIDIA configurations, __NV_PRIME_RENDER_OFFLOAD_PROVIDER provides more accurate GPU targeting, as explained below.

7. Step 5 – Explicitly Selecting GPU 1 in Dual-NVIDIA Systems

When both GPUs are identical, Linux names them NVIDIA-G0, NVIDIA-G1, etc.
You can control which one to use:

Example (Display on GPU 1 → NVIDIA-G1):

__NV_PRIME_RENDER_OFFLOAD=1 __NV_PRIME_RENDER_OFFLOAD_PROVIDER=NVIDIA-G1 %command%

But the most robust and cross-API-compatible method is to target the specific PCI bus ID:

VK_DEVICE_SELECT_PCI_BUS_ID=0000:04:00.0 %command%

This guarantees Vulkan games (e.g., DXVK/Proton titles) run on your second GPU.

To combine OpenGL and Vulkan targeting:

VK_DEVICE_SELECT_PCI_BUS_ID=0000:04:00.0 __NV_PRIME_RENDER_OFFLOAD_PROVIDER=NVIDIA-G1 __NV_PRIME_RENDER_OFFLOAD=1 %command%

8. Step 6 – Global Configuration (All Games & Steam Itself)

Editing each game can get tedious. Instead, configure Steam globally.

Step 6.1 – Copy Steam’s Desktop Entry

cp /usr/share/applications/steam.desktop ~/.local/share/applications/

Step 6.2 – Edit It

vim ~/.local/share/applications/steam.desktop

Find the line starting with:

Exec=/usr/bin/steam %U

Replace it with:

Exec=env VK_DEVICE_SELECT_PCI_BUS_ID=0000:04:00.0 __NV_PRIME_RENDER_OFFLOAD_PROVIDER=NVIDIA-G1 __NV_PRIME_RENDER_OFFLOAD=1 /usr/bin/steam %U

Save and exit (Esc, then :wq,, then Enter).

Step 6.3 – Reload the Desktop Environment

Either log out and back in, or reboot.
Now, Steam will always start with those environment variables, and all games launched through it will inherit them.

9. Step 7 – Verifying That It Works

After launching Steam (from its icon), start any game and check GPU load:

watch -n1 nvidia-smi

You should see your game’s process listed under GPU 1 (Bus 04:00.0).
If you see activity on GPU 0, recheck your .desktop entry for typos.

10. Step 8 – Choosing the Right Display Connection

For dual-GPU setups:

  • Always connect the monitor to the GPU you intend to render with (here GPU 1).
  • PRIME offloading allows rendering on one GPU and displaying on another, but it introduces overhead and potential stuttering.
  • For high-performance gaming, rendering and display should occur on the same GPU.

If your display is connected to GPU 1, keep it that way and configure Steam to target GPU 1.

11. Step 9 – Advanced GPU Detection & Vulkan Device Lists

You can see all Vulkan-visible devices with:

MESA_VK_DEVICE_SELECT=list vkcube

This will print each GPU’s vendor ID and PCI ID — useful for multi-GPU tuning or testing Vulkan layers.

You can even run:

VK_ICD_FILENAMES=/usr/share/vulkan/icd.d/nvidia_icd.json vkcube

to test a specific Vulkan driver path.

12. Step 10 – Why Not Use .bashrc?

Technically, you can add environment variables to ~/.bashrc, but it’s a bad idea:

  • Graphical apps launched from menus don’t inherit .bashrc.
  • The variables would only apply when running Steam from a terminal.
  • It may break other OpenGL or Vulkan programs.

Editing the .desktop entry is cleaner, persistent, and per-application.

13. Troubleshooting Tips

Symptom Possible Cause Fix
Game runs on GPU 0 Variables missing or typo in Exec line Verify bus ID and variable names
Black screen or crash Secure Boot blocking NVIDIA modules Disable Secure Boot or sign modules
Vulkan game ignores device ID Outdated ICD path or wrong driver Verify VK_ICD_FILENAMES path
OpenGL games lag Mismatched render/display GPUs Ensure both rendering and display on GPU 1
Steam overlay missing Missing PRIME variables Add __NV_PRIME_RENDER_OFFLOAD=1

14. Conclusion

Dual-GPU Linux setups are powerful but need explicit configuration.
Steam doesn’t “guess” which GPU you want — it inherits whatever environment you provide.

By correctly combining:

VK_DEVICE_SELECT_PCI_BUS_ID=0000:04:00.0
__NV_PRIME_RENDER_OFFLOAD_PROVIDER=NVIDIA-G1
__NV_PRIME_RENDER_OFFLOAD=1

You ensure all games, both Vulkan and OpenGL, use your display-connected GPU 1.

Once set in the .desktop file, everything — from the Steam client to Proton games — will launch correctly on the desired card, with no further tweaks needed.

Read next