Pipeline
La pipeline è una tecnica di implementazione nella quale multiple strutture sono sovrapposte durante l'esecuzione. Tutti gli step della pipeline sono detti stages. Approcciare questa tecnica fa risparmiare più tempo nell'esecuzione di più istruzioni nel linguaggio MIPS (per esempio). Questo è dovuto grazie al lavoro in parallelo. Generalmente, il pipelining funziona se i lavori da eseguire sono molto simili tra di loro ed impiegano in media lo stesso tempo. L'accelerazione dell'esecuzione è data dal numero di stages nella pipeline.
In MIPS abbiamo solitamente 5 stages:
- Prendere istruzioni dalla memoria (IF);
- Leggere i registri e decodificare l'istruzione (ID);
- Eseguire l'operazione (EX);
- Accedere ad un operando nella memoria dati (MEM);
- Scrivere il risultato nel registro destinazione (WB).
Quindi il pipelining incrementa le prestazioni, aumentando il numero d'istruzioni in un singolo clock cycle e decrementando il tempo di esecuzione di una singola istruzione.
Pipeline hazard
Ci sono situazioni in cui avvengono errori nella pipeline, a causa dei quali non possiamo eseguire l'istruzione successiva nel successivo colpo di clock. Questi errori vengono chiamati hazards. Esistono 3 tipi di hazards:
- Structural hazards;
- Data hazards;
- Control | Branch hazards.
Structural hazard
Il structural hazard avviene quando cerchiamo di eseguire più istruzioni nello stesso ciclo di clock, e per questo motivo il nostro programma per la pipeline verrebbe sventato. Fortunatamente questo hazard non capiterà mai poiché proprio la stessa architettura MIPS è progettata per eseguire pipelining.
Data hazard
Il data hazard avviene quando uno step deve aspettare il compimento di un altro step. Si supponga di avere due add (operazioni MIPS) da eseguire.
add $s0, $t0, $t1
add $s1, $s0, $t2
Nel primo add, $s0 è il registro di destinazione (rd) a cui viene dato accesso solo all'ultimo stadio della pipeline (stadio WB). Nella seconda, invece, $s0 è utilizzato come registro sorgente (rs) e gli viene dato accesso nel secondo stadio. Il problema è che durante il secondo stadio, la prima add ancora non ha scritto il risultato nel registro destinazione e quindi quando lo andiamo a richiamare nel secondo add si viene a creare una situazione di stallo / blocco.
Soluzione 1
Possiamo immaginare l'output dell'ALU come input per la seconda istruzione. Per fare ciò dobbiamo modificare la circuiteria dell'hardware. Tale metodo viene detto forwarding. Il forwarding funziona solo se la prima istruzione non è una load.
Soluzione 2
Abbiamo due istruzioni.
-
Cpu pipeline
-
architettura degli elaboratori
-
Esercitazioni Architettura degli Elaboratori
-
Architettura degli elaboratori