Grazie al Kernel Linux 5.17, i processori AMD più recenti, cioè Zen2 (Ryzen 3xxx) e Zen3 (Ryzen 5xxx), possono contare su un nuovo modulo per il CPU Frequency Scaler che si chiama amd_pstate e si pone come alternativa al default acpi_cpufreq.
Sembra che questo nuovo modulo sia dovuto a Valve, interessata al risparmio energetico per il suo Steam deck.


La gestione energetica delle CPU è basata sul sopracitato driver, automaticamente abilitato dal kernel, su cui si può agire tramite uno scaling governors e uno scaling delle frequenze (di cui parleremo in questo articolo).
Il driver può essere personalizzato con un userspace tool quale cpupower, thermald, ecc. Io uso cpupower. È con questo tool che possiamo impostare il limite di frequenza minimo e massimo della nostra CPU, altrimenti il kernel li assegna a modo suo (per lo più in modo corretto!)
Lo scaling governors viene impostato automaticamente dalla distribuzione (in genere Ondemand) ma può essere variato manualmente, io uso schedutil per risparmiare o performance se devo fare editing video, rendering o simili.
Il CPU Frequency Scaler fa variare la frequenza di funzionamento da un minimo (con risparmio di energia e minima temperatura) ad un massimo (la frequenza base della CPU con in più il turbo boost), in questo caso si aumenta la performance a scapito di energia e temperatura.
Il funzionamento è semplice: vengono creati dei Pstate a varie frequenze, il kernel sceglie la più bassa (P2, nel mio caso) e poi, a seconda delle richieste che arrivano passa da un Pstate ad un altro in modo da ottimizzare le performance. Nel mio Ryzen 3700X, utilizzando schedutil e acpi-cpufreq avevo 3 Pstate:

P0 = 3600MHz (la frequenza di base della CPU)
P1 = 2800MHz
P2 = 2200MHz

Il boost non ha un Pstate assegnato, ma generlamente è attivo di default e si gestisce da se.

Nel passare da una frequenza all'altra c'è sempre un certo ritardo che diminuisce le prestazioni, ma nella maggior parte dei casi non è importante.
Il nuovo amd_pstate gestisce meglio le frequenze aumentando il numero dei Pstate (che quindi hanno un minore intervallo di frequenze nel passare da uno all'altro). Nel mio caso si parte da un minimo di 500MHz fino al massimo consentito dal turbo boost (4430MHz). Una bella differenza rispetto a prima, con un consumo e una temperatura sensibilmente minori. Penso che ci si avvicini all'efficenza dei processori Intel, con il loro intel_pstate. Le prestazioni però mi sembrano leggermente calate a causa dei continui e numerosi salti di frequenze ognuno con un certo lag. La differenza non è molta perché i lag, anche se sono di più, sono di valore minore a causa del minor salto di frequenze. Se ci servono prestazioni si può sempre passare al governors performance che fissa la frequenza a quella base più quelle di boost, senza mai scendere a valori minori.

Ma vediamo ora come abilitare il nuovo Frequency Scaler. Il kernel usa come default il vecchio e stabile acpi_cpufreq, quindi dobbiamo prima mascherare questo modulo e poi attivare quello nuovo:

# nano /etc/modprobe.d/blacklist.conf

e vi si scrive dentro:

# mask acpi-cpufreq  module
blacklist acpi-cpufreq

Dopo aver disattivato il driver acpi_cpufreq, dobbiamo caricare il modulo amd_pstate. Ogni distro ha il suo modo preferito, in Arch si può modificare direttamente l'initramfs:

# nano /etc/mkinitcpio.conf

e nella sezione modules inserire:

MODULES=(... amd_pstate)

Infine aggiornare l'initramfs:

# mkinitcpio -p linux
# reboot


Verificare che sia stato caricato il nuovo driver con:

$ cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_driver

che dovrebbe restituire la voce:

amd_pstate

Se non funziona possiamo ancora agire sui parametri del kernel
tramite Grub o ad altro boot loader. Per Grub io faccio:

# nano /etc/default/grub

e alla linea:

GRUB_CMDLINE_LINUX_DEFAULT="loglevel=3 ..."

Aggiungo la voce:

amd_pstate.shared_mem=1

Salvare. Infine si riaggiorna il grub con il metodo usato dalla vostra distro; per Arch è il comando:

# grub-mkconfig -o /boot/grub/grub.cfg
# reboot


Per controllare il risultato potete dare il comando:

 

$ cpupower frequency-info

 

Ecco fatto, avete il nuovo amd_pstate e potrete vantarvi di aiutare l'ambiente con un miglior risparmio energetico!