Esercizio Pipeline MIPS

Soluzione

 

Considerando la pipeline MIPS vista a lezione, si consideri il seguente frammento di codice:
 
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)
assumendo che il valore iniziale di R3 sia R2+396.

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.