Pushing the power envelope with undervoltingPublished on
This article depicts how to use standard undervolting tools on a standard CPU and GPU to achieve a significant gain in power efficiency while preserving performance.
I’m migrating away from a 4.5L sandwich style case that used a 300w flex atx PSU to power:
- Ryzen 2700
- MSI GTX 1070 Aero ITX
- 32GB ram at 1.35v
- 1TB Nvme
For the curious, entering these components into various power supply calculators yielded:
- pcpartpicker: estimates wattage at 288W
- outervision: estimates wattage at 316W and recommends a PSU of 366W
- newegg: recommends a 467W PSU
So it already seems like we’re pushing our PSU, but I’m going to go with an even smaller rater PSU soon, so I’ll need to get creative through undervolting. Undervolting will:
- Decrease energy consumption by lowering voltage (and thus watts)
- Decrease temperature of components as there is less heat to shed
- Can have no effect on performance, as we can undervolt at given frequencies
Could this be too good to be true?
How to Undervolt
Components we’ll be using:
- P4460 Kill a Watt electricity usage monitor: to measure output from the wall. This is the only thing that costs money on the list – you may be able to rent it from a local library or utility company. A wattmeter is not critical, but it’ll give us a sense of total component draw that the PSU has to supply
- Cinebench R20: Free CPU benchmark
- 3dmark Timespy: Free GPU benchmark
- HWiNFO64: to measure our sensor readings (temperature, wattage, etc)
- MSI Afterburner: to tweak the voltage / frequency curve of the gpu
- Motherboard bios: to tweak cpu voltage
- Google sheets: A spreadsheet for tracking power usage, benchmarks, any modifications, etc
a Kill a Watt device to measure wall draw
Feel free to swap components out for alternatives, but I do want to stress the importance of benchmarks, as it’s desirable for any potential performance loss to become apparent when running benchmarks at each stage of the undervolt.
Attentive readers will note the absence of any stress tests (eg: Prime95 With AVX & Small FFTs + MSI Kombustor). It is my opinion that drawing obscene amounts of power to run these stress tests is just too unrealistic. Benchmarks should be stressful enough, else what are they benchmarking? But I understand the drive for those who want ultimate stability, so I’d suggest after we work our way down the voltage ladder to start climbing up as stress tests fail.
Initial Benchmarks and Measurements
Let’s break down what it really means when we’re measuring the number of watts flowing through the wattmeter:
- Kill A Watt shows 200 watts
- The PSU (SSP-300-SUG) is 300W 80 Plus Gold certified
- PSU is able to convert at least 87%-90% of inbound power to the components with the rest dispersed as heat
- The components are asking between 174-180 watts (else the PSU would be rated silver or platinum)
- If the components are asking for max power (300 watts), the Kill A Watt should be reading 337-344 before shutdown
First we’ll measure idle:
- Close all programs including those in the background using any cpu cycles
- Open HWiNFO
- Wait for the system to settle down (ie, the wattmeter converges to a reading)
- Record what’s being pulled from the wall, cpu / gpu watts, and cpu / gpu temps
Then benchmark the cpu:
- Keep everything closed
- Run Cinebench R20
- For each run record score, max wattmeter reading, max watts / temp from the cpu
- Reset HWiNFO recorded max values
- Repeat three times
Then benchmark the gpu:
- Keep everything closed
- Run Timespy
- For each run record score, max wattmeter reading, max watts / temp from the gpu
- Reset HWiNFO recorded max values
- Repeat three times
For timespy, the score you are interested in is the graphics score (highlighted below)
The reason why we’re interested in measuring max values is that we need any future power supply to handle any and all spikes.
Here’s an example of what I recorded for my initial measurements and how I interpreted them. Idle:
- Wattmeter reading: 52.5W
- CPU watts: 22
- GPU watts: 15
- Average Timespy score: 5976
- Max wattmeter reading: 241W
- Max GPU watts: 159W
- Max GPU temperature: 82c
- Our GPU exceeds it’s TDP rating by 10W and total component draw is around 210-217W (241 * [.87, .9]). Through some algebra we can approximate other components consuming 50-60W
If you’re recording CPU watts during the GPU benchmark you may be able to say a bit more about motherboard + ram + etc usage, but be careful – max wattmeter, max gpu watts, and max cpu watts are unlikely to happen at the same time, so unless one has the ability to correlate all three of them, better to stick with the more likely event: max wattmeter occurs at the same time as max gpu watts during a gpu benchmark.
- Average Cinebench score: 3294
- Max wattmeter reading: 131W
- Max CPU watts: 77W
- Max CPU temperature: 81c
- Our CPU exceeds it’s TDP rating by 12W and total component draw is around 114-118 (131 * [.87, .9]). Other components are consuming around 20W.
Determine Target Frequency
First, determine what target frequency you’d like your GPU to boost to, ideally a number between the GPU’s boost clock and max clock. The GPU’s boost clock will be listed in the manufacturer’s specification and also in GPU-Z. The GPU’s max clock is determined at runtime through GPU boost and will be reported as the “GPU Clock” in HWiNFO64 (make sure it’s running while the benchmark are in progress). Below are screenshots from HWiNFO64 and GPU-Z showing the differences between these two numbers.
- Boost clock: 1721mhz
- Max clock: 1886mhz
GPU boost (different from boost clock) increases the GPU’s core clock while thermal and TDP headroom remain. This is somewhat counterproductive for us as any voltage increases to reach higher frequencies will cause an increase in power usage and blow our budget.
I chose my target frequency to be 1860mhz – 139mhz over boost and 26mhz under max, as during benchmarking the gpu clock was pinned at 1860mhz most the time. The exact number doesn’t matter, as one can adjust their target frequency depending on their undervolting results. I change my target frequency later on. We’ll also choose our starting voltage to be 950mv, which is a pretty middling undervolt, and we’ll work our way down.
The tool for undervolting! Powerful, but can be unintuitive at first.
Ctrl + F to bring up the voltage frequency curve. Find our target voltage of 950mv and take note of the frequency (1809mhz in the screenshot)
Our target frequency (1860mhz) is greater than 1809mhz by 51mhz, so we increase the core clock by 51mhz.
This will shift the voltage frequency graph up by 51mhz ensuring a nice smooth ride up the voltage / frequency curve until we hit 1860mhz at 950mv. Then to guarantee we don’t exceed 950mv:
- Select the point at 950mv
- Hit “l” to lock the voltage
- For all voltage points greater than 950mv, drag them to or below 1860mhz
- Hit “✔” to apply
- Afterburner will adjust the points to be the same frequency as our locked voltage
- You may have to comb over >950mv points to ensure that afterburner didn’t re-adjust any voltage points to be greater than 1860mhz. It happens
- Hit “✔” to apply
End result should look like:
After our hard work, we’ll want to save this as a profile so that we can refer back to it after we inevitably undervolt too far. Also after determining what is the best undervolt, we’ll want to have that profile loaded on boot, so ensure the windows icon is selected.
Rinse and Repeat
Do the benchmark routine:
- Clear / reset sensor data for max power usage and temperature
- Start Timespy
- Keep eyes glued on the kill a watt and record max draw
- After Timespy completes record score, gpu max power usage, max temperature, and wall max wall draw.
- Repeat 3 times
After three successful benchmarks:
- Open Afterburner
- Reset the voltage / frequency graph by hitting the “↺” icon
- Decrement the target voltage by 25mv and keep the same target frequency
- Calculate new core clock offset from new target voltage
- Proceed to adjust all greater voltages to our frequency
- Undervolted to 875mv at 1860mhz
- 850mv was not stable
- No affect on Timespy score (<1% difference)
- GPU max wattage decreased from 159W to 124W (20-23% reduction)
- GPU max temp decreased from 82 to 75 (9-10% reduction)
- Attempting an undervolt of 875mv at 1886mhz (the original max clock) was not stable
These are good results that demonstrate that there is no performance loss from undervolting, yet one can mitigate heat and power usage. I decided to take undervolting one step further and set my target frequency to the GPU’s boost frequency (1721mhz) and record the results:
- Undervolted to 800mv at 1721mhz
- Slight decrease to Timespy score (6-7%)
- GPU max wattage decreased from 159W to 105W (33% reduction)
- GPU max temp decreased from 82 to 68 (15-17% reduction)
To me, the loss in performance in this chase to undervolt is greatly outweighed by the gain in efficiency.
Now onto CPU undervolting. This step will differ greatly depending on the motherboard, but for me it was as easy as adjusting the VCore Voltage Offset in 20mv increments.
After booting, run cinebench, record values – the works. Repeat a few times. On success, decrement the offset more.
- Undervolted to -100mv offset
- Small decrease in Cinebench score (<3% difference)
- CPU max wattage decreased from 77W to 65W (15% reduction)
- CPU max temp decreased from 81 to 76 (6% reduction)
We’ve decreased power usage for the CPU and GPU considerably (a combined 66 watts), lowered temperatures, and opted into additional undervolts for a near neglible performance loss. Yet we’re unable to say anything about power options we can slim down to, so I ran an informal stress test by running cinebench and timespy at the same time and recorded max watts recorded from the wall: 205 watts. Meaning components are really desiring 180-200 watts. Incredible – less than 200 watts in a stress test.