Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Feature Request] Exponentially adjust the rate of change for Auto #2492

Open
Jademalo opened this issue May 4, 2024 · 2 comments
Open

[Feature Request] Exponentially adjust the rate of change for Auto #2492

Jademalo opened this issue May 4, 2024 · 2 comments

Comments

@Jademalo
Copy link

Jademalo commented May 4, 2024

I've been trying to use the Auto fan curve, but I've been running into problems in situations where the load on the GPU changes.

In order to combat hysteresis, I had a slow rate of change selected. This is great at holding the target temperature once it zeroes in, but if the fan is running slowly it can take a huge amount of time to speed up to where it needs to be, resulting in thermal throttling.
It also has issues the opposite way, where the fan will overcool, resulting in the dynamic percentage being lost. It will then fall back to the coarse step values present near the idle temp, often again overcooling, and then settling into an equilibrium far colder than the target with far too high a fan speed.

The proposals I have to make this a bit more usable are as follows;

  1. Add an option to make the rate of change exponential. If it needs to slow down or speed up the fan for more than one tick, compound the changes. For example, If the step is set to say, 0.1%, then for the first tick it would be 0.1%, the second tick 0.2%, the third tick 0.4% etc. This would make it easier for the curve to zero in on the ideal fan speed while still having the fine grained control to prevent hysterisis.
  2. When using the above, disable the coarse jumps at lower temps to make it easier for the curve to settle on a lower number. This would not be necessary with the exponential growth to the rate of change, as it would be able to coarsely zero in on the necessary value fairly quickly. This would also have the benefit of solving the false equilibrium issue, since at lower temps it would use fine control while the temperature climbed rather than the coarse jumps.

Hopefully this makes sense, I've spent hours today trying to get it to work and I just can't work around these issues. The coarse jumps are ultimately the cause of all my headaches, since if you're not in the "sweet spot" close to the target temperature then you can end up in situations where it's overcooling and needlessly loud.

Thanks

@Rem0o
Copy link
Owner

Rem0o commented May 4, 2024

it can take a huge amount of time to speed up to where it needs to be, resulting in thermal throttling.

It is set that, if "under load", it will already go to 75% of the max speed range you set at the first change. Might not be 100%, of the max fan speed, but that should still give you a good enough response to avoid throttling before the dynamic part settles in? You could also increase the max fan speed.

It will then fall back to the coarse step values present near the idle temp, often again overcooling, and then settling into an equilibrium far colder than the target with far too high a fan speed.

When not "under load", the auto will act as a linear fan curve with hysteresis + response time. I'm not quite sure to understand the overcooling part. You can reduce your min fan speed.

There is no "dynamic control" when not under load, because then what's the target? If your idle temp is 30 and load 70, and you're at 45. Is that a hot idle or a cool load? Increase of decrease? Idle state could simply always be min fan speed and that's it, maybe that's easier to understand. Auto fan curve could also have some kind of visual indicator when it's in "under load", so the user understand it will dynamically change the speed to maintain the lowest possible %/RPM to keep it under the load temp.

Add an option to make the rate of change exponential.

That doesn't work. Makes for a horrible experience, aka not smooth. It will result in an unstable control. Put your step% to 3-4-5% and see how it behaves on changing loads, you'll see what I mean.

@Jademalo
Copy link
Author

Jademalo commented May 5, 2024

Apologies, I don't think my original post was clear enough - The issue isn't with one consistent load that's easy to tune, it's when there are multiple tiers of load.

To use an example from my testing, I have a game that has two states. One state is the gameplay itself, which is a heavy load that pulls the full 400w of my card and doesn't reach the fps cap. The other is the pause menu, which ends up hitting the fps cap so the card lowers it's power draw to 300w.

Manually setting fan speeds, with a 400w load I can keep it steady at 87 degrees with ~86% fan. With the 300 watt load, I can keep it steady at 87 degrees with ~57% fan.
The difference in sound is substantial, since 86% sounds like a jet taking off whereas 57% is barely audible over the other case fans.

Because of this I have a goal - I want the card to stay at 87 degrees regardless of the load.

With the auto fan curve, this is very easy to tune on a per load basis. With the 400w load I can set the temp I want with fan between 75-90. For the 300w load, I can set the same temp but fan between 45-60.

The issue is trying to make a curve that can cover both loads.
If I make a general curve with a 55 degree idle temp, 87 degree target, 30-90% fan, and 0.1% step, it seems to work fine initially. The temp of the GPU will settle at 87, and the fan percentage will settle at exactly what is required of the load. The issue only starts when the load changes.

If I'm running a strong load of 400w and the fan is settled at around 86%, when the load changes to 300w suddenly the card cools down rapidly. It cools to ~78 degrees, which is within the linear band. This ends up being ~75% fan, which as I mentioned earlier is too much cooling for the 87 degree target. This means it never gets above 81, which means it never starts getting the dynamic control to reduce the fans to ~57%, and instead of being barely audible the fans are now blaring at 75%. This is what I meant by overcooling.

In the opposite case, if I'm running a light load of 300w and the fan is settled at around 57%, when the load changes to 400w there's nowhere near enough cooling. It immediately hits the thermal limit and starts to throttle. The issue now is that since the card was already "hot" and settled at ~57%, it has to slowly increase all the way up to ~86%. At 0.1% per second this takes a minute and a half, which as you can imagine isn't ideal.

I appreciate your points though, they were just the only ideas I could think of to try and solve it. I also tried loads of fancy setups with temperature gates and states, but while I could tune it for two loads, if I then had, say, a 350w load it would just get stuck in hysterisis.

I honestly don't know if this is a solvable problem without a totally different approach. The only other idea I had was a coarse fan curve based on GPU wattage rather than temperature to be able to detect load changes, which could then be mixed with a finer curve based on temp. I expect that's got it's own problems, though.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants