Architetture dei processori/Processore superscalare

Per processore superscalare si intende generalmente un processore in grado di eseguire più di un'istruzione per ciclo di clock. Per raggiungere questo obiettivo nel processore sono presenti diverse unità funzionali dello stesso tipo, con dispositivi addizionali per distribuire le istruzioni alle varie unità. Per esempio, sono generalmente presenti numerose unità per il calcolo intero (ALU). Le unità di controllo stabiliscono quali istruzioni possono essere eseguite in parallelo e le inviano alle rispettive unità. Questo compito non è semplice, dato che un'istruzione può richiedere il risultato della precedente come proprio operando, oppure può dover impiegare il dato conservato in un registro usato anche dall'altra istruzione; il risultato può quindi cambiare secondo l'ordine d'esecuzione delle istruzioni. La maggior parte delle CPU moderne dedica un elevato numero di transistor allo svolgimento di questo compito, per permettere al processore di funzionare a pieno regime in modo costante; compito che si è reso sempre più importante con l'aumento del numero delle unità. Mentre le prime CPU superscalari possedevano due ALU ed una FPU, un processore attuale come ad esempio il PowerPC 970 possiede quattro ALU, due FPU e due unità SIMD. Se l'unità di decodifica delle istruzioni non mantiene occupate tutte le unità funzionali del processore, le prestazioni ne soffrono grandemente.

Il Pentium, il primo processore superscalare per architettura x86 prodotto da Intel

Le architetture superscalari ebbero origine nell'ambiente RISC, dato che questo tipo di design richiede unità funzionali semplici, che possono essere incluse in più esemplari in un'unica CPU. Questa è la ragione per cui questi processori erano più veloci dei CISC tra gli anni '80 e gli anni '90. Tuttavia, col progresso della tecnologia, anche design ingombranti come l'IA-32 poterono essere progettati in modo superscalare.

Attualmente è impensabile un futuro miglioramento sensibile del sistema di controllo, ponendo di fatto un limite ai miglioramenti prestazionali dei processori superscalari. Il progetto VLIW (Very Long Instruction Word) cerca una soluzione scaricando parte del processo di controllo delle istruzioni in fase di scrittura del programma e di compilazione, evitando al processore di doverlo ripetere ad ogni esecuzione del programma.

Schema generico di una CPU dual core

Un'altra evoluzione dei processori superscalari è l'integrazione di più processori indipendenti (core) in un singolo processore. Questi processori non sono solo dotati di più pipeline ma le varie pipeline sono totalmente separate e quindi sono in grado di eseguire programmi diversi, cosa non possibile nelle cpu classiche. I processori Core Duo dell'Intel per esempio sono di questo tipo. Un approccio intermedio prevede una separazione logica e non fisica delle pipeline con le pipeline separate ma i circuiti di controllo e gestione ancora in comune. Questo permette di eseguire più tread in parallelo senza dover duplicare tutte le unità funzionali di un processore e quindi risparmiando molti transistor rispetto a una soluzione pura. Esempi di questa soluzione sono la tecnologia Hyper-Threading. Il già citato Core Duo è dotato di due core con supporto dell'Hyper-Threading e quindi è in grado di eseguire fino a quattro thread simultaneamente.

La realizzazione di processori con più core è una soluzione migliore rispetto alla semplice aggiunta di nuove unità pipeline dato che ogni nuova pipeline aumenta la possibilità di eseguire istruzioni che siano in conflitto con altre e quindi spingersi oltre quattro pipeline risulta spesso sconveniente. Eseguendo più thread in parallelo si eliminano i problemi, dato che i thread sono separati e quindi le varie pipeline non possono entrare in conflitto tra di loro. Questi processori però costringono i programmatori a realizzare programmi paralleli per sfruttare al meglio i processori moderni e la realizzazione di programmi paralleli non è semplice e per alcuni algoritmi non esistono nemmeno metodi per renderli paralleli in modo efficiente.