guidox / PC

Find Out Which App Is Using Your GPU

TL;DR

Open **Task Manager > Performance > GPU** and sort the Processes view by GPU, or read the per-process counters with **Get-Counter '\GPU Engine(*)\Utilization Percentage'**.

Before you start

Requirements

  • Windows 11
  • A discrete or integrated GPU
  • 10 minutes
Step by step

Instructions

01

Identify the adapters first

A laptop has at least two adapters, and the counters name them by LUID, not by marketing name. Mapping the LUID to the adapter prevents reading the wrong number.

Get-CimInstance Win32_VideoController | Select-Object Name,DriverVersion,AdapterRAM,Status
Get-Counter '\GPU Adapter Memory(*)\Dedicated Usage' -ErrorAction SilentlyContinue | Select-Object -ExpandProperty CounterSamples | Select-Object InstanceName,CookedValue
02

Sort processes by GPU in Task Manager

The Processes tab has a GPU column per engine, and the header expands into 3D, Copy and Video Decode. That split is what makes a browser with hardware acceleration visible.

taskmgr.exe
:: Processes > right-click the header > select GPU, GPU Engine
:: Performance > GPU > look at the engine breakdown
03

Read the counters directly

**Get-Counter** returns one sample per process per engine, with the process id inside the instance name. Grouping by pid gives the top consumer in one table.

$c = (Get-Counter '\GPU Engine(*)\Utilization Percentage' -ErrorAction SilentlyContinue).CounterSamples
$c | Where-Object CookedValue -gt 1 | ForEach-Object { $pid2 = [int]($_.InstanceName -replace '.*pid_([0-9]+).*','$1'); [pscustomobject]@{ Pid=$pid2; Name=(Get-Process -Id $pid2 -ErrorAction SilentlyContinue).Name; Engine=($_.InstanceName -split 'engtype_')[1]; Pct=[math]::Round($_.CookedValue,1) } } | Sort-Object Pct -Descending | Select-Object -First 10
04

Check dedicated memory per process

Utilization is not the same as memory. A program can hold gigabytes of video memory while using almost no compute, which matters on a card with 4 GB.

$m = (Get-Counter '\GPU Process Memory(*)\Dedicated Usage' -ErrorAction SilentlyContinue).CounterSamples
$m | Where-Object CookedValue -gt 100MB | ForEach-Object { $pid2 = [int]($_.InstanceName -replace '.*pid_([0-9]+).*','$1'); [pscustomobject]@{ Name=(Get-Process -Id $pid2 -ErrorAction SilentlyContinue).Name; Pid=$pid2; MB=[math]::Round($_.CookedValue/1MB,0) } } | Sort-Object MB -Descending | Select-Object -First 10
05

Decide what to do with the finding

A background app with steady 3D load is a bug or a rendering loop. A browser with high Video Decode is playing a video, which is normal and can be moved to the CPU by disabling hardware acceleration.

Get-Process chrome,msedge -ErrorAction SilentlyContinue | Select-Object Name,Id,CPU,WorkingSet
Get-CimInstance Win32_VideoController | Select-Object Name,CurrentHorizontalResolution,CurrentRefreshRate
# browser: Settings > System > Use graphics acceleration when available
06

Confirm the change

Repeat the counter sample after closing the process. The total should drop by roughly the amount that process used, which proves the mapping was right.

$total = ((Get-Counter '\GPU Engine(*)\Utilization Percentage' -ErrorAction SilentlyContinue).CounterSamples | Measure-Object CookedValue -Sum).Sum
[math]::Round($total,1)
Get-Process | Sort-Object CPU -Descending | Select-Object -First 5 Name,Id,CPU
Troubleshooting

Common issues

The GPU counters return nothing

The driver does not expose performance counters, common on older drivers. Update the graphics driver and retry.

Task Manager shows GPU 0 and GPU 1 without names

The names come from the driver. Match the adapter by its memory size with Get-CimInstance Win32_VideoController.

One process uses 100 percent continuously

Check whether it is a rendering or a crypto workload. Look at its start time and its parent process before terminating it.

Utilization is high but the machine is idle

A compositor or a wallpaper engine uses the 3D engine. Check the Desktop Window Manager and any animated wallpaper app.

FAQ

Frequently asked

What do the engine types mean?

3D is rendering, Copy handles transfers, Video Decode and Video Encode handle media. One app can appear in several engines at once.

Why is a pid listed several times?

The counter is per process per engine. Summing the values for one pid gives its total.

Can I limit a process's GPU use?

Not directly. Windows lets you choose the preferred GPU per app, which changes which adapter it uses, not how much.

How to undo this

Nothing is changed by reading the counters. If you disabled hardware acceleration in a browser, re-enable it in the browser's system settings.

Changelog · 1 entry
  1. 2026-11-01
    First version
Interactive version: checklist, feedback, related guides →

Free · no account needed · tracks your progress