Az AM2-es Sempron után belenyúltam a K10-es P állapotaiba is. A Sempronnál használt phc sajnos nem működik az újabb processzoroknál. Szerencsére ez másnak is szúrta a szemét és elkészült egy program, ami a processzor regisztereinek átírásával és el hasonló eredményt.
Először betöltöttem az msr modult:
modprobe msr
ls /dev/cpu/0/msr
Másodjára letöltöttem a k10ctl-t és lekérdeztem a beállításokat:
wget http://downloads.sourceforge.net/project/k10ctl/k10ctl/090709/k10ctl.tar.bz2?use_mirror=garr&ts=1279462829
tar jxf k10ctl.tar.bz2
cd k10ctl
./k10ctl 0-3
Csak a 3. magot másolom ide, a többi beállítása megegyezett vele.
VID interface mode: serial
CPU3
Current P-State: 3 Fastest P-State: 0
NbVid NbDid CpuVid CpuDid CpuFid UNb CpuMult UCpu PCore
P-State 0: 30 0 16 0 12 1175.0mV 14.00000 1350.0mV 35100mW
P-State 1: 30 0 24 0 5 1175.0mV 10.50000 1250.0mV 24250mW
P-State 2: 30 0 32 0 0 1175.0mV 8.00000 1150.0mV 20815mW
P-State 3: 30 0 40 1 0 1175.0mV 4.00000 1050.0mV 12915mW
Low Limit: 124 1 124 0.0mV 0.50000 0.0mV
High Limit: 16 1 16 1350.0mV 14.00000 1350.0mV
Target: 30 0 40 1 0 1175.0mV 4.00000 1050.0mV
Current: 30 0 40 1 0 1175.0mV 4.00000 1050.0mV
OK, ez így elég zagyva. Rövid magyarázat után sokkal érthetőbb lesz. A P-State a különböző CPU teljesítményt határozza meg. A P0 a leggyorsabb és a P3 a leglassabb, amit az órajel szorzó változtatásával ér el a CnQ (CpuMult). A szorzót a CpuFid és a CpuDid határozza meg:
CpuMult = (CpuFid + 16) / (2^(CpuDid+1))
Természetesen az energiatakarékossághoz a CPU core feszültségét (UCpu) is változtatja. Ezt a CpuVid állítgatásával teszi. Ha a VID eléri a 124-et, akkor elvileg 0V-ot kap a processzor. Az aktuális feszültséget ebben az esetben könnyű kiszámítani, mert a VID interface serial módban van:
else U=1550mV - vid*12.5 mV
Lehetőség van a northbridge állítgatására is, az előzőek és a k10ctl leírása alapján könnyen megérthető. Az elmélet után lássuk, hogy mire jutottam a két processzorral.
Eredmények
A programmal nagyon egyszerű a regiszterek átírása. Az első paraméter a magokat, a második a P állapotot, majd jönnek a beszédes paraméterek. A legfontosabbak a következőek.
-cv Core Voltage
-cd CpuDid
-cf CpuFid
Például állítsunk be az összes magnál kicsit alacsonyabb feszültséget teljes terhelés esetére, majd kérdezzük le:
./k10ctl 0-3 0 -cv 32
./k10ctl 0-3
A lényeg a következő két sor. Az elsőt már láthattátok. Az utolsó előtti érték 0.2V-al csökkent, ahogy az előre jósolt magonkénti fogyasztás is kicsit több, mint 20W-tal.
P-State 0: 30 0 16 0 12 1175.0mV 14.00000 [B]1350.0mV 35100mW[/B]
P-State 0: 30 0 32 0 12 1175.0mV 14.00000 [B]1150.0mV 29900mW[/B]
A gépben egy HD4850 két 1T-ás Samsung F1 és 8GiB memória lakik. Kipróbáltam pár beállítást, csak pár bolond biztosat osztok meg veletek. Sok próbálkozással természetesen lehetne többet is nyerni, de nem kísérleteztem vele sokat. Írtam egy kis scriptet, ami 15 percenként növelte a CPU VID értékét, majd pár percre stress teszttel kínozta a gépet. Amikor lefagy, megvan a határeset. Én ehhez adtam hozzá 100mV-ot kerekítettem 0.05V-ra.
Phenom 920
Pár érdekes megfigyelést tettem:
- Beállítás után egy power state váltásig nem áll be az új érték. Gondolom akkor olvassa csak ki az új értéket a regiszterből. Ehhez elég, ha egy másodpercre elindítom a stress-et mind a 4 magra.
- Terhelés nélkül a 400MHz-es már nem számít, ahogy a NB feszültsége is csak 1W-ot hoz a konyhára.
- A CnQ elég jól dolgozik, csak kis csökkenés érhető el
- Terhelésnél is a CPU feszültsége a meghatározó, de itt már az NB is hozott rendesen a konyhára.
- Az NB osztót próbáltam, de semmi nem változott. Vagy az nv8300-ra épült alaplap nem szereti, vagy tényleg nem számít.
Az Athlon X2 240 hasonlóan reagált. A gépben 4G RAM, egy darab 1T Samsung F1 van, de a GPU az alaplapi 8100 kicsit tuningolva, a HD tartalmakhoz. Az NB feszültségének változtatása teljesen értelmetlen, a nagyfogyasztó L3 teljesen hiányzik. Alap esetben a fogyasztás (idle-load) 59/109VA. A CPU feszültségét üresjáratban lecsökkentettem 0.8V-ra, ami 55VA-re volt elég. Terhelés alatt 1.15V mellett 95VA-re csökkent a fogyasztás. Ez meglepett, mert egy magra vetítve nagyobb a csökkenés, mint a Phenomnál, talán a Phenom L3 cache lehet az oka?
A beállítások véglegesítése nem nagy mutatvány. Az msr modult az /etc/modules-ban tölthetjük be automatikusan. A megfelelő rc.d-be pedig kell egy script, ami az összes P állapotra tartalmaz egy sort. Talán, ha öt sor az egész. Most, hogy írom a bejegyzést gondolkoztam el, hogy érdemes lenne megmérni a HD4850 fogyasztását. Esetleg azon többet lehet nyerni, mint a k10ctl segítségével. Ha működne a Hybridpower linux alatt, akkor kártyát is lehetne cserélni. Az is jó kérdés, hogyha a monitort az IGP-re kötöm, akkor linux alatt le lehet-e teljesen kapcsolni a nem használt diszkrét kártyát.