Qualsiasi istruzione del processore ha più fasi per il suo funzionamento. Ognuna di queste fasi richiede un singolo ciclo della CPU per essere completata. Queste fasi sono il recupero dell'istruzione, la decodifica dell'istruzione, l'esecuzione, l'accesso alla memoria e il writeback. Rispettivamente questi ottengono l'istruzione che deve essere completata, separano l'operazione dai valori in esecuzione on, eseguire il processo, aprire il registro su cui verrà scritto il risultato e scrivere il risultato nell'open Registrati.
Processori In Order storici
Nei primi computer, la CPU non utilizzava una pipeline di istruzioni. In queste CPU, ogni operazione a ciclo singolo doveva avvenire per ogni istruzione. Ciò significava che ci sono voluti cinque cicli di clock per l'elaborazione completa dell'istruzione media prima che potesse essere avviata quella successiva. Alcune operazioni potrebbero non richiedere la scrittura di alcun risultato in un registro, il che significa che le fasi di accesso alla memoria e di writeback possono essere saltate.
C'è un problema in agguato, tuttavia, quando si esegue un'istruzione completa in ordine prima di poter passare all'istruzione successiva. Il problema è la mancanza di cache. La CPU memorizza i dati che sta elaborando attivamente nel registro. È possibile accedervi con una latenza di un ciclo. Il problema è che il registro è minuscolo perché è integrato nel core del processore. La CPU deve passare alla cache L1 più grande ma più lenta se i dati non sono già stati caricati. Se non è presente, deve tornare alla cache L2 più grande e più lenta. Il passaggio successivo è la cache L3; l'ultima opzione è la RAM di sistema. Ognuna di queste opzioni richiede sempre più cicli della CPU per essere verificata.
Ora, questa latenza aggiuntiva aggiuntiva può essere un grosso problema in un sistema che deve completare ogni istruzione in ordine completo prima di iniziare l'istruzione successiva. Quello che era stato un processore di istruzioni a 5 cicli, può improvvisamente rimanere bloccato su un'istruzione per dozzine o centinaia di cicli di clock. Per tutto il tempo, non può succedere nient'altro sul computer. Tecnicamente, questo può essere in qualche modo alleviato avendo due nuclei indipendenti. Nulla, tuttavia, impedisce a entrambi di fare la stessa cosa, potenzialmente simultaneamente. Quindi seguire il percorso multi-core non risolve questo problema.
La classica pipeline RISC
RISC sta per Computer con set di istruzioni ridotto. È uno stile di progettazione del processore che ottimizza le prestazioni semplificando la decodifica di ogni istruzione. Questo è in confronto a CISC o Complex Instruction Set Computer, che progetta set di istruzioni più complessi consentendo di richiedere meno istruzioni per eseguire le stesse attività.
Il classico design RISC include una pipeline di istruzioni. Invece di eseguire una qualsiasi delle cinque fasi di istruzione in un dato ciclo, la pipeline consente di eseguire tutte e cinque le fasi. Ovviamente, non puoi eseguire tutte e cinque le fasi di un'istruzione in un ciclo. Ma puoi mettere in coda cinque istruzioni consecutive con un offset di uno stadio ciascuna. In questo modo, è possibile completare una nuova istruzione ad ogni ciclo di clock. Offrendo un potenziale aumento delle prestazioni di 5 volte per un aumento relativamente basso della complessità del core.
I processori che non dispongono di una pipeline possono essere sempre e solo subscalari, poiché non possono eseguire un'istruzione completa per ciclo. Con questa pipeline primaria a cinque stadi, puoi creare una CPU scalare in grado di completare un'istruzione per ogni processo. Creando pipeline ancora più estese, puoi creare CPU superscalari in grado di eseguire più di un'istruzione per ciclo di clock. Naturalmente, ci sono ancora potenziali problemi.
Ancora sequenziale
Niente di tutto ciò risolve il problema dell'attesa di molti cicli per una risposta quando è necessario interrogare i diversi livelli di cache e RAM. Introduce anche un nuovo problema. Cosa succede se un'istruzione si basa sull'uscita dell'istruzione precedente? Questi problemi vengono risolti in modo indipendente con un dispatcher avanzato. Pianifica attentamente l'ordine di esecuzione in modo che nessuna istruzione che si basa sull'output di un altro sia troppo ravvicinata. Gestisce anche le mancate cache parcheggiando un'istruzione e sostituendola in cantiere con altre istruzioni che sono pronte per l'esecuzione e non richiedono il suo risultato, riprendendo l'istruzione quando è pronto.
Queste soluzioni possono funzionare su processori non pipeline, ma sono necessarie per un processore superscalare che esegue più di un'istruzione per clock. Un predittore di ramo è anche molto utile in quanto può provare a prevedere il risultato di un'istruzione con più di un potenziale risultato e continuare a presumere che sia corretto se non diversamente dimostrato.
Conclusione
Una pipeline consente di utilizzare tutte le capacità distinte del processore in ogni ciclo. Lo fa eseguendo diverse fasi di diverse istruzioni contemporaneamente. Questo non aggiunge nemmeno molta complessità al design della CPU. Inoltre, apre la strada per consentire a più di un'istruzione di eseguire una singola fase per ciclo.