Fu nel gennaio di ormai tre anni fa (2018) che la scoperta di due gravi bug (Spectre e Meltdown) che affliggevano i processori Intel e, in minor misura, anche AMD e ARM (tipicamente utilizzati all’interno di smartphone e tablet oltre che su piattaforme come Arduino e RasberryPi), portò all’attenzione di un vastissimo pubblico, ben al di fuori della ristretta cerchia degli informatici specializzati, una caratteristica funzione delle CPU moderne chiamata: esecuzione speculativa. Proprio questa, infatti, era affetta dalle due critiche vulnerabilità sopra citate.
Ma che cos’è, propriamente parlando, l’esecuzione speculativa?
Introduzione
I processori (CPU), cuore pulsante dei computer, che hanno il compito di elaborare (processare, da cui il termine di processore) le informazioni ricevute dalle periferiche (scanner, stampanti, microfoni, webcam, ecc…) collegate o le istruzioni inviate dai programmi software in esecuzione (e che provengono anche dallo stesso sistema operativo che gira (viene eseguito) al contempo sulla macchina), non disponendo di risorse di calcolo infinite (anche il processore più performante oggi in commercio deve fare i conti con questa limitazione) e, oltretutto, dovendo assicurare la pronta e corretta esecuzione delle istruzioni inviategli dal sistema operativo, in aggiunta a quelle che gli provengono da periferiche esterne, come detto, o da applicazioni avviate dall’utente, evitando il più possibile situazioni che possono:
- provocare rallentamenti tra l’attesa per elaborare un’istruzione e l’altra
- aumenatare così i tempi di risposta del processore
Per evitare il più possibile tutto ciò, e sveltire l’elaborazione, i processori sono stati progettati in modo da renderne il funzionamento assai più efficiente quando si tratta di elaborare informazioni.
La rapidità o, se vogliamo, la reattività di un processore, eliminati i possibili colli di bottiglia dovuti a memorie RAM poco performanti, dipende da quanto prontamente esso effettua l’elaborazione delle istruzioni che gli vengono inviate.
Ogni istruzione inviata al processore, deve in verità passare per molteplici stadi per essere seguita:
- Caricare l’istruzione dalla memoria
- Decodificare l’istruzione
- Eseguire l’istruzione
- Scrivere il risultato nella memoria
Se abbiamo quindi quattro istruzioni da eseguire, la nostra CPU dovrà svolgere queste quattro fasi per ciascuna delle istruzioni.
Gli ingegneri che si posero il problema di come velocizzarne il funzionamento, si dissero: “e se progettassimo le CPU in modo che esse inizino a eseguire le istruzioni ancora prima aver finito quella prima?“
In tal modo, mentre il processore esegue una istruzione, può iniziare a decodificare quella dopo e caricare dalla memoria quella dopo ancora con una tecnica chiamata pipelining. Le prestazioni, in termini di velocità di esecuzione, aumentano notevolmente.
Non sempre però era possibile sapere con certezza quale sarebbe stata la prossima istruzione. A volte l’istruzione da eseguire dopo dipendenza dal risultato di quella eseguita prima. In questi casi il processore deve provare a “indovinare” quale è l’istruzione che più probabilmente servirà eseguire dopo. Se si sbaglia, butterà via quello che ha fatto fino a quel momento e inizierà di nuovo con l’istruzione corretta.
È un po’ come un barista che, per servire più velocemente i suoi clienti, appena aperta bottega, non aspetti, per preparare le ordinazioni, che i clienti entrino nel locale e gli dicano cosa desiderano, ma, anticipandoli, cominci a preparare, già in anticipo, diversi tipi di caffè; ad esempio un espresso, un cappuccino e un caffè lungo all’americana.
Quando un cliente entra e ordina, diciamo, un cappuccino, lui offre al cliente il cappuccino già pronto con notevole risparmio di tempo rispetto a quello che gli sarebbe stato necessario per prepararlo da zero.
Questa metafora esemplifica molto da vicino la funzione e l’utilità dell’esecuzione speculativa. Speculativa perché viene calcolata la probabilità (azione speculativa) che certe attività saranno, in un futuro vicino, più richieste rispetto ad altre e che quindi il processore può permettersi di avviarne l’esecuzione in modo prioritario su altre la cui richiesta sarà meno probabile.
Per tornare al nostro barista; se tra la sua clientela egli ha, fatti 100 i frequentatori abituali, 80 che bevono cappuccino tutte le mattine, 15 espresso e solo 5 caffè lungo, in base a queste probabilità, si predisporrà a preparare in anticipo i tre caffè dando priorità al cappuccino, essendo l’espresso e il caffè lungo meno richiesti, statisticamente. Qualcosa di analogo, fatte salve le dovute differenze e tutta una serie di distinzioni che rendono la tecnica dell’esecuzione speculativa ben più complessa del lavoro di un barista, fa il processore costruito incorporando questa funzione che tanto si è rivelata preziosa per far schizzare verso l’alto le prestazioni e la velocità in risposta alla richiesta di elaborazione dati.
Per attuare l’esecuzione speculativa, la CPU deve servirsi di diverse tecniche come la cosiddetta elaborazione simultanea e l’esecuzione fuori ordine (out of order anche abbreviata in OoOE = Out of Order Execution), più l’impiego della previsione dei rami. Tutte cose che potrebbero sembrare avere un nome inusuale e arzigogolato ma che in realtà sono parole del gergo tecnico che descrivono in maniera estremamente precisa e appropriata dei concetti veramente interessanti e, per così dire, affascinanti.
L’introduzione dell’esecuzione speculativa, nella progettazione e realizzazione industriale dei processori, venne attuato dalla casa produttrice Intel (di cui avrete sicuramente un computer in casa che monta le loro CPU) insieme all’esecuzione fuori ordine, con i modelli Pentium Pro e Pentium II. Il principale concorrente, la AMD (Advanced Micro Devices) incorporò questa tecnologia nel suo modello di processore K5, mentre il terzo gigante mondiale, fra i produttori di CPU, ARM (Advanced Risc Machines) cominciò a dotarne i suoi processori dal modello Cortex A9.
Da circa vent’anni, l’esecuzione speculativa è il cardine su cui si basa la progettazione di CPU performanti e reattive. Come accennato però all’inizio, le due vulnerabilità critiche scoperte nel 2018, Spectre e Meltdown hanno imposto un ripensamento globale nell’architettura dei processori che costituirà la nuova sfida dell’industria specializzata dal settore. Attualmente, infatti, le correzioni apportate dai principali sistemi operativi (Windows, MacOS, Linux, ecc..) per cercare di mitigare quantomeno i rischi derivanti da Spectre e Meltdown che sfruttano una vulnerabilità insita nel meccanismo dell’esecuzione speculativa per sottrarre dati caricati in memoria, hanno l’effetto di renderla assai meno efficiente, annullando in considerevole parte i vantaggi per i quali essa è stata ed è così utilizzata in lungo e in largo nell’industria informatica.
COMMENTI