32 months ago
Note: While this focuses on games, some of the same general ideas will apply to other uses as well.
Bottlenecking refers to a limitation of some sort, especially as caused by hardware. When you're playing a game, there's two common bottlenecks (or limitations) to your framerates — the CPU or GPU. With the GPU so commonly being said as the most important to gamers, of course you don't want it to be held back, right?
In order to render and display an image to your screen, there are many steps taken to do so. The GPU does much of the work in order to do that. But first, it needs to be told what to do and it needs the required data to work with to do its job in the first place.
At the CPU, API calls are executed. Control is given to the OS and then GPU drivers, which translate the API calls to commands. These commands are sent to the GPU, where they are in a buffer (which there may be multiple of in modern graphics APIs) where they will then be read and executed (in other words, carried out). Even before this can be done, however, there's even more work — the CPU also has to run logic necessary to tell what needs to be rendered on screen, and this is based off user input and internal rules. On top of sending commands to the GPU with instructions, data, and state changes, the CPU also handles things like user input, AI, physics, and environment in games. Meanwhile, the GPU is tasked with, as GamsersNexus puts it concisely, "drawing the triangles and geometry, textures, rendering lighting, post-processing effects, and dispatching the packaged frame to the display." Now, here's where bottlenecking comes in. If the CPU isn't sending commands faster than the GPU can pull them out of the command buffer and execute them, the buffer will spend time being empty with the GPU waiting for input, and you're considered to be CPU limited. If the GPU isn't executing the commands fast enough, then you're GPU limited, and the CPU will spend time waiting on the GPU.[source] When you're CPU-limited (also called CPU-bound or CPU-bottlenecked), GPU utilization (time spent not being idle) decreases as the bottleneck becomes more severe and when you're GPU-limited (AKA GPU-bound or GPU-bottlenecked), your CPU utilization will go down to an extent as the bottleneck becomes more severe.
In an ideal world, there would be no bottlenecks. In this case, such a situation would require that the CPU, PCI-e, and every stage in the GPU's pipeline all be equally loaded. Or, every component would have to be infinitely fast. But, this is not an ideal world. Something, somewhere, always holds back performance. This doesn't just go for the CPU and GPU, either.
So, you want to know whether your CPU will bottleneck your GPU while gaming.
Well, it's sadly not so easy. Let's dial back on the technical side of things a bit.
Any games today where graphics are even a little important to the developers have an array of graphical settings that you can modify. Heck, even Battlefront 2 from 2005 has a few graphics settings you can change. Setting these higher, especially ones like resolution (the max of which you can see depends on your monitor resolution) and anti-aliasing, will make the GPU do more work. Resolution, texture filtering, most post-processing effects, shader quality, and so on all make the GPU do more work, but not the CPU. While these could affect the format of commands sent to the GPU, the work associated with sending them that the CPU has to do won't change. But, there are a few like draw distance, physics, water reflections, particles, model quality, and possibly shadow quality (shadow quality might or might not be handled by / make more work for the CPU depending on the game's implementations of shadows) that do indeed make the CPU work harder and might even be handled by the CPU alone in the case of reflections and particles. Of course, there could be more, depending on which game it is. In general, if something puts more objects on the screen, it leads to more API calls being executed, causing more work for the CPU, along with the the GPU.
But of course it doesn't stop there. Games are dynamic - they aren't things that make both the CPU and GPU do the same amount of work all the time. Different areas of a given game can be a bit different in that way. This simple fact alone can change the bottlenecking and framerate situation quite a bit. Maybe you're walking in a grassy plain with little physics going on or not many NPCs. Grass isn't known to be easy on the GPU, so in such an area you're more likely to be GPU limited there than in some other areas. But, then you might be walking into a busy town or city, with many NPCs everywhere doing stuff. Perhaps you're playing GTA 5, crashing through vehicles with the Phantom Wedge or a tank in the city. Such an area will be harder on the CPU than the grassy plain, so you'll be more likely to become CPU limited there than the grassy plain. I can also back this up from personal experience - in AC: Origins, I'm heavily CPU-bound with my i3-6100 while in the city of Thebes, but am usually GPU-bound in other areas.
As you might have guessed from the above two factors, the game that's being played has a big role in this, too. Games will have varying degrees of graphical complexity and different levels of focus on physics and other things handled by the CPU, so, naturally, different games can make the CPU and GPU each do more/less work by being a different game. Some games might run better with either Nvidia or AMD GPUs in general, with Rise of the Tomb Raider being a more tame example in favor of Nvidia. Games will also have varying degrees of parallelism (different numbers of threads are used), where core count and AMD's SMT implementation / Intel's hyper-threading will play a varying role, depending on the game. It also matters how these threads are used, as that can play a role in how the load is spread across cores, so more threads does not necessarily mean improved performance with more cores/SMT. Do remember, though, that games usually have a "main" thread where typically much more work is done than others, but it is still possible in the future for more ways to spread this work to be found.
Identifying your bottleneck in-game in any given moment is simple — look at your GPU utilization using a program like MSI Afterburner. When the GPU is pegged at very nearly 100%, it's the framerate bottleneck at the moment. If it is lower, and you look at CPU utilization across different logical cores (they show utilization individually), you may find that, depending on your core count and presence of hyper-threading/SMT, one to all of them are at about 100% utilization. In this case, your CPU would be the bottleneck for your framerates. Also, here's a video on identifying the bottleneck.
Now, in any situation in a game where you are experiencing a GPU bottleneck, you can: Overclock your GPU and/or its VRAM, upgrade your GPU to one better in that game or games, or turn down graphics settings. In such a situation, this should increase the framerates you are getting.
In any situation in a game where you are experiencing a CPU bottleneck, you can: Overclock your CPU (if possible and not already done), upgrade your CPU to one better in that game or games, or if you haven't/aren't already, use a dual-channel memory configuration over single-channel and use higher frequency memory (for some benchmarks and more information on memory and gaming, see RAM and its effects in games redux). While CPU-limited you can also increase graphics settings that don't make the CPU do more work without any loss on framerates until the GPU becomes the bottleneck; take, for example, the G4560 and FX 8370 in Hitman, Civ 6, Gears of War, and Deus Ex here. You can see that increasing the resolution had no beyond-margin-of-error effect on framerates with those 2 CPUs in those games, because the CPU was still the bottleneck in 1440p and increasing resolution doesn't make the CPU do more work. Yet, higher visual quality was still achieved even though framerates remained the same.
Now, what about choosing a CPU or GPU for gaming?
Remember when I said that the GPU gets commands and data from the CPU. This is effectively the first step in the rendering pipeline, where every frame starts at the CPU. If it helps to visualize the relationship here, you can think of it like this: Every frame starts with the CPU, but much of the work associated with each frame is done by the GPU. It's similar to how ordering a more complex or larger hamburger is more work for the cook, not the person taking the order. In games, performance originates from the CPU. A CPU bottleneck won't stop you from being able to crank up graphics settings that don't put more load on the CPU, or use something like a higher-res texture mod.
The CPU is the ultimate framerate limit, determining the maximum framerates you can get. When you go to choose a CPU for gaming (assuming that's the most hardware-demanding and important-to-you thing you will do), you should choose according to the framerates (and frametimes) you want. And when you go to choose a GPU, choose according to the graphics settings you want at the framerates you want. For example, there's nothing to stop you from pairing a low-end CPU and a high-end GPU to play at high resolutions as long as you don't care about high framerates. Look online to see what different CPUs and GPUs are capable of in what games (for current hardware and games, also see the good reviewers section of my learning thread and CTRL + F for "frametime" in that section for a few good benchmark sources; there are also plenty of YouTube videos for specific parts in in a specific game and there are probably graphic setting comparisons online as well), and choose appropriately. And when you're getting the performance you like, then the bottleneck doesn't matter much anymore, does it?
Every frame starts with the CPU. Commands from the CPU are buffered, and when the GPU is carrying them out faster than they can be sent from the CPU, you are CPU bottlenecked. The opposite is also true. The framerate bottleneck for a given hardware configuration can switch between the CPU and GPU, depending on the game, the graphics settings used, and area of the game. See GPU utilization and CPU utilization across different logical cores (not necessarily the CPU utilization as a whole, you don't need the whole CPU to be busy to be CPU-bottlenecked) to identify your current bottleneck; whichever you see at pretty much 100% is your current framerate bottleneck. Buy a CPU based on the framerates you want, and buy a GPU based on the graphics settings you want at that framerate.