Lezione di Tutorato Di Architettura degli Elaboratori B

Transcript

Lezione di Tutorato Di Architettura degli Elaboratori B
Lezione di Tutorato Di Architettura degli Elaboratori B
18/05/2005
SOLUZIONI: PIPELINE
Consegna per le domande del compito: (da 3 a 5 domande)
Rispondere alle seguenti domande in maniera sintetica, usando il presente foglio per scrivere le risposte. Non è
possibile consultare libri o appunti.
Tempo a disposizione: 35 min.
Domande:
1.
Quali sono i fattori che influenzano il CPI medio misurato per l’esecuzione di un
insieme di programmi su un’architettura multiciclo? E Su un’architettura pipeline?
2.
Spiegare perché le dipendenze sui dati (RAW) possono provocare criticità
nell’esecuzione pipeline vista a lezione per il processore MIPS.
3.
In cosa si differenziano le parti controllo della CPU multiciclo e pipeline visti a
lezione?
4.
Rispetto all’architettura pipeline vista a lezione, in che cosa consiste il forwarding, e a
cosa serve? (E’ possibile spiegare con un esempio)
5.
Rispetto all’architettura pipeline vista a lezione, in che cosa consiste il delayed branch
e quali sono i suoi vantaggi/svantaggi?
6.
Perché nei processori pipeline moderni è necessario prevedere il salti? Molto
sinteticamente, come viene realizzata la previsione?
7.
Rispetto all’architettura pipeline vista a lezione (con forwarding), in quale caso non
riusciamo ad eliminare lo stallo dopo l’istruzione di lw, e perché?
8.
Verificare (con qualche esempio) come le dipendenze sui dati tra istruzioni aritmetiche
MIPS non provocano stalli nella CPU pipeline a 5 stadi visti a lezione, grazie al
forwarding dei dati e al particolare register file, che nella prima parte del ciclo scrive e
nella seconda parte legge i registri.
Ultima modifica: 18/05/2005
Luca Di Gesù 786959
1
Lezione di Tutorato Di Architettura degli Elaboratori B
18/05/2005
Esercizi:
1. Considerare il seguente programma assembler MIPS:
addi $10, $0, 0
Loop:
add $11, $20, $10
lw $12, 0($11)
addi $12, $12, 128
sw $12, 0($11)
addi $10, $10, 4
bne $10, $21, Loop
Se $20 è un indirizzo di memoria e $21=1024, qual è l’effetto dell’esecuzione ?
Calcolare il CPI del programma rispetto a:
• la CPU pipeline vista a lezione con forwarding e delayed branch (in questo caso,
se necessario, disegnare il diagramma degli stati di un’iterazione del loop);
• la CPU multiciclo vista a lezione.
Risp: Il programma somma 128 agli elementi di un array di 256 elementi interi, dove l’array è puntato da $20.
Il loop è eseguito 256 volte.
Il numero di istruzioni eseguite è quindi:
IC = 1 + 256 * 6 = 1 + 1536 = 1537
• Gli unici stalli sono necessari dopo la lw a causa di una dipendenze RAW sul registro $12, mentre
una nop deve essere inserita dopo la bne a causa del delayed branch.
Quindi il numero di cicli totali, senza considerare i cicli per inizializzare la pipeline, sono:
#Cicli = 1 + 256 * ( 6 + 2 ) = 1 + 2048 = 2049
Da cui si ottiene che il CPI è:
CPI = 2049/1537 = 1.33
• Considerando che tutte le istruzioni impiegano 4 cicli, escluso bne (3 cicli) e lw (5 cicli), per ogni
ciclo del loop si impiegano:
#Cicliiter = 4 * 4 + 3 + 5 = 24 cicli
Quindi i cicli totali per l’esecuzione sono:
#Cicli = 4 + 256 * 24 = 6148
Da cui si ottiene che il CPI è:
CPI = 6148 / 1537 = 4
2. Si individuino le dipendenze RAW (Read After Write) nel seguente codice MIPS:
Compito 17 Giugno 2002)Es3
lw $2, 25($27)
add $1, $2, $3
add $4, $5, $6
add $4, $4, $1
add $4, $4, $28
Si consideri una CPU MIPS a 5 stadi come quella vista a lezione, ma senza forwarding, e
con un register file che nella prima parte del ciclo scrive e nella seconda parte del ciclo legge
i registri. La CPU in questione non ha hazard detection unit, per cui la gestione delle
dipendenze è affidata al software.
Si richiede quindi di inserire le nop opportune nel codice, di verificare il funzionamento con
un diagramma temporale, e di calcolare il #Cicli totali spesi per l’esecuzione.
Continua…
Ultima modifica: 18/05/2005
Luca Di Gesù 786959
2
Lezione di Tutorato Di Architettura degli Elaboratori B
18/05/2005
Continua esercizio 2…
Si consideri inoltre un altra CPU che, rispetto alla prima, sia dotata di forwarding e hazard
detection unit. In questo caso la pipeline viene messa in stallo dinamicamente, dai circuiti
della CPU. Si richiede di disegnare il diagramma temporale di esecuzione, mettendo in
evidenza i forwarding (con delle frecce, da stadio a stadio), e di calcolare il #Cicli totali
spesi per l’esecuzione.
Come sono occupati i 5 stadi della pipeline durante il 4° ciclo di esecuzione?
Risp:
Il diagramma delle dipendenze RAW è il seguente, gli archi sono etichettati con i registri che causano le
varie dipendenze:
Dopo aver inserito le nop opportune, il codice diventa:
lw $2, 25($27)
nop
nop
add $1, $2, $3
add $4, $5, $6
nop
nop
add $4, $4, $1
nop
nop
add $4, $4, $28
che impiega appunto 15 cicli, come si evince dal diagramma temporale seguente:
Continua…
Ultima modifica: 18/05/2005
Luca Di Gesù 786959
3
Lezione di Tutorato Di Architettura degli Elaboratori B
18/05/2005
Continua esercizio 2…
Infine, se la CPU fosse dotata di forwarding, i cicli impiegati per l’esecuzione sarebbero 10, come si
evince dal corrispondente diagramma:
Al 4° ciclo le componenti della CPU sono impiegate come segue:
IF sta eseguendo (ripetendo) la seconda add del programma,
ID sta eseguendo (ripetendo) la prima add,
su EXE sta transitando una bolla (nop),
MEM sta eseguendo lw,
WB non sta eseguendo nessuna delle istruzioni del nostro frammento di programma (quindi WB sta
eseguendo l’eventuale istruzione precedente la lw).
3. Si individuino le dipendenze RAW (Read After Write) nel seguente codice MIPS:
1. lw $2, 25($27)
2. add $4, $2, $6
3. add $1, $27, $3
4. sub $5, $2, $1
5. and $5, $5, $28
Si consideri una CPU MIPS a 5 stadi come quella vista a lezione, ma senza forwarding, e
con un register file normale, che durante un ciclo di clock permette di leggere i vecchi valori
di una coppia di registri, e di modificare un solo registro alla fine dello stesso ciclo.
La CPU in questione non ha hazard detection unit, per cui la gestione delle dipendenze è
affidata al software.
Si richiede quindi di inserire le nop opportune nel codice, di verificare il funzionamento con
un diagramma temporale, e di calcolare il #Cicli totali spesi per l’esecuzione.
Si chiede infine di modificare l’ordine di esecuzione delle istruzioni per ridurre il numero di
cicli impiegati per l’esecuzione del programma. Verificare il risparmio in cicli tramite il
diagramma temporale di esecuzione.
Risp:
Le dipendenze sono:1->2 (reg. $2)
1->4 (reg. $2)
3->4 (reg. $1)
4->5 (reg. $5)
Continua…
Ultima modifica: 18/05/2005
Luca Di Gesù 786959
4
Lezione di Tutorato Di Architettura degli Elaboratori B
18/05/2005
Continua esercizio 3…
Per far rispettare le dipendenze di sopra, istr_i -> istr_j, basta fare in modo che lo stadio ID dell’istruzione
istr_j avvenga successivamente allo stadio WB di istr_i con i<j .
Dopo aver inserito le nop opportune, il nuovo diagramma temporale è il seguente.
Scambiando 2 con 3 abbiamo:
1. lw $2, 25($27)
3. add $1, $27, $3
2. add $4, $2, $6
4. sub $5, $2, $1
5. and $5, $5, $28
Grazie a questa modifica, possiamo ridurre il numero di nop inserite.
4. Solitamente abbiamo ottimizzato il codice in esecuzione su un processore pipeline con
forwarding, riordinando opportunamente le istruzioni. In questo esercizio si chiede invece di
massimizzare il numero di cicli impiegati, riordinando le istruzioni in modo da rispettare le
dipendenze, ma introducendo il massimo numero di stalli. Il codice da peggiorare è il
seguente, dove l’ultima istruzione è stata inserita nel delay slot del branch:
1Ciclo:lw
2
lw
3
add
4
add
5
add
6
sw
7
beq
8
addi
$3,
$4,
$7,
$8,
$10,
$6,
$10,
$5,
0($5)
4($5)
$7,
$8,
$7,
0($5)
$11,
$5,
$3
$4
$8
Ciclo
8
Individuare le dipendenze del codice, e verificare eventuali stalli nello scheduling attuale
delle istruzioni. Peggiorare il codice segnalando gli stalli introdotti.
Continua…
Ultima modifica: 18/05/2005
Luca Di Gesù 786959
5
Lezione di Tutorato Di Architettura degli Elaboratori B
18/05/2005
Continua esercizio 4…
Risp: Il codice peggiorato `e il seguente:
1Ciclo:lw $3, 0($5)
3
add $7, $7,
6
sw $6, 0($5)
2
lw $4, 4($5)
4
add $8, $8,
5
add $10, $7,
8
addi $5, $5,
7
beq $10, 11,
nop
$3
# stallo sul registro $3
$4
$8
8
Ciclo
# stallo sul registro $4
# delay slot non riempito
5. Si consideri il seguente programma:
start : add
lw
addi
sw
addi
bne
nop
end_loop:
...
$t1,
$t2,
$t2,
$t2,
$t0,
$t0,
$s0,
0($t1)
$t2,
0($t1)
$t0,
$s3,
$t0
100
4
start
$s0 contiene l’indirizzo iniziale di un array di interi, $t0 viene usato come indice dell’array,
mentre $s3 (ovvero $s3/4) contiene il numero di elementi dell’array.
• Individuare le dipendenze RAW (Read After Write) nel codice
• Facendo riferimento all’architettura MIPS vista a lezione con pipeline a 5 stadi,
considerando sia il forwarding e sia il delayed branch (vedi nop dopo il branch), si
disegni un diagramma temporale di esecuzione di una singola iterazione del loop,
mettendo in evidenza i vari forwarding necessari per risolvere le dipendenze RAW.
Risp:
Le dipendenze RAW sono illustrate nel seguente diagramma:
Il diagramma di esecuzione del corpo del loop con i relativi forwarding è il seguente:
Ultima modifica: 18/05/2005
Luca Di Gesù 786959
6