PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Polaris undervolting auf Ubuntu?


Godmode
2017-02-16, 16:07:39
Hat das von euch schon jemand versucht? Ich habe schon alles mögliche versucht aber bisher hatte ich keinen Erfolg.

Ubuntu 16.04
AMDGPU-PRO 16.50

1.) BIOS Mods: Bringen leider nichts, da der amdgpu-pro Treiber anscheinend die Werte aus dem BIOS ignoriert.

2.) Treiber Modding: Ich hätte versucht die Spannung direkt in polaris10_smc.c (http://lxr.free-electrons.com/source/drivers/gpu/drm/amd/powerplay/smumgr/polaris10_smc.c) zu patchen, aber auch damit hatte ich keinen Erfolg. Anleitung dazu gibt es hier: https://www.phoronix.com/forums/forum/linux-graphics-x-org-drivers/amd-linux/918649-underclocking-undervolting-the-rx-470-with-amdgpu-pro-success


Eine letzte Möglichkeit wäre noch, dass ich mir den Treiber selber genau anschaue, um heraus zu finden, warum die obige Modifikation bei mir nicht läuft. Ich habe das bisher vermieden, weil es doch einiges an Aufwand bedeuten würde und kein positiver Ausgang sicher ist.

iuno
2017-02-16, 17:22:04
Vorsichtige Nachfrage: ist dir klar, wo du den code patchen musst? der -pro stack hat sein eigenes dkms Modul

Godmode
2017-02-16, 18:10:27
Meinst du mit wo, an welcher stelle im Code, bzw. welches File ich ändern muss? Ja ich dachte das wäre mir klar. Und zwar habe ich nach /usr/src/amdgpu-pro-YOURVERSION/amd/powerplay/smumgr/polaris10_smc.c gesucht und dort dann zwischen bei ca. Zeile 114-120:

*voltage |= 1 << PHASES_SHIFT;
return 0;

diese Zeile eingefügt: *voltage = (*voltage & 0xFFFF0000) + 800*VOLTAGE_SCALE;

sieht dann so aus:
*voltage |= 1 << PHASES_SHIFT;
*voltage = (*voltage & 0xFFFF0000) + 800*VOLTAGE_SCALE;
return 0;

Er überschreibt damit einfach die Spannungswerte, die sonst weiter oben berechnet werden, wenn ich das richtig lese.

Ich habe mich 1:1 an seine Anleitung gehalten. Nach dem editieren des Sourcefiles habe ich die unten stehenden Kommandos ausgeführt, aber auf meine AMDGPU-PRO- und Ubuntu-Version angepasst.

cd /usr/src/amdgpu-pro-16.50-362463
./pre-build.sh 4.4.0-53-generic
make KERNELRELEASE=4.4.0-53-generic -C /lib/modules/4.4.0-53-generic/build M=/usr/src/amdgpu-pro-16.50-362463
find /lib/modules/4.4.0-53-generic -name amdgpu.ko -exec rm -v {} \;
cp /usr/src/amdgpu-pro-16.50-362463/amd/amdgpu/amdgpu.ko /lib/modules/4.4.0-53-generic/kernel/drivers/gpu/drm/amd/amdgpu/amdgpu.ko
depmod -a
update-initramfs -u

Das .ko file wurde auch erzeugt und richtig kopiert, wenn ich rein auf das Änderungsdatum achte. Es gab auch sonst keine Fehler. Muss ich sonst noch etwas machen, damit das Kernelmodul auch verwendet wird? Bin leider nicht wirklich vertraut mit Linux.

Ich werde nachher nochmal amdgpu-pro 16.50 versuchen, weil ich habe es ja mit 16.60 getestet.

Godmode
2017-02-17, 10:42:07
Noch ein Hinweis warum ich glaube dass das Modul ausgeführt wird: Ich habe mit Printk einige Werte gelogt und kann diese im Syslog sehen. Damit kann ich wohl davon ausgehen, dass das Modul auch geladen und ausgeführt wird.

iuno
2017-02-17, 14:24:28
okay, ja, das sollte schon passen.
Dann kann ich dir leider nicht weiterhelfen, damit habe ich mich auch noch nicht beschaeftigt.
Ist das eigentlich eine Referenzkarte? Ich haette erwartet, dass bios modding auf jeden Fall funktioniert. Es scheint auch unlogisch, dass die Werte ignoriert werden. IIRC hatte der Treiber keine Defaults fuer jede Karte.
Woran machst du eigentlich fest, dass UV nicht funktioniert?

Godmode
2017-02-17, 14:57:27
Es handelt sich um PowerColor Radeon RX 480 Red Dragon 8GB Karten. Ich denke es funktioniert nicht, weil ich unter Windows nur 750 Watt Strom verbrauche, auf Ubuntu hingegen 850 Watt.

Werde jetzt noch ein paar andere Sachen loggen, eventuell finde ichs ja selber raus.

Trotzdem danke!

Godmode
2017-02-20, 18:39:04
Ich habe jetzt nochmal alles geprüft und bin zum Ergebnis gekommen, dass das Undervolting doch funktioniert. Wenn ich den neuen Code nicht ausführe, liegt der Verbrauch vom Gesamtsystem bei über 900W. Mit dem Fix komme ich auf 850W. Interessant ist allerdings, dass auf Windows nur ein Verbrauch (Gesamtsystem) von 750W erzeugt wird, wobei dort auch noch ein negativer Offset im Watttool zum Einsatz kommt.

Ich habe jetzt etwas nach dem Voltage Offset im amdgpu-pro Treiber gesucht und wurde auch fündig:


53 #define VOLTAGE_VID_OFFSET_SCALE1 625
54 #define VOLTAGE_VID_OFFSET_SCALE2 100

501 state->VddcOffset = (uint16_t) table_info->us_ulv_voltage_offset;
502 state->VddcOffsetVid = (uint8_t)(table_info->us_ulv_voltage_offset *
503 VOLTAGE_VID_OFFSET_SCALE2 / VOLTAGE_VID_OFFSET_SCALE1);

VOLTAGE_VID_OFFSET_SCALE1 scheinen die 6,25mv zu sein, die wir auch im Wattool unter Windows sehen.

table_info->us_ulv_voltage_offset hat den Wert 30. Durch die Verrechnung mit VOLTAGE_VID_OFFSET_SCALE2 / VOLTAGE_VID_OFFSET_SCALE1 ergibt sich dann für state->VddcOffsetVid ein Wert von 4. (Es würde 4,8 rauskommen, aber da auf uint8 gecastet wird, wird abgerundet).

Ich habe jetzt etwas mit den Werten gespielt, und niedrigere Werte in VddcOffset bzw. VddcOffsetVid geschrieben, aber das scheint keine Auswirkung zu haben.