loop: | LW | R1, 0(R2) | R1← mem[0+[R2]] |
ADDI | R1,R1,#1 | R1← [R1] + 1 | |
SW | R1, 0(R2) | mem[0+[R2]] ← [R1] | |
ADDI | R2, R2, #4 | R2← [R2] + 4 | |
SUB | R4, R3, R2 | R4← [R3] - [R2] | |
BENZ | R4, loop | if([R4] != 0) PC ← indirizzo(loop) |
a) si individuino e discutano le dipendenze dovute ai dati
Soluzione:
DIPENDENZE |
[dipendenza dati (senza considerare limiti architettura
MIPS)] [dipendenza dati considerando i limiti della architettura MIPS] |
R1 in ADDI R1,R1,#1
dipende da LW R1, 0(R2) |
[input EXEADDI
ha bisogno di
output da MEMLW] [IDADDI deve legge R1 aggiornato da WBLW (stesso ciclo clock)] |
R1 in SW
R1,0(R2)
dipende da LW R1, 0(R2) |
[input MEMSW ha bisogno di output da MEMLW] [IDSW deve legge R1 aggiornato da WBLW (stesso ciclo clock)] |
R1 in SW
R1,0(R2)
dipende da ADDI R1,R1,#1 |
[input MEMSW ha bisogno di output da EXEADDI] [IDSW deve legge R1 aggiornato da WBADDI (stesso ciclo clock)] |
R2 in SUB R4, R3,
R2
dipende da ADDI R2,R2,#4 |
[input EXESUB
ha bisogno di output da EXEADDI] [IDSUB deve legge R2 aggiornato da WBADDI (stesso ciclo clock)] |
R4 in BENZ
R4, loop
dipende da SUB R4, R3, R2 |
[input EXEBENZ ha bisogno di output da EXESUB] [IDBENZ deve legge R4 aggiornato da WBSUB (stesso ciclo clock)] |
b) mostrare come evolve la pipeline durante l'esecuzione del codice per le prime 6 istruzioni eseguite, assumendo:
Si calcoli inoltre il numero totale di cicli di clock necessari per portare a termine l'esecuzione completa del codice.
Soluzione:
Evoluzione pipeline per le prime 6 istruzioni eseguite
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | |||
l: | LW | R1,0(R2) | IF | ID | EXE | MEM | WB | ||||||
ADDI | R1,R1,#1 | IF | ID | ID | EXE | MEM | WB | ||||||
SW | R1, 0(R2) | IF | IF | ID | EXE | MEM | WB | ||||||
ADDI | R2,R2,#4 | IF | ID | EXE | MEM | WB | |||||||
SUB | R2,R3,R2 | IF | ID | EXE | MEM | WB | |||||||
BENZ | R4, l | IF | ID | EXE | MEM | WB | |||||||
non preso/preso | IF | IF | IF (preso: LW R1,0(R2) | ID |
Il numero totale di cicli è calcolato come segue:
numero di iterazioni del ciclo = (396/4) + 1 = 99 + 1 = 100
numero cicli di clock per eseguire il codice = 99 * 9 (si sovrappone MEMBENZ della iterazione i con IFLW della iterazione i+1) + 1*11 = 902
Se si considera che lo stadio WB di BENZ in effetti non fa nulla, i cicli sono 901.