Esercizio 18dipendenze RAW e WAW in un frammento MIPS
In questa pagina 5
Testo (svolto in aula, lezione del 19 dicembre 2016). Nel seguente frammento di codice assembly MIPS individuare le dipendenze read after write (RAW) e write after write (WAW).
1 loop: lw $1, 0($2) # $1 <- M[$2 + 0]
2 addi $1, $1, 1 # $1 <- $1 + 1
3 sw $1, 0($2) # M[$2 + 0] <- $1
4 add $2, $1, $2 # $2 <- $1 + $2
5 sub $4, $2, $3 # $4 <- $2 - $3
6 bnz $4, loop # salta a loop se $4 != 0Metodo
Per ogni istruzione si annota quali registri legge (R) e quali scrive (W), poi si guarda ogni colonna: c'è una RAW quando un'istruzione legge un registro scritto da una precedente, una WAW quando scrive un registro già scritto da una precedente. Si confronta ogni istruzione con tutte le precedenti, non solo con quella immediatamente prima: quali dipendenze diventino stalli dipende dalla lunghezza della pipeline. Vedi Hazard nella pipelineHazard strutturali, sui dati e sul controllo; dipendenze RAW, WAR e WAW; stalli e bolle con diagrammi; data forwarding (bypass) e caso load-use; riordino delle istruzioni da parte del compilatore e dell'hardware; costo dei salti.Hazard nella pipeline →.
Attenzione a lw e sw: nella lw il primo registro è scritto, nella sw è letto (è il dato da mettere in memoria). La sw non scrive registri.
Tabella
| # | Istruzione | $1 |
$2 |
$3 |
$4 |
|---|---|---|---|---|---|
| 1 | lw |
W | R | ||
| 2 | addi |
R, W | |||
| 3 | sw |
R | R | ||
| 4 | add |
R | R, W | ||
| 5 | sub |
R | R | W | |
| 6 | bnz |
R |
Dipendenze RAW
- Registro
$1(scritto da 1 e da 2):- 2 da 1 (la
addilegge$1caricato dallalw); - 3 da 2 e da 1;
- 4 da 2 e da 1.
- 2 da 1 (la
- Registro
$2(scritto solo da 4): 5 da 4. Le letture di$2in 1 e 3 vengono prima della scrittura, quindi non sono RAW. - Registro
$4(scritto da 5): 6 da 5.
Dipendenze WAW
- Registro
$1: 2 da 1 (entrambe scrivono$1). - Nessun'altra:
$2è scritto solo da 4,$4solo da 5.
Osservazioni
- La dipendenza effettiva per il valore letto è quella con l'ultima scrittura precedente (la 3 usa il
$1prodotto dalla 2), ma l'esercizio chiede di elencarle tutte. - In una pipeline che esegue in ordine le WAW non causano problemi; vanno comunque saputi riconoscere.
- Per completezza, ci sono anche due WAR: la 4 scrive
$2, che 1 e 3 leggono prima.
Versione ripasso
Testo (svolto in aula, lezione del 19 dicembre 2016). Nel seguente frammento di codice assembly MIPS individuare le dipendenze read after write (RAW) e write after write (WAW).
1 loop: lw $1, 0($2) # $1 <- M[$2 + 0]
2 addi $1, $1, 1 # $1 <- $1 + 1
3 sw $1, 0($2) # M[$2 + 0] <- $1
4 add $2, $1, $2 # $2 <- $1 + $2
5 sub $4, $2, $3 # $4 <- $2 - $3
6 bnz $4, loop # salta a loop se $4 != 0Metodo: per ogni istruzione si annotano i registri letti (R) e scritti (W) e si confronta ciascuna con tutte le precedenti (Hazard nella pipelineHazard strutturali, sui dati e sul controllo; dipendenze RAW, WAR e WAW; stalli e bolle con diagrammi; data forwarding (bypass) e caso load-use; riordino delle istruzioni da parte del compilatore e dell'hardware; costo dei salti.Hazard nella pipeline →). Nella lw il primo registro è scritto, nella sw è letto (e la sw non scrive registri).
- Letture/scritture: 1:
$1W,$2R; 2:$1R e W; 3:$1R,$2R; 4:$1R,$2R e W; 5:$2R,$3R,$4W; 6:$4R. - RAW su
$1: 2 da 1; 3 da 2 e da 1; 4 da 2 e da 1. Su$2(scritto solo da 4): 5 da 4 (le letture in 1 e 3 vengono prima della scrittura). Su$4: 6 da 5. - WAW: solo
$1, 2 da 1.
Per il valore letto conta l'ultima scrittura (la 3 usa il $1 della 2). Ci sono anche due WAR: la 4 scrive $2, letto prima da 1 e 3.