Dynamic Overclocking Project for Linux
ATXP1 chip description
On this page I'm going to place all the information about the nForce2 chipset and mainboards it's installed on I manage to gather.
I'll also place any programs I write and try to update this page as fast as possible, but since now my exams are comming, I'll probably be out of time till july. Write me a mail if you're interested in the project (marcin_ml at sekretarka.no-ip.org).
1. The idea
The very basic idea of this project is to implement dynamic overclocking algorithm as a natural evolution of static overclocking.
Under the term static overclocking I understand what I think most people mean by overclocking - that is: You enter the BIOS, set some FSB/multiplier, increase Vcore if needed to keep system stable, start 3Dmark/Q3 timedemo/whatever to check if the system is stable for a longer period of time and if it doesn't overheat.
If its ok, you repeat everything until the temperature limit is reached. After that you happily run/use/play on your OC'ed PC.
An extention to this can be a program that switches FSB settings between powersaving/normal or normal/overclocked depending on system load. The situation is even better when you have a mobile CPU and can change multiplier and therefor frequency in smaller steps to keep system load around some given value like 80%, which is what powernowd does.
Known is the fact, that the colder CPU is, the faster it can run. Therefore I'll define a function f(T) saying at what maximal frequency the CPU can ran at given temperature without crashing (it naturally implies T(f) function saying what temperature can't be exceeded at given freq). For the sake of simplicity I'll make an assumption that this maximal frequency is independent of CPU Vcore, which implies:
- To run at certain frequency the cpu needs V(f) voltage provided that the temperature is less or equal to T(f).
- If the temperature is higher than T(f), the CPU will crash no matter what the voltage is.
As I'm writing this program to be NForce2 and my PC specific (at first at least)
- I'll assume the default FSB is 200 and multiplier is 9.5 (for now), because I'm running Barton 2500+ (166x11 nominal).
- The smallest possible FSB is 167 MHz (because it crashes when changing it from 200 MHz below this freq with software - anyone has the same problem??)
- The largest possible has only natural limits (for me it's the memory - I have Twinmos DDR400 CL 2.5 which gives CL=2.5*1/200E6=12.5 ns. For CL=3 (highest possile) it gives f=1/(12.5E-9/3)=240 MHz. But I think that overclocking it by 11% to 266MHz is acceptable (if only mb can stand it :-)
So - getting to the point - by dynamic overclocking I mean:
- Setting highest possible freq/voltage for a given temperature if the CPU load is 100%
- Monitoring CPU temp and lowering FSB/Vcore not to exceed T(f) crash temperature. After some time it should stabilize on values you got from static overclocking
- If the load is less than 100% (i.e. divx movie) - changing FSB/Vcore so that CPU load is i.e. 80%
- If the system is idle, set lowest possible (or desired) FSB/Vcore to save power/lower CPU temp in order to be able to set FSB/Vcore as high as possible in point 1 when CPU load gets high
Program funcionality description
This is what I'd like the program to be:
- Probes CPU load quite often - 10 times per second for a start
- if its idle, it turns down the FSB to either minimum (167 for me, tell me if lower values are working for you (but for 200 MHz FSB set in BIOS)) or to user-specified value if 167 is too slow. Then it adjusts Vcore,Vdimm and all other
- if CPU load changes from 0 to 100% (X is starting or something) it overclocks the system as high as the current temerature allows. Then it lowers the FSB clock as the processor gets hotter in order to prevent a crash
- if the load doesn't drop (creating divx movie) FSB,Vcore,T finally reach stable state.
- if the load is caused by niced programs, it can either ignore them completely and turn to idle settings or, for example, switch to nominal settings (200x9.5 for me).
- if CPU load is less then 100% (caused by normal, not niced programs) it sets FSB so the resulting load is at user specified value (80%)