NVidia [Skript] Windows PowerPlan Switcher for Nvidia

S

Stunrise

Guest
Hallo zusammen,

ich habe ein Skript geschrieben, dass automatisch den Windows Energiesparplan in Abhängigkeit von der Nvidia-GPU Auslastung und P-State ändert (Nur mit Nvidia Grafikkarten kompatibel). Damit kombiniere ich den "Balanced" Energiesparplan für Non-Gaming mit dem "High Performance" Energiesparplan, während die Grafikkarte belastet ist, ich also am zocken bin.

Sobald die Grafikkarte in den P0 (Performance State wechselt und mehr als 25% GPU-Auslastung hat: High Performance
Während die Grafikkarte in einem Energiesparmodus ist oder weniger als 25% GPU-Auslastung hat: Balanced
Alle Parameter sind im Block ## To Fill ## frei konfigurierbar

Gerade bei Gaming hat der Prozessor sehr schwankende Last, sodass mit dem Balanced Energiesparplan im GPU-Limit deutliche Latenzen und Lagspikes entstehen können, weil Prozessorkerne bei niedriger Last heruntertakten und dann bei einer Lastspitze erst wieder hochtakten müssen. Je nach Spiel sind die Auswirkungen nicht vorhanden (Quantum Break) bis zu extrem störend (Overwatch oder Nioh).

  • Das Skript verursacht keine nennenswerte Auslastung
  • Beim Browsen wird Strom gespart, beim Zocken sind die Latenzen minimiert
  • Das Umschalten erfolgt automatisch und die Parameter können im Skript konfiguriert werden

Code :
## To Fill
$NvidiaSMIFolderPath = "C:\Program Files\NVIDIA Corporation\NVSMI"
$GamingPState = "P0"
$MinGPUUsage = 25
$CheckEverySeconds = 10
$GamingPowerPlanID = "8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c"
$NoGamingPowerPlanID = "381b4222-f694-41f0-9685-ff5bb260df2e"

## Power Plans IDs (Use Without #)
# 381b4222-f694-41f0-9685-ff5bb260df2e = Balanced
# 8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c = High performance
# a1841308-3541-4fab-bc81-f71556f20b4a = Power saver

$SMICommand = "& '" + $NvidiaSMIFolderPath + "\nvidia-smi.exe`' --query-gpu=pstate,utilization.gpu --format=csv,noheader,nounits"


while ($true){
    $GPUData = (Invoke-Expression -command $SMICommand).split(",")

    if ($GPUData[0] -eq $GamingPState -and [int]$GPUData[1] -ge $MinGPUUsage){
        powercfg -s $GamingPowerplanID
    }
    else{
        powercfg -s $NoGamingPowerPlanID
    }
    Start-Sleep -seconds $CheckEverySeconds
}


Anleitung

1: Kopiert den Skript Code in eine Textdatei auf eurem Computer und benennt diese von .txt zu .ps1 um (in meinem Beispiel C:\Install\Skripts\Nvidia_PowerPlanSwitcher\Nvidia_PowerPlanSwitcher.ps1)

2: Öffnet die Aufgabenplanung (Task Scheduler in eng) und geht auf "Neue Aufgabe erstellen / Create Task". Folgt nun den Bildern.

1.jpg

2.jpg

3.jpg

Nach diesen Einstellungen könnt ihr die Aufgabe / Task mit OK speichern und müsst nur noch euer Kennwort eingeben.

4.jpg

Ab dem nächsten Windows-Start läuft nun mit 1 Minute Verzögerung das Skript und prüft alle 10 Sekunden die GPU-Auslastung, um dann den Windows Energiesparplan entsprechend zu setzen. Im Task Manager läuft das Skript dann als "powershell.exe". Während ich hier also in Edge diese Zeilen verfasse, ist der Balanced Energieplan aktiv, sobald ich aber ein Game starte, wird nach wenigen Sekunden in den High Performance Energiesparplan gewechselt.

Getestet unter Windows 10 mit einer GTX 1080 und einem Standard Nvidia Treiber ohne Geforce Experience
 
Schick!
 
Oben Unten