Le prove iniziali di auto-vettorizzazione del kernel Linux per RISC-V hanno dato risultati diversi a seconda del carico, dell’operazione e dell’obiettivo hardware: la compressione LZ4 è migliorata del 15,1% su ASC-X, ma è peggiorata del 7,5% su K3. Le misure sono state presentate alla Linux Plumbers Conference 2026, svoltasi a Praga dal 5 al 7 ottobre; le slide riportano i guadagni rispetto a mtune e includono anche test su Btrfs, XFS e Nginx (descrizione ufficiale della sessione; slide della presentazione).

Per auto-vettorizzazione si intende la generazione automatica, da parte del compilatore, di istruzioni che elaborano più dati in parallelo. Nel contesto descritto dalle slide, Vector è disattivato per impostazione predefinita nel kernel; il suo uso richiede una gestione esplicita del contesto.

I risultati cambiano con il carico e l’obiettivo

Le percentuali della tabella sono guadagni rispetto a mtune. Per LZ4 zram, compressione e decompressione sono riportate in quest’ordine; per Btrfs fsmeta, le operazioni sono creazione e rimozione.

Carico e operazioneObiettivo hardwareRisultato rispetto a mtuneCondizioni
LZ4 zram, compressioneASC-X+15,1%—
LZ4 zram, decompressioneASC-X+1,0%—
LZ4 zram, compressioneK3−7,5%—
LZ4 zram, decompressioneK3+9,4%—
Btrfs fsmeta, creazioneASC-X+5,2%—
Btrfs fsmeta, rimozioneASC-X+8,4%—
Btrfs fsmeta, creazioneK3+6,9%—
Btrfs fsmeta, rimozioneK3+3,7%—
NginxASC-Sda +0,9% a +2,2%Dimensioni servite: da 80 B a 32 KB
NginxK3da +0,3% a +1,9%Dimensioni servite: da 80 B a 32 KB

Per XFS fsmeta, le slide riportano su ASC-X +2,5% e +5,0%, senza associare i due valori a singole operazioni; il risultato su K3 è indicato come non significativo. Il dato di LZ4 su K3 mostra perché il valore migliore non basta a descrivere tutte le prove: anche tra compressione e decompressione dello stesso carico, l’esito cambia.

Il picco di un test non è la media del sistema

Per i benchmark di sistema su K3, le slide indicano una media geometrica del +0,1%. Tra gli esiti negativi figurano la compressione LZ4 (−7,5%) e i test hackbench su processi e thread (−2,51% e −4,06%). Il risultato di un singolo carico, quindi, non descrive da solo l’andamento dell’insieme.

Una diapositiva distinta presenta risultati per una build non portabile e ottimizzata più strettamente per il processore: per K3 indica una media geometrica del +4,98% su 24 benchmark di sistema. Per ASC-X riporta +90,6% su zram-LZ4, +35,4% su zram-zstd e +7,4% e +7,2% per creazione e rimozione in Btrfs. Sono risultati di un confronto separato da quello rispetto a mtune nella tabella: accostarli come se avessero la stessa base altererebbe il significato delle percentuali.

I controlli Vector di Linux riguardano lo spazio utente

Le interfacce Linux PR_RISCV_V_SET_CONTROL e PR_RISCV_V_GET_CONTROL regolano l’uso di Vector per il thread nello spazio utente; /proc/sys/abi/riscv_v_default_allow definisce l’impostazione predefinita per i nuovi processi utente. La documentazione ufficiale del kernel Linux specifica inoltre che le chiamate di sistema possono sovrascrivere i registri Vector secondo la convenzione documentata.

Questi controlli gestiscono l’accesso di thread e processi utente. L’esperimento sul kernel richiede invece meccanismi separati per iniziare l’uso dei registri e salvare e ripristinare il contesto, come kernel_vector_begin() e kernel_vector_end() nelle slide.

Stato dei registri e gestione del contesto

Il salvataggio dei registri Vector v0–v31 occupa 512 B con VLEN 128 e 4 KiB con VLEN 1024. La gestione del contesto a lunghezza variabile e la manutenzione del codice auto-vettorizzato sono tra le difficoltà indicate nella descrizione ufficiale della sessione. Nell’esempio delle slide, l’uso è inoltre soggetto a restrizioni nei contesti hard IRQ e NMI.