Primo appello - 14 giugno 2022_sol.pdf
Traccia:
[5 pt] Si consideri di eseguire il seguente stralcio di codice su una pipeline RISC-V con logica di forwarding e con dynamic branch predictor a singolo bit inizialmente settato a BRANCH TAKEN.
li t2,3 // UB, sto caricando il valore 3 all'interno del registro t2
li t0,0 // i = 0, carico il valore 0 all'interno del registro t0
loop_i // definisco il primo ciclo
li t1,0 // j = 0, carico il valore 0 all'interno del registro t1
loop_j // definisco il secondo ciclo
addi t1,t1,1 // incremento di una unità t1
blt t1,t2,loop_j // controllo che t1 sia minore di t2 e se si avvera tale condizione
// continuo a iterare nel secondo ciclo
addi t0,t0,1 // incremento di una unità t0
blt t0,t2,loop_i // controllo che t0 sia minore di t2 e se si avvera tale condizione
// continuo a iterare nel secondo ciclo
jr ra // return
Il codice assembly visualizzato all’interno dello blocco precedente definisce due cicli for che sono innestati l’uno nell’altro come nel seguente codice C:
for (i = 0; i < 3; i++)
for (j = 0; j < 3; j++)
Riporto in calce una versione estesa di ciò che avviene in assembly come approdondimento e anticipazione di alcuni argomenti che verranno trattati in seguito nel corso del tutorato.
a) Si calcoli la misprediction rate [2,5 pt].
b) Sapendo che:
mentre in caso di misprediction ne impiega 8
Si calcoli il CPI medio per l’esecuzione del programma [2,5 pt]
Dati a disposizione:
Su 30 istruzioni totali 12 sono branch, 17 aritmetiche (CPI=2) e 1 salto incondizionato (CPI=2).