Frage Ryzen 5000 - Erhöhte Leistungsaufnahme durch Windows Zeitgeberauflösung

Lovelace_187

Neuling
Mitglied seit
Mrz 31, 2020
Beiträge
4
Bewertungspunkte
2
Punkte
2
Hallo,

nach dem Wechsel auf mein neues System ist mir bei der Leistungsaufnahme etwas seltsames aufgefallen.
Direkt nach starten von Windows 10 beträgt diese ca. 60W. Nach einiger Zeit steigt diese jedoch auf ca. 83W an.

Als mögliche Ursache konnte ich die Auflösung des globalen Zeitgebers von Windows ermitteln.
Standardmäßig liegt diese bei meinem (und wohl den meisten aktuellen Systemen) bei 15,6 ms.
Eine Software kann diesen Zeitraum bis auf einen Platformabhängigen minimalwert (hier 0,5 ms) reduzieren.
Dies wird z.B. für grafische Animationen oder beim Abspielen von Audio oder Video Inhalten benötigt.
Beobachtet habe ich bisher minimal 1ms, gesetzt von z.B. Edge (YouTube) / Steam oder AMDRSSrcExt.exe (wohl ein Teil vom Grafiktreiber).

Zum Vergleich habe ich auf unterschiedlichen Systemen die Auflösung in 0,5ms schritten getestet,
wobei kein anderes System dieses Verhalten zeigt:

Zeitgeberauflösung (ms)5950X36003550U1950X3770K
15,625 (Idle)60W53W6W70W35W
661W----
462W----
2,564W----
270W----
<= 1,583W----

Nun stellt sich mir die Frage ob bei meinem System ein Konfigurationsfehler vorliegt oder ob dieses Verhalten auch bei anderen (Ryzen 5000) Systemen beobachtet werden kann.



AMD Ryzen 9 5950X
ASUS ROG Crosshair VIII Dark Hero (BIOS: 3302)

AMD Threadripper 1950X
ASRock X399 Taichi

AMD Ryzen 3600
Gigabyte X570 Elite

Intel 3770K
Gigabyte Z77 UD3H

Lenovo T495
3500U

Energiemessgerät:
ELV Energy Master

C++ :
#include <iostream>
#include <windows.h>
#include <timeapi.h>
 
extern "C" NTSYSAPI NTSTATUS NTAPI NtSetTimerResolution(ULONG DesiredResolution, BOOLEAN SetResolution, PULONG CurrentResolution);
 
int main()
{
    for (int i = 5000; i <= 150000; i+=5000)
    {
        ULONG currentResolution = 0;
        NtSetTimerResolution(i, TRUE, &currentResolution);
        std::cout << "Test (ms): " << currentResolution / 10000.0 << "\n";
        Sleep(10000);
        NtSetTimerResolution(i, FALSE, &currentResolution);
        std::cout << "Test (ms): " << currentResolution / 10000.0 << "\n";
    }
}

Hintergrund (Englisch):
https://randomascii.wordpress.com/2013/07/08/windows-timer-resolution-megawatts-wasted/
https://download.microsoft.com/down...-412a-a8b6-5e0a75d5b237/timer-resolution.docx

SysinternalsSuite: Clockres.exe / Clockres64.exe
>> Gibt die maximale, minimale und aktuell niedrigste angeforderte Zeitgeberauflösung an:
1620237841719.png

Windows: powercfg (/energy)
>> Analysiert die Aktivität des Systems in einem Zeitraum (Default: 60 Sekunden) und gibt anschließend einen Report aus:
1620237777412.png
 
Ok, hätte wohl doch besser erstmal das BIOS zurückgesetzt.

Es liegt wohl an folgender Einstellung:
Local APIC Mode [Auto]->[x2APIC]

"When enabled, processor x2APIC support helps operating systems run more efficiently on high core count configurations and optimizes interrupt distribution in virtualized environments. Enabled mode only provides the support necessary to the operating system."

Default ist Auto, mit "high core count" ist wohl auch eher sowas wie 128 gemeint und nicht 16.
 
Oben Unten