Auf BIOS 303 fällt die GPU des ASUS ProArt P16 nie in den 754-MHz-Zustand, den NVIDIA open-gpu-kernel-modules #1521 beschreibt. Nach einem Boost von etwa 15 Sekunden pendelt sie sich auf das Budget ein, das die Thermal-Policy des ASUS Embedded Controllers (EC) vorgibt: 22 W in Silent, 32 W in Balanced, 55 W in Performance.

Der Stock-Kernel von Omarchy hat auf ARM64 keinen ASUS-WMI-Treiber. Er kann die Policy also nicht ändern und bleibt beim Balanced-Default des EC mit 32 W. Der NVIDIA-Treiber setzt diese Grenze nicht.

Testsystem

KomponenteStand
GerätASUS ProArt P16 H7607BA
BIOS / EC303 (2026-09-22) / EC 3.3
GPUN1X, 10de:2e03, VBIOS 9A.0B.35.00.04
Kernel7.3.0-41-omarchy (Stock) und 7.3.0-41-omarchy-p16
NVIDIA-Treiber615.78.08 und 620.70.06
Gemessen2026-11-09

Ein Schalter setzt das Budget

Die Werte stammen aus 180 s FP32-GEMM, jeweils der Median von Sekunde 60 bis 175.

PolicyDEVS-WertDauerleistungSM-TaktFP32
Silentv=222 W1124 MHz9,2 TFLOP/s
Balancedv=032 W1540 MHz12,4 TFLOP/s
Performancev=155 W1979 MHz15,9 TFLOP/s

Balanced ist der Default des EC und das, was der Stock-Kernel bekommt. Ich habe Balanced auch als meinen Default gewählt. Performance boostet etwa 25 s lang auf 72 W, die GPU erreicht dabei maximal 80 °C.

GPU-Leistung während 180 s FP32-GEMM, je ASUS-Thermal-Policy

Jeder Lauf startet nach einer Abkühlphase. nvidia-smi liefert alle 500 ms einen Messwert, die Grafik zeigt den Mittelwert pro Sekunde. Jede Policy boostet zuerst und pendelt sich dann ein. Die Stock-Kernel-Kurve (gestrichelt) liegt auf der Balanced-Kurve: Ohne ASUS-Treiber bleibt der EC in Balanced.

LaufKernelPolicySpitze WDauer WSM MHzGFLOP/sGPU max °C
h2p16Performance71,755,319791592580
h1p16Balanced50,232,115401242573
c1Stock(EC-Default)48,031,615301234572
f3p16Silent40,322,41124915873

Policy-Wechsel unter Last

Um zu belegen, welcher Aufruf das Budget setzt, habe ich den P16-Kernel mit gesperrtem asus_nb_wmi gebootet. Dann habe ich einzelne ASUS-WMI-Aufrufe per acpi_call von Hand abgesetzt, während der GEMM lief.

Der Lauf startete in Performance, weil der vorige Boot diesen Modus gesetzt hatte. Der EC behält seinen Modus über Warmstarts. Silent senkt die GPU innerhalb von etwa 4 Sekunden auf 22 W. Balanced bringt sie auf 31,5 W. Der vorher getestete INIT-Aufruf (Lauf g1) änderte nichts.

Lauf g2: GPU-Leistung mit Policy-Wechseln unter Last

Die Leistung stellt sich nach jedem Aufruf innerhalb von Sekunden ein. Der SM-Takt folgt ihr: etwa 2150 MHz im Boost, 1110 MHz in Silent und 1510 MHz in Balanced.

Wie ein Profilwechsel beim EC ankommt

  1. powerprofilesctl set balanced: power-profiles-daemon schreibt /sys/firmware/acpi/platform_profile.
  2. asus-nb-wmi → throttle_thermal_policy: Das gibt es nur auf dem P16-Kernel. Die ASUS-WMI-Unterstützung für ARM64 stammt aus omarchy-pkgs PR 1958 (Patch 9100).
  3. \_SB.ATKD.WMNB → DEVS(0x00120075, v): v = 0 ist Balanced, 1 Performance, 2 Silent. DSTS liefert immer 0x00010003. Die Firmware meldet den aktuellen Modus also nie.
  4. WEBC(0x11, mode): Der EC-Befehl nimmt Mode 1 für Balanced, 4 für Performance und 2 für Silent. Er schreibt außerdem die EC-Register C4/C5/CC/CD und setzt \_SB.THPL. Danach erzwingt der EC das GPU-Budget.

Ohne ASUS-Treiber (Stock-Kernel) funktioniert derselbe Aufruf über acpi_call mit einem 20-Byte-Puffer. Das ist nur für Tests gedacht und kein Teil meines Setups:

\_SB.ATKD.WMNB 0 0x53564544 {0x75,0,0x12,0, v, 0…}
# 0x53564544 = "DEVS"   0x00120075 = throttle_thermal_policy

INIT setzt nur \_SB.ATKP = 1. Das schaltet Hotkey-Benachrichtigungen frei und hat keinen Einfluss auf die Leistung.

Was die 32-W-Grenze nicht verschoben hat

Bevor ich den ASUS-Kernel ausprobiert habe, habe ich auf dem Stock-Kernel jede Änderung auf NVIDIA-Seite und an der Stromversorgung getestet. Jeder Lauf zeigt dasselbe Bild: etwa 48 bis 50 W bei rund 2000 MHz für etwa 15 s, danach eine flache Software-Power-Cap (Grund 0x4) bei 32 bis 33 W.

LaufTreiberLastBedingungGrundSM MHzGPU WGFLOP/s (Median)
b1615FP32Netzteil, ppd performance0x4158633,112954
b3615FP32Netzteil, ppd balanced0x4157333,012827
b2615BF16Netzteil0x400189130,367040
c1620FP32Netzteil0x4154031,712421
c2620BF16Netzteil0x400184629,365684
d1620FP32Netzteil, RMSkipACPIBattCap=10x4154732,312487
e1620FP32Akku, RMSkipACPIBattCap=10x4156032,412596
e2620FP32Akku, Netzteil nach 60 s eingesteckt0x4~154032,312539

Die Werte sind Mediane aller Samples mit mindestens 50 % GPU-Auslastung. Die BF16-Läufe treffen einen anderen Limiter (0x400) bei etwas geringerer Leistung. Das Profil von power-profiles-daemon wirkt auf dem Stock-Kernel nicht, weil es dort nur die CPU steuert (nvidia_rtx_spark).

Vergleich mit #1521

Die Reporter im Issue nutzten BIOS 300, mein Gerät läuft mit BIOS 303.

PunktIssue (BIOS 300)Hier (BIOS 303)Ergebnis
747–754 MHz P4-Cap unter Last (0x400)Ja (kopierte DSDT oder vor einem EC-Reset)Nie gesehen: 615 und 620, Netzteil, Akku, UmsteckenAnders
NPCF _DSM antwortet nur auf Rev 0x300JaJa. Ein statischer Stub: f1 ein fester 128-Byte-Blob, f2/f3 sechs Null-Bytes, kein NotifyGleich
Power Limits N/A, Dynamic Boost “Not Supported”JaJaGleich
nvidia-powerd 615: “SBIOS support not found for NVPCF GET_SUPPORTED”JaJaGleich
nvidia-powerd 620 beendet sich nach ~0,25 sJaJa, gleicher Binary-HashGleich
Dauerleistung im schnellen Zustand47,6–61,6 W (seankd3, ASUS-WMI-Kernel, mehrere Änderungen gleichzeitig)32 W Stock, 55 W mit Performance-PolicyErklärt
RMSkipACPIBattCap=1Zusammen mit zwei anderen Änderungen genutztAllein: keine Wirkung, weder am Netzteil noch auf Akku. Nicht im offenen RM-Quellcode, aber als String in der GSP-FirmwareNeu
Akku gegen NetzteilAkku hob die 754-MHz-Cap nicht aufAkku = Netzteil (gleiche 32 W)Neu
Umstecken unter LastHP: kurz 1625–1781 MHz1 s Einbruch auf 689 MHz, 1 s bei 40,8 W, dann wieder 32 WAnders
Tickrate von %clock64190 M Ticks/s an der Cap (als SM-Takt gelesen, später zurückgezogen)2490–2590 M Ticks/s, egal ob der SM mit 1500, 1900 oder 2150 MHz läuft. Auf N1X ist das also nicht der SM-TaktNeu

Was die Policy für LLM-Arbeit bedeutet

Getestet mit llama.cpp a4d4f2f, CUDA 13.4, P16-Kernel und Treiber 620.70.06.

Kurze Benchmarks enden innerhalb des Boost-Fensters. Dort sehen Balanced und Performance fast gleich aus. Erst Dauerlast zeigt den Unterschied. Die Prompt-Verarbeitung ist rechenintensiv und gewinnt mit Performance etwa 16 %. Die Token-Generierung hängt an der Speicherbandbreite (etwa 245 GB/s der ~273 GB/s LPDDR5X-Spitze). Sie gewinnt nur 3,5 %, bei fast doppelter Leistungsaufnahme.

Prompt-Verarbeitung: Tokens pro Joule GPU-Energie

Generierung: Tokens pro Joule GPU-Energie

Grundlage ist der Durchsatz am Ende des Laufs geteilt durch die GPU-Leistung am Ende des Laufs (jeweils das letzte Viertel eines Laufs von ~90 bis 140 s). In Balanced schafft die Generierung 1,9-mal so viel Arbeit pro Joule und ist nur 3,5 % langsamer.

Qwen3.6-35B-A3B (MoE) unter Dauerlast:

TestPolicyDauertok/s Mitteltok/s erstes → letztes ¼GPU W erstes → letztes ¼SM MHz erstes → letztes ¼T max
pp4096 × 60Performance85 s2895,52952,6 → 2865,760,2 → 49,52431 → 219074 °C
pp4096 × 60Balanced97 s2546,32712,6 → 2466,142,0 → 26,32099 → 158672 °C
tg2048 × 5Performance134 s76,376,6 → 76,251,6 → 46,62483 → 239278 °C
tg2048 × 5Balanced138 s74,075,3 → 73,624,8 → 24,01911 → 182073 °C

Zum Vergleich kurze llama-bench-Läufe (pp512 / tg128, 3 Wiederholungen, innerhalb des Boost-Fensters):

ModellPolicypp512 tok/stg128 tok/sGPU W MedianSM MHz Median
Qwen3-32B Q4_K_M (dense, 18,4 GiB)Performance787,6 ± 7,912,40 ± 0,0154,02460
Qwen3-32B Q4_K_MBalanced723,7 ± 3,212,09 ± 0,2123,41729
Qwen3.6-35B-A3B UD-Q4_K_M (MoE, 20,6 GiB)Performance3024,0 ± 48,077,80 ± 0,0148,92528
Qwen3.6-35B-A3B UD-Q4_K_MBalanced2906,4 ± 36,877,45 ± 0,1041,92411

Nebenbefunde

  • power-profiles-daemon kann vor asus-nb-wmi starten. Er hängt sich dann an einen Platzhalter-Treiber und zeigt ein Profil an, das er nie an den EC weitergibt. Ein Drop-in lässt ppd jetzt auf platform_profile warten. Eine udev-Regel startet ppd neu, falls sich der ASUS-Treiber spät registriert.
  • Der EC merkt sich seinen Modus über Warmstarts. Ein Boot ganz ohne ASUS-Treiber lief trotzdem mit 55 W, weil der vorige Boot Performance gesetzt hatte (Lauf g0).
  • %clock64 ist auf N1X nicht der SM-Takt. Er tickt mit etwa 2,5 GHz, egal wie schnell der SM läuft. Die frühere Deutung als Taktmessung in #1521 wurde zurückgezogen.
  • NPCF liefert keine Budgetdaten, die der NVIDIA-RM nutzen könnte, und 620.70.06 behandelt _DSM Rev 0x300 bereits. In open-gpu-kernel-modules gibt es nichts zu patchen.
  • Die Temperaturen blieben innerhalb der Watchdog-Grenzen (Abbruch bei GPU ≥ 87 °C, irgendeiner Zone ≥ 95 °C oder > 1 °C/s ab 75 °C). Die GPU erreichte in Performance maximal 81 °C, die ACPI-Zonen 86 °C. Der Watchdog griff einmal: Lauf g1 stoppte nach 70 s, als eine ACPI-Zone 95 °C erreichte.

Meine Konfiguration

Balanced ist der Default (Entscheidung vom 2026-11-09). Performance bringt 16 % mehr bei dauerhafter Prompt-Verarbeitung und fast nichts bei der Generierung. Dafür verdoppelt sich die GPU-Leistung, das Gerät wird heißer und lauter. Ein anderer N1X-Besitzer meldete eine thermische Notabschaltung, nachdem er die Takte freigeschaltet hatte.

Bei Bedarf wechsle ich mit powerprofilesctl set performance. ppd speichert die Wahl und stellt sie nach einem Neustart wieder her.

Boot-Stack:

  • Default: linux-omarchy-p16 7.3.0-41 (ASUS WMI für ARM64) plus nvidia-open-dkms 620.70.06 mit den 7 Omarchy-N1X-Patches
  • Fallbacks: Stock linux-omarchy und ein Limine-Snapshot-Eintrag mit 615.78.08
  • Nach Kernel-Updates prüfe ich default_entry in Limine, weil neue Einträge die Nummerierung verschieben können

Die Startreihenfolge für power-profiles-daemon:

# /etc/systemd/system/power-profiles-daemon.service.d/10-n1x-wait-platform-profile.conf
[Service]
ExecStartPre=/bin/sh -c 'for i in $(seq 40); do [ -e /sys/firmware/acpi/platform_profile ] && exit 0; sleep 0.5; done; exit 0'
# /etc/udev/rules.d/90-n1x-asus-platform-profile.rules
ACTION=="add", SUBSYSTEM=="platform-profile", ATTR{name}=="asus-wmi", \
  RUN+="/usr/bin/systemctl --no-block try-restart power-profiles-daemon.service"

Eine Korrektur

Mein erster Kommentar in #1521 behauptete, der Sprung von 32 auf 55 W käme allein vom geladenen ASUS-Treiber. Das war falsch. In diesem Lauf (f1) hatte power-profiles-daemon die Policy mitten im Lauf auf Performance gestellt. Der ASUS-Treiber selbst setzt beim Laden Balanced, also 32 W. Die Korrektur habe ich noch am selben Nachmittag gepostet.

Methode

n1xprobe (CUDA 13.4) führt cuBLAS GemmEx mit n=4096 in FP32 oder BF16 aus und meldet GFLOP/s pro Sekunde. Ein Python-Skript fragt nvidia-smi alle 500 ms ab (P-State, SM-Takt, Throttle-Gründe, Leistung, Temperatur) und betreibt den thermischen Watchdog. Jeder Lauf dauert 180 s. Zwischen den Läufen liegen mindestens 60 s Abkühlung auf unter 55 °C. Alle Tests liefen auf einer Wegwerf-Installation von Omarchy 4.5 (edge) auf einer Ersatz-SSD, mit der nativen DSDT der Firmware.

Quellen