Pipeline dati
Il pipelineing delle istruzioni è una tecnica utilizzata nella progettazione dei moderni microprocessori, microcontrollori e CPU per aumentare il loro throughput di istruzioni (il numero di istruzioni che possono essere eseguite in un'unità di tempo).
L'idea principale è quella di dividere (detto "split") l'elaborazione di un'istruzione della CPU, come definita dal microcodice dell'istruzione, in una serie di passi indipendenti di microoperazioni (dette anche "microistruzioni", "micro-op" o "µop"), con memorizzazione alla fine di ogni passo. Ciò consente alla logica di controllo della CPU di gestire le istruzioni alla velocità di elaborazione del passo più lento, che è molto più veloce del tempo necessario per elaborare l'istruzione come un singolo passo.
Il termine conduttura si riferisce al fatto che ogni passo porta una singola microstruttura (come una goccia d'acqua), e ogni passo è collegato ad un altro passo (analogia; simile alle condutture dell'acqua).
La maggior parte delle moderne CPU sono guidate da un orologio. La CPU è composta internamente da logica e memoria (flip flop). Quando arriva il segnale dell'orologio, i flip flop memorizzano il loro nuovo valore, quindi la logica richiede un periodo di tempo per decodificare i nuovi valori dei flip flop. Poi arriva il successivo impulso di clock e i flip flop memorizzano un altro valore, e così via. Spezzando la logica in pezzi più piccoli e inserendo i flip flop tra i pezzi di logica, il tempo richiesto dalla logica (per decodificare i valori fino a generare uscite valide a seconda di questi valori) si riduce. In questo modo il periodo di tempo dell'orologio può essere ridotto. Ad
esempio, la conduttura RISC è suddivisa in cinque stadi con un set di flip flop tra ogni stadio come segue:
- Istruzioni per l'uso
- Istruzione decodificare e registrare il recupero
- Eseguire
- Accesso alla memoria
- Registrati e scrivi
I processori con pipeline sono costituiti internamente da stadi (moduli) che possono lavorare in modo semi-indipendente su microstrutture separate. Ogni stadio è collegato per mezzo di flip flop allo stadio successivo (come una "catena") in modo che l'uscita dello stadio sia un ingresso ad un altro stadio fino a quando il lavoro di elaborazione delle istruzioni non è fatto. Tale organizzazione dei moduli interni del processore riduce il tempo complessivo di elaborazione delle istruzioni.
Un'architettura non pipeline non è così efficiente perché alcuni moduli CPU sono inattivi mentre un altro modulo è attivo durante il ciclo di istruzioni. Il pipelineining non elimina completamente il tempo di inattività in una CPU pipeline, ma facendo funzionare i moduli CPU in parallelo si aumenta il throughput delle istruzioni.
Si dice che una pipeline di istruzioni sia completamente pipeline se è in grado di accettare una nuova istruzione ad ogni ciclo di clock. Un pipeline che non è completamente pipelineato ha cicli di attesa che ritardano l'avanzamento del pipeline.
Pipeline di base a cinque stadi in una macchina RISC (IF = Instruction Fetch Fetch, ID = Instruction Decode, EX = Execute, MEM = Accesso alla memoria, WB = Register write back). L'asse verticale è istruzioni successive, l'asse orizzontale è il tempo. Quindi nella colonna verde, la prima istruzione è in fase WB, e l'ultima istruzione è in fase di recupero istruzioni.
Vantaggi e svantaggi del Pipelining
Vantaggi del Pipelining:
- Il tempo di ciclo del processore si riduce, aumentando la velocità di trasmissione delle istruzioni. Il pipeline non riduce il tempo necessario per completare un'istruzione, ma aumenta il numero di istruzioni che possono essere elaborate simultaneamente ("in una sola volta") e riduce il ritardo tra le istruzioni completate (chiamato "throughput").
Più fasi di pipeline ha un processore, più istruzioni può elaborare "in una volta" e meno ritardo c'è tra le istruzioni completate. Ogni microprocessore
general purpose predominante prodotto oggi utilizza almeno 2 fasi di pipeline fino a 30 o 40 fasi. - Se si utilizza il pipelining, l'unità logica aritmetica della CPU può essere progettata più velocemente, ma sarà più complessa.
- Il pipelineining in teoria aumenta le prestazioni su un nucleo non pipeline di un fattore del numero di stadi (supponendo che anche la frequenza di clock aumenti dello stesso fattore) e il codice è ideale per l'esecuzione di pipeline.
- Le CPU pipeline lavorano generalmente ad una frequenza di clock più alta rispetto alla frequenza di clock della RAM, (a partire dalle tecnologie del 2008, le RAM lavorano a basse frequenze rispetto alle frequenze delle CPU) aumentando le prestazioni complessive dei computer.
Svantaggi del Pipelining:
Il pipelining ha molti svantaggi, anche se ci sono molte tecniche usate dai progettisti di CPU e compilatori per superare la maggior parte di esse; la seguente è una lista di svantaggi comuni:
- Il design di un processore non pipeline è più semplice ed economico da produrre, il processore non pipeline esegue solo una singola istruzione alla volta. Questo previene ritardi di diramazione (nel Pipelining, ogni diramazione è ritardata) così come problemi quando le istruzioni seriali vengono eseguite contemporaneamente.
- Nel processore pipelineato, l'inserimento di flip flop tra i moduli aumenta la latenza delle istruzioni rispetto ad un processore non pipeline.
- Un processore non pipeline avrà un throughput di istruzioni definito. Le prestazioni di un processore pipeline sono molto più difficili da prevedere e possono variare notevolmente per i diversi programmi.
- Molti progetti includono condutture lunghe fino a 7, 10, 20, 31 e anche più fasi; uno svantaggio di una lunga conduttura è che quando un programma si dirama, l'intera conduttura deve essere risciacquata (sgombra). La maggiore velocità di attraversamento delle pipeline non è sufficiente quando il codice eseguito contiene molte diramazioni: il processore non può sapere in anticipo dove leggere l'istruzione successiva, e deve attendere che l'istruzione diramazione finisca, lasciando la pipeline vuota. Questo svantaggio può essere ridotto prevedendo se l'istruzione di diramazione condizionale si diramerà in base all'attività precedente. Dopo che il ramo è stato risolto, l'istruzione successiva deve percorrere tutta la pipeline prima che il suo risultato sia disponibile e il processore riprenda a "lavorare" di nuovo. In questi casi estremi, le prestazioni di un processore pipeline potrebbero essere peggiori di quelle di un processore non pipeline.
- Purtroppo non tutte le istruzioni sono indipendenti. In una semplice pipeline, il completamento di un'istruzione può richiedere 5 fasi. Per operare a pieno regime, questo gasdotto dovrà eseguire 4 successive istruzioni indipendenti mentre la prima sta completando. Ognuna di queste 4 istruzioni potrebbe dipendere dall'uscita della prima istruzione, causando l'attesa della logica di controllo del gasdotto e l'inserimento di uno stallo o di un ciclo di clock sprecato nel gasdotto fino a quando la dipendenza non viene risolta. Fortunatamente, tecniche come l'inoltro possono ridurre significativamente i casi in cui è richiesto lo stallo.
- I programmi auto-modificanti possono non essere eseguiti correttamente su un'architettura pipeline quando le istruzioni che vengono modificate sono vicine alle istruzioni in corso di esecuzione. Questo può essere causato dal fatto che le istruzioni potrebbero essere già nella Prefetch Input Queue, quindi la modifica potrebbe non avere effetto per la prossima esecuzione delle istruzioni. Le cache delle istruzioni rendono il problema ancora peggiore.
- Pericoli: Quando un programmatore (o un compilatore) scrive codice assembly, generalmente presuppone che ogni istruzione venga eseguita prima dell'esecuzione dell'istruzione successiva. Quando questa supposizione non viene convalidata mediante pipeline, fa sì che un programma si comporti in modo non corretto, la situazione è nota come un pericolo. Esistono
varie tecniche per risolvere i pericoli o per lavorare in prossimità, come l'inoltro e il ritardo (inserendo uno stallo o un ciclo di clock sprecato).
Esempi
Condotta generica
A destra c'è un gasdotto generico con quattro fasi:
- Vai a prendere
- Decodificare
- Eseguire
- Riscrittura
La casella grigia in alto è l'elenco delle istruzioni in attesa di essere eseguite; la casella grigia in basso è l'elenco delle istruzioni che sono state completate; e la casella bianca centrale è la conduttura.
L'esecuzione è la seguente:
Tempo | Esecuzione |
0 | Quattro istruzioni sono in attesa di essere eseguite |
1 |
|
2 |
|
3 |
|
4 |
|
5 |
|
6 |
|
7 |
|
8 |
|
9 | Tutte le istruzioni vengono eseguite |
Bolla
Quando si verifica un "singhiozzo" (interruzione) nell'esecuzione, si crea una "bolla" in cantiere in cui non succede nulla di utile. Nel ciclo 2, il recupero dell'istruzione viola viene ritardato e la fase di decodifica nel ciclo 3 contiene ora una bolla. Anche tutto ciò che si trova dietro l'istruzione viola è ritardato, ma tutto ciò che si trova davanti all'istruzione viola continua con l'esecuzione.
Chiaramente, se confrontata con l'esecuzione di cui sopra, la bolla produce un tempo di esecuzione totale di 8 ticchettii di orologio invece di 7.
Le bolle sono come le bancarelle (ritardi), in cui non accadrà nulla di utile per il recupero, la decodifica, l'esecuzione e il rientro. È come un codice NOP (abbreviazione di No OPeration).
Esempio 1
Una tipica istruzione per aggiungere due numeri potrebbe essere ADD A, B, C,
che aggiunge i valori trovati nelle posizioni di memoria A e B, e poi mette il risultato nella posizione di memoria C. In un processore pipeline il controllore pipeline lo spezzerebbe in una serie di compiti simili:
Le posizioni 'R1' e 'R2' sono registri nella CPU. I valori memorizzati nelle locazioni di memoria etichettate 'A' e 'B' vengono caricati (copiati) in questi registri, poi aggiunti, e il risultato viene memorizzato in una locazione di memoria etichettata 'C'.
In questo esempio il gasdotto è a tre stadi di carico, esecuzione e stoccaggio. Ognuna delle fasi è chiamata fase del gasdotto.
Su un processore non pipeline, solo uno stadio può lavorare alla volta, quindi l'intera istruzione deve essere completata prima che possa iniziare l'istruzione successiva. Su un processore pipeline, tutte le fasi possono lavorare contemporaneamente su istruzioni diverse. Quindi, quando questa istruzione è in fase di esecuzione, una seconda istruzione sarà in fase di decodifica e una terza istruzione sarà in fase di recupero.
Esempio 2
Per comprendere meglio il concetto, possiamo guardare a una conduttura teorica a 3 stadi:
Fase | Descrizione |
Carica | Leggere le istruzioni dalla memoria |
Eseguire | Eseguire le istruzioni |
Negozio | Memorizzare il risultato in memoria e/o registri |
e una lista di assemblaggio pseudo-codice da eseguire:
Questo è il modo in cui verrebbe eseguito:
Orologio 1 | ||
Carica | Eseguire | Negozio |
CARICA |
|
|
L'istruzione LOAD viene recuperata dalla memoria.
Orologio 2 | ||
Carica | Eseguire | Negozio |
MUOVITI | CARICA |
|
L'istruzione LOAD viene eseguita, mentre l'istruzione MOVE viene recuperata dalla memoria.
Orologio 3 | ||
Carica | Eseguire | Negozio |
AGGIUNGERE | MUOVITI | CARICA |
L'istruzione LOAD si trova nella fase Store, dove il suo risultato (il numero 40) sarà memorizzato nel registro A. Nel frattempo, l'istruzione MOVE viene eseguita. Poiché deve spostare il contenuto di A in B, deve attendere la fine dell'istruzione LOAD.
Orologio 4 | ||
Carica | Eseguire | Negozio |
NEGOZIO | AGGIUNGERE | MUOVITI |
L'istruzione STORE è caricata, mentre l'istruzione MOVE sta terminando e l'ADD sta calcolando.
E così via. Si noti che, a volte, un'istruzione dipenderà dal risultato di un'altra (come il nostro esempio MOVE). Quando più di un'istruzione fa riferimento ad una particolare posizione per un operando, sia leggendola (come input) che scrivendo (come output), l'esecuzione di tali istruzioni in un ordine diverso dall'ordine originale del programma può portare alla situazione di pericolo (di cui sopra).
Condotta generica a 4 fasi; le scatole colorate rappresentano istruzioni indipendenti l'una dall'altra
Una bolla nel ciclo 3 ritarda l'esecuzione
Pagine correlate
- Conduttura (informatica)
- Calcolo parallelo
- Parallelismo a livello di istruzione
Domande e risposte
D: Che cos'è il pipelining delle istruzioni?
R: Il pipelining delle istruzioni è una tecnica utilizzata nella progettazione dei microprocessori, dei microcontrollori e delle CPU moderne per aumentare il rendimento delle istruzioni, dividendo l'elaborazione di un'istruzione della CPU in una serie di fasi indipendenti con archiviazione alla fine di ogni fase.
D: Come funziona il pipelining?
R: Il pipelining funziona suddividendo la logica in pezzi più piccoli e inserendo dei flip flop tra i pezzi di logica, il che riduce il tempo necessario alla logica per decodificare i valori fino a generare uscite valide in base a questi valori. Ciò consente di ottenere periodi di clock più rapidi.
D: Quali sono alcuni esempi di pipeline?
R: Un esempio di pipeline è la pipeline RISC, che è suddivisa in cinque fasi con una serie di flip flop tra ogni fase.
D: In che modo il pipelining aumenta il throughput delle istruzioni?
R: Il pipelining aumenta il throughput delle istruzioni consentendo ai moduli della CPU di lavorare in parallelo, il che riduce i tempi morti durante un ciclo di istruzioni e aumenta il tempo di elaborazione complessivo.
D: Tutte le pipeline sono completamente pipeline?
R: No, non tutte le pipeline sono completamente in pipeline; alcune pipeline hanno cicli di attesa che ritardano l'avanzamento nella pipeline.