Il kernel Linux si prepara a eliminare definitivamente le ultime ottimizzazioni dedicate alle istruzioni MMX, una tecnologia introdotta da Intel quasi 30 anni fa per accelerare alcune operazioni sui processori x86. La modifica, proposta dallo sviluppatore Eric Biggers e destinata con ogni probabilità a Linux 7.5, riguarda una porzione molto specifica del codice utilizzato per gestire gli array RAID software. Non significa che Linux smetterà di funzionare sui vecchi Pentium, ma segna la conclusione di una lunga fase di abbandono delle ottimizzazioni progettate per le CPU degli anni ’90.
Le istruzioni MMX debuttarono nel 1997 con il Pentium MMX e arrivarono successivamente su numerosi processori Intel e AMD, tra cui Pentium II e K6. All’epoca rappresentavano una novità importante: permettevano di elaborare più dati attraverso una singola istruzione, anticipando alcune delle tecniche che sarebbero diventate fondamentali nelle successive estensioni SIMD (Single Instruction, Multiple Data).
Oggi, però, il kernel conserva soltanto pochi frammenti di codice che ne sfruttano direttamente le caratteristiche: la serie di tre patch proposta di recente punta a rimuovere proprio gli ultimi.
Che cosa sono le istruzioni MMX e perché furono importanti
MMX, acronimo che Intel associò alla denominazione Multimedia Extensions, introdusse un insieme di 57 istruzioni che permettevano al processore di eseguire la stessa operazione su più numeri contemporaneamente. Anziché elaborare un valore alla volta, la CPU poteva sfruttare registri da 64 bit per lavorare, ad esempio, su otto numeri da 8 bit oppure su quattro numeri da 16 bit con una sola istruzione.
Un registro MMX, per esempio, poteva contenere 8 valori da 8 bit, quattro da 16 bit oppure due da 32 bit. Le istruzioni permettevano di effettuare addizioni, sottrazioni, confronti e altre operazioni su più elementi in parallelo. Era il principio del SIMD, particolarmente vantaggioso per elaborazione delle immagini, audio digitale e alcune trasformazioni matematiche.
MMX presentava tuttavia una limitazione architetturale importante: i suoi 8 registri MM0-MM7 condividevano lo stato fisico con i registri della tradizionale unità floating point x87. Passare dal codice MMX alle operazioni in virgola mobile richiedeva quindi un’attenta gestione dello stato, generalmente attraverso l’istruzione EMMS.
L’arrivo delle istruzioni SSE con il Pentium III nel 1999 cambiò progressivamente la situazione: SSE introdusse registri XMM separati da 128 bit; SSE2, arrivata con il Pentium 4 nel 2000, estese ulteriormente le capacità di calcolo sui dati interi. Le successive generazioni AVX e AVX-512 ampliarono ancora le possibilità di vettorizzazione.
Con il passare del tempo, mantenere implementazioni specializzate per MMX è diventato sempre meno conveniente. Il problema non riguarda soltanto le prestazioni: ogni variante aggiuntiva richiede codice assembly da verificare, percorsi di esecuzione alternativi e controlli per evitare che il processore esegua istruzioni non supportate.
Perché Linux elimina le ottimizzazioni MMX dai sistemi RAID
L’intervento di Eric Biggers riguarda il codice contenuto nelle directory lib/raid/xor/ e lib/raid/raid6/ del kernel. Si tratta di componenti che implementano operazioni matematiche utilizzate nella gestione della ridondanza dei dati, anche dai sistemi RAID software Linux.
Per eseguire rapidamente i calcoli necessari, Linux sfrutta da tempo le istruzioni disponibili sui processori. Le vecchie istruzioni MMX permettevano di accelerare soprattutto le operazioni XOR, utilizzate per generare e ricostruire le informazioni di parità.
Con la prima patch, gli sviluppatori eliminano 515 righe di codice dedicate a questa ottimizzazione; la seconda patch rimuove altre due implementazioni utilizzate da RAID6, basate su MMX e su alcune funzionalità delle prime istruzioni SSE. In pratica, Linux non perde alcuna funzionalità RAID: rinuncia soltanto ad accelerazioni pensate per processori di fine anni ’90, ormai poco utilizzati.
Le CPU moderne continueranno a sfruttare istruzioni più efficienti, come SSE2, AVX2 e AVX-512, mentre i sistemi più vecchi potranno utilizzare le normali operazioni del processore, eventualmente con prestazioni inferiori.
Che cosa succederà sui vecchi Pentium MMX e Pentium II
La conseguenza principale riguarda processori a 32 bit che supportano MMX ma non le estensioni più recenti. Il Pentium MMX, per esempio, non dispone di SSE; lo stesso vale per il Pentium II. Anche alcune CPU AMD della famiglia K6 rientrano nella categoria.
Quando queste vecchie macchine eseguiranno un kernel contenente le modifiche, le operazioni RAID interessate utilizzeranno le implementazioni scalari in C già presenti nel codice Linux. Sono percorsi alternativi consolidati, che non richiedono istruzioni vettoriali specifiche.
È plausibile che determinate elaborazioni di parità risultino meno veloci su tali processori anche se rimuovere le ottimizzazioni MMX non equivale a vietare l’esecuzione delle istruzioni MMX. Il processore continuerà a riconoscerle e gli applicativi che le utilizzano potranno eseguirle, purché il sistema operativo e l’ambiente software mantengano gli altri requisiti di compatibilità.
Linux 7.5 potrebbe chiudere definitivamente il capitolo MMX
L’intervento incentrato sulla rimozione delle ottimizzazioni MMX offre anche uno spunto più generale sulla manutenzione di Linux.
Conservare codice specializzato per hardware storico è un po’ una garanzia di compatibilità, ma non tutte le ottimizzazioni meritano di sopravvivere a tempo indeterminato. Quando esiste un’alternativa funzionante, la rimozione di una variante poco utilizzata può ridurre la superficie da verificare e il rischio di regressioni.
Per chi utilizza processori Intel e AMD moderni non cambierà praticamente nulla. Per gli appassionati di retrocomputing, invece, la modifica rappresenta un promemoria importante: compatibilità e ottimizzazione sono due cose diverse. Linux può continuare a eseguire codice su un processore storico senza mantenere ogni singola accelerazione scritta appositamente per quella generazione di CPU.
La scomparsa delle ultime routine MMX dal kernel non decreta quindi la fine del supporto ai vecchi Pentium. Segna piuttosto la conclusione di una stagione dell’ottimizzazione x86, quando poche istruzioni SIMD e qualche centinaio di righe assembly potevano fare una differenza concreta nelle prestazioni di un computer.