CPU vs GPU Bottleneck Estimator: Which Part Limits Your FPS?
Find out whether your game is CPU-bound or GPU-bound from your own overlay numbers (GPU usage or PresentMon GPU Busy, busiest CPU thread, FPS, 1% lows and resolution), how much GPU time sits idle, the FPS a faster GPU or CPU would give, and what resolution or DLSS/FSR upscaling changes would do.
How it works
Frame time (ms) = 1000 ÷ FPS · GPU share u = GPU usage % ÷ 100, or GPU Busy ms ÷ frame time · GPU-bound if u ≥ 93%; CPU-bound if u ≤ 85% with the busiest thread ≥ 85% (or total CPU ≥ 80%) · GPU limit = FPS ÷ u · CPU limit = current FPS when CPU-bound, ≈ FPS ÷ busiest-thread share when GPU-bound · FPS after a change = measured FPS × min(CPU limit × CPU speed-up, GPU limit × GPU speed-up) ÷ min(CPU limit, GPU limit), never above a frame cap · GPU limit at another resolution = GPU limit × (render pixels now ÷ render pixels new)^0.8
Each frame passes through the CPU (game logic, draw calls) and then the GPU (rendering). The slower of the two sets the frame rate and the other waits. In an uncapped game, the share of each frame that the GPU is working tells you which side waits: near 100% means the graphics card is the limit; well below that means it is waiting for the processor. Intel PresentMon and NVIDIA FrameView measure this directly as GPU Busy time against the frame time; GPU usage from Afterburner or the Game Bar is a coarser version of the same idea. Because most engines depend on one or two main threads, the busiest CPU thread matters more than total CPU usage. From the GPU share the calculator works out the GPU limit (the frame rate if the GPU never had to wait) and the CPU limit, then predicts each upgrade by how much the lower of the two limits rises, scaled from your measured frame rate and held below any frame limiter. When the GPU is the limit, the CPU limit is not visible in the numbers, so it is treated as not limiting unless the busiest thread is clearly below 90%. Resolution and upscaling move only the GPU side: GPU time is assumed to grow with rendered pixels to the power 0.8 (changeable under More options), because part of each frame's GPU work, such as geometry and shadow maps, does not depend on resolution. Part-name "bottleneck calculators" compare average benchmark scores and cannot see your game or settings; your own counters can. Results are estimates: check several minutes of typical gameplay with the frame cap off.
Worked example
With the defaults, 110 FPS at 2560 × 1440 with the GPU at 72%, the busiest thread at 95% and total CPU at 45%: frame time = 1000 ÷ 110 = 9.09 ms, of which the GPU works 6.55 ms. GPU usage is at most 85% and a thread is at 85% or more, so the game is CPU-bound with 28% of each frame idle on the GPU. GPU limit = 110 ÷ 0.72 = 153 FPS; the CPU limit is the current 110 FPS. A 30% faster GPU gives min(110, 199) = 110 FPS (+0%), while a 20% faster CPU gives min(132, 153) = 132 FPS (+20%). At 1920 × 1080 the GPU limit rises to 153 × (3,686,400 ÷ 2,073,600)^0.8 = 242 FPS but the CPU keeps it at 110; at 3840 × 2160 the GPU limit falls to 153 × (0.444)^0.8 = 80 FPS, so 4K would be GPU-bound at about 80 FPS. The 1% lows of 70 FPS are 64% of the average (uneven), and 110 FPS is 34 below the 144 Hz refresh.
Sources: Intel PresentMon GPU Busy versus frame time: GPU-bound when they align, waiting on the CPU when GPU Busy is lower (Club386) · Intel GPU Busy metric in PresentMon (TweakTown) · PresentMon 2.0 and frame-time analysis, interview with Tom Petersen (Gamers Nexus) · Part-name bottleneck calculator for comparison (pc-builds.com)
Frequently asked questions
How do I know if I am CPU or GPU bottlenecked?
Play for a few minutes with any frame cap or V-sync off and watch GPU usage. If it stays around 95–99%, the GPU is the limit. If it sits well below that, for example 60–85%, while one CPU thread is near 100%, the CPU is holding it back. PresentMon's GPU Busy is clearer: when GPU Busy almost equals the frame time the GPU is the limit; a large gap means it waits for the CPU.
Why do online bottleneck calculators give a percentage from part names?
They compare average benchmark scores of a CPU and a GPU, which cannot know your game, settings or resolution. The same pair can be CPU-bound in a strategy game at 1080p and GPU-bound in a ray-traced game at 4K. Your own usage counters answer the question for the games you actually play.
Is 100% GPU usage bad?
No. In an uncapped game it means you are getting everything the card can do. High usage at low FPS just means the settings are heavy for the card. A CPU thread at 100% with a GPU at 60–70% is the situation to fix.
Does increasing resolution fix a CPU bottleneck?
It does not raise the CPU limit, but it gives the GPU more work, so the frame rate barely drops until the GPU becomes the limit. With a CPU-bound system you can often move to a higher resolution or heavier graphics settings almost for free.
Does DLSS or FSR help when I am CPU-bound?
Upscaling lowers the render resolution, which helps only when the GPU is the limit. When CPU-bound it mostly lowers GPU usage further. Frame generation is different: it inserts generated frames and raises the displayed frame rate even when CPU-bound, at the cost of some extra latency.
Why is my CPU usage low if the CPU is the bottleneck?
Total CPU usage averages all cores. A game whose main thread is saturated on one core can show only 20–40% total usage on an 8-core CPU. Look at the busiest individual thread instead, or at GPU Busy versus frame time.
Related calculators
An estimate from your own monitoring numbers, not a benchmark. Real scaling depends on the game, scene, settings, drivers and background load; check a few minutes of representative gameplay and confirm with benchmarks for the specific parts before buying hardware.