Salta al contenuto
Note per Studenti Hazard nella pipeline

Hazard nella pipeline

In questa pagina 4
In questa pagina 3

Un hazard (conflitto, rischio) è una situazione in cui l'istruzione successiva non può entrare nel suo stadio al ciclo previsto. La pipeline si ferma: si inseriscono cicli di stallo (bolle) e le prestazioni calano (vedi PipelineIdea della catena di montaggio; pipeline a 5 stadi IF, ID, EX, MEM, WB; tempo di ciclo, tempo per n istruzioni in una pipeline a k stadi e speedup con esempi svolti; registri di pipeline; scrittura e lettura dei registri nello stesso ciclo; limiti (stadi sbilanciati, hazard).Pipeline →).

Hazard strutturali

Due istruzioni vogliono la stessa risorsa nello stesso ciclo. Esempio: una sola memoria per istruzioni e dati, con IF di un'istruzione e MEM di una load contemporanei. Soluzioni: replicare la risorsa (cache istruzioni e dati separate) o organizzarne l'uso (banco registri scritto nella prima metà del ciclo e letto nella seconda).

Hazard sui dati

Un'istruzione JJ usa un registro coinvolto in un'istruzione II precedente.

Dipendenza Significato Esempio
RAW (read after write) JJ legge un registro che II scrive: deve leggere il valore nuovo add $1,$2,$3 poi sub $4,$1,$5
WAR (write after read) JJ scrive un registro che II legge: II deve leggere il valore vecchio sub $4,$1,$5 poi add $1,$2,$3
WAW (write after write) JJ e II scrivono lo stesso registro: deve restare il valore di JJ add $1,… poi lw $1,…

In una pipeline che esegue in ordine con un solo WB alla fine, solo le RAW causano problemi; WAR e WAW contano nell'esecuzione fuori ordine (vedi Processori superscalari e multicoreParallelismo a livello di istruzione: processori superscalari, esecuzione fuori ordine, ridenominazione dei registri contro WAR e WAW, speculazione; limiti dell'ILP e della frequenza (consumo); multithreading, multicore e coerenza delle cache; acceleratori.Processori superscalari e multicore →). Per individuarle si fa una tabella: per ogni istruzione, quali registri legge (R) e quali scrive (W), e si guarda colonna per colonna. Esercizio svolto: Esercizio 18 · dipendenze RAW e WAW in un frammento MIPS.

Stallo senza forwarding

lw  $3, 0($0)
add $5, $3, $4

add legge $3 in ID, ma lw lo scrive solo in WB. Con scrittura nella prima metà e lettura nella seconda metà del ciclo, ID di add deve stare nello stesso ciclo di WB di lw: 2 cicli di stallo.

1 2 3 4 5 6 7 8
lw IF ID EX MEM WB
add IF ID ID ID EX MEM WB
successiva IF IF IF ID EX MEM

L'istruzione in stallo resta in ID, quella dietro resta in IF.

Data forwarding

Il risultato esiste già prima di WB: per un'istruzione aritmetica alla fine di EX, per una load alla fine di MEM. Il forwarding (bypass) lo porta direttamente all'ingresso dell'ALU dai registri di pipeline EX/MEM o MEM/WB, tramite multiplexer comandati da un'unità che confronta i numeri dei registri.

  • Aritmetica seguita da un'istruzione che usa il risultato: nessuno stallo (EX/MEM → ingresso ALU).
  • Load seguita subito da un uso (load-use): il dato è pronto solo alla fine di MEM, quando l'istruzione dopo è già in EX. Resta 1 ciclo di stallo anche con forwarding.
1 2 3 4 5 6 7
lw $3 IF ID EX MEM WB
add …,$3,… IF ID ID EX MEM WB

Riordino delle istruzioni

  • Compilatore (scheduling statico): sposta istruzioni indipendenti tra la load e il suo uso, senza cambiare il significato del programma.
  • Hardware (scheduling dinamico): il processore riordina a tempo di esecuzione le istruzioni i cui operandi sono pronti.

Esempio: a = b + c; d = e + f; → lw b, lw c, add, sw a, lw e, lw f, add, sw d ha due load-use; spostando lw e e lw f prima della prima add gli stalli spariscono.

Hazard sul controllo

Un salto cambia il PC, ma mentre il salto avanza nella pipeline sono già state prelevate le istruzioni successive. Se l'indirizzo e la condizione sono noti solo alla fine di EX, un salto preso fa buttare le 2 istruzioni prelevate dopo: 2 cicli persi.

Esempio di costo: 15% di salti condizionati di cui il 60% presi, 1% di salti incondizionati, 2 cicli persi per ogni salto preso, si prevede "non preso":

stalli per istruzione=0,01⋅2+0,15⋅0,6⋅2+0,15⋅0,4⋅0=0,2S=51,2≈4,17\text{stalli per istruzione} = 0{,}01 \cdot 2 + 0{,}15 \cdot 0{,}6 \cdot 2 + 0{,}15 \cdot 0{,}4 \cdot 0 = 0{,}2 \qquad S = \frac{5}{1{,}2} \approx 4{,}17

Svolto in Esercizio 19 · speedup di una pipeline con salti. Le tecniche per ridurre questo costo sono in Branch predictionTecniche per gli hazard sul controllo: stallo, flussi multipli, prelievo anticipato del bersaglio, loop buffer, salto ritardato; predizione statica e dinamica con bit di storia, predittore a 1 e a 2 bit con esempio su un ciclo, tabella dei bersagli (BTB); costo di una predizione errata.Branch prediction →.

Errori tipici

  • Considerare RAW solo rispetto all'istruzione immediatamente precedente: con pipeline lunghe contano anche quelle più indietro.
  • Credere che il forwarding elimini sempre gli stalli: il caso load-use ne lascia uno.
  • In sw $1, 0($2) considerare $1 scritto: è letto.

Versione ripasso

Hazard: l'istruzione successiva non può entrare nel suo stadio al ciclo previsto; stalli (bolle) (PipelineIdea della catena di montaggio; pipeline a 5 stadi IF, ID, EX, MEM, WB; tempo di ciclo, tempo per n istruzioni in una pipeline a k stadi e speedup con esempi svolti; registri di pipeline; scrittura e lettura dei registri nello stesso ciclo; limiti (stadi sbilanciati, hazard).Pipeline →).

Strutturali

Stessa risorsa nello stesso ciclo (IF e MEM con una sola memoria): cache istruzioni e dati separate; banco registri scritto nella prima metà del ciclo e letto nella seconda.

Sui dati

Sul controllo

Con condizione e indirizzo noti a fine EX, un salto preso butta le 2 istruzioni prelevate. 15% condizionati (60% presi), 1% incondizionati, "non preso": stalli=0,01⋅2+0,15⋅0,6⋅2=0,2S=51,2≈4,17\text{stalli} = 0{,}01 \cdot 2 + 0{,}15 \cdot 0{,}6 \cdot 2 = 0{,}2 \qquad S = \frac{5}{1{,}2} \approx 4{,}17 (Esercizio 19 · speedup di una pipeline con salti, Branch predictionTecniche per gli hazard sul controllo: stallo, flussi multipli, prelievo anticipato del bersaglio, loop buffer, salto ritardato; predizione statica e dinamica con bit di storia, predittore a 1 e a 2 bit con esempio su un ciclo, tabella dei bersagli (BTB); costo di una predizione errata.Branch prediction →).

Errori tipici: guardare le RAW solo con l'istruzione precedente; il forwarding non elimina il load-use; in sw il primo registro è letto.

Esercizi su questo argomento

Lezioni in cui compare

Teoria collegata