Cos’è Superscalare?

Un processore superscalare può eseguire indipendentemente più istruzioni contemporaneamente durante un singolo ciclo di clock. Include risorse di esecuzione ridondanti, come più unità a virgola mobile, unità logiche aritmetiche e traslatori interi. Questo tipo di processore è progettato per il calcolo parallelo e l’esecuzione speculativa senza la necessità di software speciale. Può migliorare la velocità di esecuzione di molte applicazioni a uso intensivo del processore manipolando e riorganizzando il codice. Viene spesso utilizzato in diverse classi di computer, inclusi server, desktop e persino laptop.

Sebbene alcuni aspetti dell’architettura siano stati utilizzati nei processori sin dagli anni ‘1960, i veri processori superscalari non sono stati rilasciati fino a molto tempo dopo. Alcuni processori RISC (Reduced Instruction Set Computing) venduti alla fine degli anni ‘1980 e all’inizio degli anni ‘1990 erano superscalari. I loro core semplici e le istruzioni a lunghezza fissa hanno reso l’invio e la pianificazione di istruzioni parallele relativamente facili. Molti processori non RISC prodotti dalla fine degli anni ‘1990 hanno anche architetture superscalari. I processori incorporati, a bassa potenza e di altra natura sono spesso eccezioni, poiché ottimizzano altri aspetti dei loro progetti invece dell’esecuzione parallela.

Alcuni processori possono condividere una singola pipeline con istruzioni provenienti da più thread di esecuzione, noti come super-threading. Quando un’unità funzionale è inattiva perché è in attesa sul thread attualmente in esecuzione, può nel frattempo eseguire un’istruzione da un altro thread. Questa tecnica aiuta a utilizzare completamente il processore ma non è efficiente quanto il multithreading simultaneo (SMT). Un singolo processore superscalare può eseguire più istruzioni da più thread contemporaneamente utilizzando SMT. L’esecuzione simultanea dei thread può tuttavia competere per le risorse del sistema e del processore, il che può rallentare il sistema.

I processori con pipeline multistadio possono eseguire più istruzioni contemporaneamente purché si trovino in fasi di esecuzione diverse. Al contrario, più istruzioni possono essere eseguite nello stesso stadio contemporaneamente in un processore superscalare. Sebbene ci siano molte somiglianze tra questo tipo di processore e un processore multi-core, non sono la stessa cosa. Un processore multi-core contiene diversi processori completi, chiamati core, in un unico dispositivo. Ogni core di un processore multi-core è solitamente superscalare e può includere diverse pipeline parallele.

Una caratteristica fondamentale di un processore superscalare è la sua capacità di eseguire il codice del programma fuori dall’ordine per motivi di efficienza. Per fare ciò, deve essere consapevole delle dipendenze di qualsiasi istruzione da un’altra. Se un’istruzione influenza i risultati o utilizza le risorse di un’altra, è molto probabile che le due non debbano essere eseguite in parallelo. Esistono tecniche per eliminare alcuni tipi di dipendenze, ma altre devono ritardare l’elaborazione fino a quando le risorse non sono disponibili.

L’esecuzione fuori ordine deve anche essere in grado di garantire il contenuto corretto di registri, flag e altre risorse se si verifica un’interruzione del sistema. In questo caso, lo stato del sistema deve apparire lo stesso, come se il codice fosse stato eseguito in sequenza come progettato. Un’altra considerazione riguarda il numero di istruzioni che il processore dovrebbe esaminare per trovare opportunità per l’esecuzione parallela. Maggiore è il numero, più efficiente può essere l’esecuzione. Ciò include anche l’esecuzione speculativa di istruzioni sull’altro lato di ciascun ramo nel codice esaminato.