Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Istruzioni
Si scriva solo negli spazi previsti nel testo della prova e non si separino i fogli.
Per la minuta si utilizzino le pagine bianche inserite in fondo al fascicolo distribuito con il testo della prova. I
fogli di minuta, se staccati, vanno consegnati intestandoli con nome e cognome.
È vietato portare con sé libri, eserciziari e appunti, nonché cellulari e altri dispositivi mobili di calcolo o
comunicazione. Chiunque fosse trovato in possesso di documentazione relativa al corso – anche se non
strettamente attinente alle domande proposte – vedrà annullata la propria prova.
Tempo a disposizione 1 h : 30 m
int val = 0
int vet [NUM] / 4096 = 2^12 e 16384 = 2^14 /
int ini
spiazzamento
contenuto
rispetto a
simbolico
gp 0x 1000 8000
Indirizzi alti
INI 0x C004
VET [4095] 0x C000
VET [...]
VET [0] 0x 8004
VAL 0x 8000 Indirizzi bassi
Essendo la prima dichiarata, la variabile globale intera VAL ha spiazzamento 215 0x 8000.
L’elemento intero (una parola da 32 bit ossia da 4 byte) VET [0] della variabile globale vettore VET
ha spiazzamento 215 4 0x 8004. Si ha che 4096 212 e 4096 4 16384 214. Pertanto
l’elemento intero VET [4095] del vettore ha spiazzamento ( 215 4) (214 4) 215 214 2
214 214 214 1100 0000 0000 0000 0x C000. La variabile globale intera INI segue
immediatamente e ha spiazzamento 214 4 0x C004.
punto 1 – codice MIPS della sezione dichiarativa globale (numero di righe non significativo)
.data 0x 1000 0000 // segmento dati statici standard
.equ NUM, 4096 // costante NUM
VAL: .word 0 // ingombro di var VAL (inizializzata)
spiazz. rispetto
contenuto simbolico
a stack pointer
ra (salvato da NORMA) 8 indirizzi alti
s0 (salvato da NORMA) 4
s1 (salvato da NORMA) 0 sp (fine area)
indirizzi bassi
La funzione norma è ricorsiva e deve salvare il registro ra. La funzione quad usa il registro a0, ma dopo il
rientro di quad la funzione norma non lo usa più, dunque non occorre che norma lo salvi in pila. La funzione
quad è foglia e non usa il registro a1, dunque non occorre che la funzione norma lo salvi in pila. Dopo la
chiamata ricorsiva alla funzione norma, il valore di uscita va salvato in pila per potere successivamente
completare il calcolo dell’espressione (un’addizione) dopo la chiamata alla funzione quad, perché la funzione
quad usa il registro v0 e non lo si può salvare in uno dei registri temporanei tx (dove solitamente si tengono
i risultati parziali del calcolo delle espressioni), dato che la funzione quad non li preserva.
// ini = readint ( )
ELSE: // res = 0
move $s1, $zero // aggiorna varloc RES
Si noti come il valusc di NORMA vada salvato in pila. Invece non occorre salvare in pila gli argomenti.
D1 = Q2 xor I
D2 = Q1
U = Q1 xor Q2
I 0
D1
Q1 0
D2
1
Q2
U
CLK
I 0
D1
Q1 0
D2
1
Q2
U
CLK
Nota: la memoria ha 12 bit di indirizzo; di questi, 7 bit servono per individuare il byte nel blocco; nella cache
ci sono quattro blocchi organizzati in due gruppi, dunque lo 8° bit (da destra) indica l’insieme e i 4 bit più
significativi restanti costituiscono l’etichetta.
etichetta
etichetta
etichetta
passo
esito
indirizzo
valido
valido
valido
valido
azione
dati
dati
dati
richiesto dati
carica blocco 16 in A
4 1000 0000 0010 M 1 1000 16 1 1110 28 1 0001 3 1 0110 13
(LRU)
carica blocco 9 in D
5 0100 1111 1110 M 1 1000 16 1 1110 28 1 0001 3 1 0100 9
(LRU)
ciclo di clock
punto 1
a. Definire tutte le dipendenze di dato completando la tabella 1 della pagina successiva (colonne “punto
1a”) indicando quali generano un conflitto, e per ognuna di queste quanti stalli sarebbero necessari per
risolvere tale conflitto (stalli teorici), considerando la pipeline senza cammini di propagazione.
b. Disegnare in diagramma A il diagramma temporale della pipeline senza propagazione di dato, con gli stalli
effettivamente risultanti, e riportare il loro numero in tabella 1 (colonne “punto 1b”).
diagramma A
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
ID WB
1. or IF EX M
1,2 1
diagramma B
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
ID
6. beq IF EX M WB
1, 2
tabella 1
punto 1a punto 1b punto 2b
ciclo di clock
N° N° istruzione registro conflitto N° stalli N° stalli stalli + percorso
in cui è attivo
istruzione da cui dipende coinvolto (si/no) teorici effettivi di propagazione
il percorso
2 1 1 si 2 2 EX / EX (rs) 4
3 2 1 si 2 2 1 stallo + MEM / EX (rs) 6
5 4 2 si 2 2 EX / EX (rt) 8
6 5 1 si 2 2 EX / EX (rs) 9
punto 3
Si ipotizzi ora di voler risolvere i conflitti individuati al punto 1a tramite la tecnica di compilazione del codice
che prevede l’inserimento di istruzioni di nop.
3a) Si scriva nella tabella sottostante (su due colonne per questioni di spazio e con numero di righe non
significativo) la sequenza di istruzioni risultante dopo l’inserimento delle nop.
5. nop 15.
6. nop 16.
9. nop 19.
Cicli di clock = 14 + 4 = 18
Si consideri ora il diagramma temporale diagramma B (vedi prima parte, punto 2) e in particolare il ciclo
di clock 6 così come risulta nella pipeline non ottimizzata e con i percorsi di propagazione attivati (vedi
anche prima parte, punto 2b, tabella 1) a cui corrisponde lo stato degli stadi della pipeline mostrato qui
sotto.
IF ID EX MEM WB
sub add sw sw_stall lw
Completare le seguenti tabelle tenendo conto che il contenuto iniziale di alcuni registri e parole di memoria è
quello dato in TABELLA CONTENUTI:
segnali relativi al RF (subito prima del fronte di DISCESA interno al ciclo di clock 6)
RF.RegLettura1 RF.DatoLetto1 RF.RegScrittura
$t1 09 (add) 1001 0115 (or) $t1 09 (lw)
.M.MemWrite
1
.M.MemRead
0
TABELLA CONTENUTI
#define N 8
int row
int matrix [N, N]
Si supponga che in linguaggio C la matrice sia rappresentata in memoria per righe: gli elementi di
una riga sono memorizzati consecutivamente e righe consecutive si susseguono in memoria.
Si chiede di tradurre in linguaggio assembler MIPS (con direttive se opportuno) l’istruzione C
seguente, che usa la matrice (l’inizializzazione della variabile globale row non è rilevante):
matrix [row, 6] = 7
completando la tabella seguente, compresa la direttiva .space della matrice:
ROW: .space 4