Sei sulla pagina 1di 14

Politecnico di Milano

Dip. di Elettronica, Informazione e Bioingegneria


prof.ssa Anna Antola prof.ssa Donatella Sciuto
prof. Luca Breveglieri prof.ssa Cristina Silvano

AXO – Architettura dei Calcolatori e Sistemi Operativi


PRIMA PARTE – giovedì 20 febbraio 2020

Cognome ________________________ Nome ________________________

Matricola _____________________ Firma ____________________________

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.

Non è possibile lasciare l’aula conservando il tema della prova in corso.

Tempo a disposizione 1 h : 30 m

Valore indicativo di domande ed esercizi, voti parziali e voto finale:

esercizio 1 (6 punti) _________________________

esercizio 2 (3 punti) _________________________

esercizio 3 (6 punti) _________________________

esercizio 4 (1 punti) _________________________

voto finale: (16 punti) ______________________

CON SOLUZIONI (in corsivo)


esercizio n. 1 – linguaggio macchina
traduzione da C ad assembler

Si deve tradurre in linguaggio macchina simbolico (assemblatore) MIPS il frammento di programma C


riportato sotto. Il modello di memoria è quello standard MIPS e le variabili intere sono da 32 bit. Non si
tenti di accorpare od ottimizzare insieme istruzioni C indipendenti. Si facciano le ipotesi seguenti:
 il registro “frame pointer” fp non è in uso
 le variabili locali sono allocate nei registri, se possibile
 vanno salvati (a cura del chiamante o del chiamato, secondo il caso) solo i registri necessari
Si chiede di svolgere i quattro punti seguenti (usando le varie tabelle predisposte nel seguito):
1. Si descriva il segmento dei dati statici dando gli spiazzamenti delle variabili globali rispetto al registro
global pointer gp, e si traducano in linguaggio macchina le dichiarazioni delle variabili globali.
2. Si descrivano l’area di attivazione della funzione norma e l’allocazione delle variabili locali e dei
parametri di norma nei registri.
3. Si traduca in linguaggio macchina il codice degli statement riquadrati nel prog. principale main.
4. Si traduca in linguaggio macchina il codice dell’intera funzione norma (vedi tab. 4 strutturata).

/ sezione dichiarativa costanti e variabili globali /


#define NUM 4096

int val = 0
int vet [NUM] / 4096 = 2^12 e 16384 = 2^14 /
int ini

int quad (int base) / testata funz foglia quad /


int readint ( ) / testata funz foglia readint /

int norma (int  ptr, int num)  / funzione norma /


int elm, res
if (num < NUM) 
elm = ptr
res = norma (ptr + 1, num + 1) + quad (elm)
 else 
res = 0
 / if /
return res
 / norma /

void main ( )  / prog. principale /


ini = readint ( )
val = norma (&vet [ini], NUM - ini)
 / main /

AXO – prova 1 di giovedì 20 febbraio 2020 – CON SOLUZIONI pagina 2 di 14


punto 1 – segmento dati statici (numero di righe non significativo)

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)

VET: .space 16384 // ingombro di array VET: 16384  4096  4

INI: .space 4 // ingombro di var INI (non iniz)

AXO – prova 1 di giovedì 20 febbraio 2020 – CON SOLUZIONI pagina 3 di 14


punto 2 – area e registri di NORMA (numero di righe non significativo)

area di attivazione di NORMA

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

allocazione dei parametri e delle


variabili locali di NORMA nei registri

parametro / variabile locale registro

PTR (primo argomento) a0


NUM (secondo argomento) a1
ELM (varloc allocata in registro) s0
RES (varloc allocata in registro) s1

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.

AXO – prova 1 di giovedì 20 febbraio 2020 – CON SOLUZIONI pagina 4 di 14


punto 3 – codice MIPS degli statement riquadrati di MAIN – (numero di righe non significativo)

// ini = readint ( )

jal READINT // chiama funz READINT

sw $vo, INI // aggiorna varglob INI

// val = norma (&vet [ini], NUM - ini)

la $t0, VET // carica ind di elemento VET[0]

lw $t1, INI // carica varglob INI

sll $t1, $t1, 2 // allinea indice di array VET

addu $a0, $to, $t1 // prepara param PTR di funz NORMA

li $t2, NUM // carica cost NUM

lw $t3, INI // (ri)carica varglob INI

sub $a1, $t2, $t3 // prepara param NUM di funz NORMA

jal NORMA // chiama funz NORMA

sw $v0, VAL // aggiorna varglob VAL

Si può ottimizzare un po’ evitando di ricaricare la varglob INI.

AXO – prova 1 di giovedì 20 febbraio 2020 – CON SOLUZIONI pagina 5 di 14


punto 4 – codice MIPS dell’intera funzione NORMA – (numero di righe non significativo)
NORMA: addiu $sp, $sp, -12 // COMPLETARE - crea area attiv.
// scrivere qui le direttive .equ per gli spiazzamenti in pila
.equ RA, 8 // spi reg ra salvato
.equ S0, 4 // spi reg s0 salvato
.equ S1, 0 // spi reg s1 salvato

// salvataggi di registri - NON VANNO RIPORTATI


IF: // if (num < NUM)
li $t0, NUM // carica cost NUM
bge $a1, $t0, ELSE // se num >= NUM salta a ELSE

THEN: // elm = ptr


lw $s0, ($a0) // aggiorna varloc ELM

// res = norma (ptr + 1, num + 1) + quad (elm)


addiu $a0, $a0, 4 // prepara param PTR di funz NORMA
addi $a1, $a1, 1 // prepara param NUM di funz NORMA
jal NORMA // chiama funz NORMA
addiu $sp, $sp, -4 // inizia push
sw $v0, ($sp) // push valusc di funz NORMA
move $a0, $s0 // prepara param BASE di funz QUAD
jal QUAD // chiama funz QUAD
lw $t0, ($sp) // pop valusc di funz NORMA
addiu $sp, $sp, 4 // finisci pop
add $s1, $t0, $v0 // calcola espr e aggiorna varloc RES
j ENDIF // vai a ENDIF

ELSE: // res = 0
move $s1, $zero // aggiorna varloc RES

ENDIF: // return res – SCRIVERE solo preparazione del valore uscita


move $v0, $s1

Si noti come il valusc di NORMA vada salvato in pila. Invece non occorre salvare in pila gli argomenti.

AXO – prova 1 di giovedì 20 febbraio 2020 – CON SOLUZIONI pagina 6 di 14


esercizio n. 2 – logica digitale e memoria cache
prima parte – logica sequenziale
Sia dato il circuito sequenziale composto da due bistabili master-slave di tipo D (D1, Q1 e D2, Q2, dove D
è l’ingresso del bistabile e Q è lo stato / uscita del bistabile), con un ingresso I e un’uscita U, descritto
dalle seguenti equazioni:

D1  =  Q2  xor  I  
 
D2  =  Q1 
 
U    =  Q1  xor Q2 

Si chiede di completare il diagramma temporale riportato qui sotto. Si noti che:


 si devono trascurare completamente i ritardi di propagazione delle porte logiche XOR e i ritardi di
commutazione dei bistabili
 i bistabili sono il tipo master-slave la cui struttura è stata trattata a lezione, con uscita che commuta
sul fronte di discesa del clock
diagramma temporale da completare

                                                         

I  0                                                       

                                                         

D1                                                         

                                                         

Q1  0                                                       

                                                         

D2                                                         

  1                                                       

Q2                                                         

                                                         

U                                                         

                                                         

CLK                                                         

AXO – prova 1 di giovedì 20 febbraio 2020 – CON SOLUZIONI pagina 7 di 14


Soluzione Un segnale Q è costante per tutto un intervallo e ha il valore che il corrispondente segnale D
aveva immediatamente prima del fronte di discesa del clock all’inizio dell’intervallo.
Ecco il procedimento di calcolo dei valori in un intervallo:
 per tutto l’intervallo corrente, si pongono i segnali Q1 e Q2 rispettivamente uguali ai valori dei
corrispondenti segnali D1 e D2 verso la fine dell’intervallo precedente
 si calcolano i segnali D1 e D2 nell’intervallo corrente, istante per istante, in funzione di I, Q1 e Q2
Poi si passa all’intervallo successivo e così via fino al termine. Ovviamente nel primo intervallo i segnali Q1 e
Q2 sono già dati (è lo stato iniziale, non calcolabile perché non è noto l’intervallo precedente).
Pertanto ricavare il diagramma temporale è semplice e rapido. Eccolo:

                                                         

I  0                                                       

                                                         

D1                                                         

                                                         

Q1  0                                                       

                                                         

D2                                                         

  1                                                       

Q2                                                         

                                                         

U                                                         

                                                         

CLK                                                         

AXO – prova 1 di giovedì 20 febbraio 2020 – CON SOLUZIONI pagina 8 di 14


seconda parte – memoria cache

Si consideri un sistema di memoria (memoria + cache) con le seguenti caratteristiche:


 memoria di lavoro di 4 K Byte, indirizzata a livello di singolo byte
 cache set associativa a 2 vie di 512 Byte
 ogni blocco della cache contiene 128 Byte, quindi la cache contiene 4 blocchi, denotati dalle
lettere A, B, C e D
 i blocchi A e B appartengono all’insieme 0
 i blocchi C e D appartengono all’insieme 1
 la politica di sostituzione adottata nella cache è LRU (Least Recently Used)
Si chiede di completare la Tabella seguente considerando la sequenza di richieste alla memoria riportata
nella colonna Indirizzo richiesto.
Il significato delle diverse colonne della tabella è il seguente:
 Nella colonna “esito” riportare H (hit) se il blocco richiesto si trova nella cache, M (miss) se invece il
blocco deve essere caricato dalla memoria.
 Nelle colonne “dati” deve essere riportato il numero del blocco della memoria che si trova nel
corrispondente blocco della cache. Si noti che questi valori devono essere espressi come numeri
decimali (base dieci), mentre le etichette sono scritte in binario. Per questo motivo l’indirizzo 000
0001 0010 individua un byte compreso nel blocco 00000due = 0dieci (che quindi ha come etichetta il
valore binario 0000).
 Nella colonna “azione” deve essere indicato il blocco cui si accede (in caso di successo, H) o il
blocco in cui vengono caricati i dati della memoria (in caso di fallimento, M).

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.

blocco A blocco B blocco C blocco D


etichetta

etichetta

etichetta

etichetta
passo

esito

indirizzo
valido

valido

valido

valido

azione
dati

dati

dati

richiesto dati

0 1 0000 0 0 1110 28 1 0001 3 0 0110 13 situazione iniziale

1 0110 1110 0010 M 1 0000 0 0 1110 28 1 0001 3 1 0110 13 carica blocco 13 in D

2 0001 1110 0101 H 1 0000 0 0 1110 28 1 0001 3 1 0110 13 accesso a blocco C

3 1110 0011 1001 M 1 0000 0 1 1110 28 1 0001 3 1 0110 13 carica blocco 28 in B

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)

AXO – prova 1 di giovedì 20 febbraio 2020 – CON SOLUZIONI pagina 9 di 14


esercizio n. 3 – microarchitettura del processore pipeline
prima parte – pipeline e gestione di conflitti e stalli
Si consideri la sequenza di istruzioni sotto riportata e si risponda alle seguenti domande
1. or $t1, $t1, $t2
2. lw $t1, ($t1)
3. sw $t3, 4($t1)
4. add $t2, $t1, $t3
5. sub $t1, $t3, $t2
6. beq $t1, $t2, FINE

    ciclo di clock 

    1  2  3  4  5  6  7  8  9  10  11  12  13 

1. or  IF  ID  EX  MEM  WB                 

2. lw    IF  ID  EX  MEM  WB               


istruzione 

3. sw      IF  ID  EX  MEM  WB             

4. add        IF  ID  EX  MEM  WB           

5. sub          IF  ID  EX  MEM  WB         

  6. beq            IF  ID  EX  MEM  WB       

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 

ID  ID  ID  WB 


2. lw    IF  EX  M                     
stall  stall  1  1 

IF  IF  ID  ID  ID 


3. sw      IF  EX  M  WB               
stall  stall  stall  stall  1,3 

IF  IF  ID  WB 


4. add            IF  EX  M             
stall  stall  1,3  2 

ID  ID  ID  WB 


5. sub                  IF  EX  M       
stall  stall  3,2  1 

IF  IF  ID  ID  ID 


6. beq                    IF  EX  M  WB 
stall  stall  stall  stall  1,2 

AXO – prova 1 di giovedì 20 febbraio 2020 – CON SOLUZIONI pagina 10 di 14


punto 2
Si faccia l’ipotesi che la pipeline non sia ottimizzata per la gestione dei conflitti di controllo e che sia dotata dei
percorsi di propagazione EX/EX, MEM/EX e MEM/MEM.
a. Disegnare in diagramma B il diagramma temporale della pipeline indicando i percorsi di propagazione
che possono essere attivati per risolvere i conflitti e gli eventuali stalli da inserire affinché la
propagazione sia efficace.
b. Indicare in tabella 1 (colonne “punto 2b”), i percorsi di propagazione attivati e gli stalli associati, e il
ciclo di clock in cui sono attivi i percorsi di propagazione.

diagramma B 
  1  2  3  4  5  6  7  8  9  10  11  12  13  14  15  16  17  18 

ID  EX (1)  WB 


1. or  IF  M (1)                           
1, 2  1 

ID  M (1)  WB 


2. lw    IF  EX                         
1  1 

IF  ID  ID 


3. sw      EX  M  WB                     
stall  1, 3 

ID  EX (2)  M (2)  WB 


4. add          IF                   
1, 3  2 

ID  EX (1)  WB 


5. sub            IF  M (1)                 
3, 2  1 

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 

4 2 1 si  1    assorbito    na  na 

5 4 2 si  2    2    EX / EX (rt)  8 

6 4 2 si  1    assorbito    MEM / EX (rt)  9 

6 5 1 si  2    2    EX / EX (rs)  9 

             

             

             

             

AXO – prova 1 di giovedì 20 febbraio 2020 – CON SOLUZIONI pagina 11 di 14


NOTA BENE: nell’identificare tutte le dipendenze di dato richieste dal punto 1a in Tabella 1, si è tenuto conto di quanto
segue
 le dipendenze delle istruzioni 3, 4, 6 dall’istruzione 2 (lw) con registro coinvolto $t1 eliminano le dipendenze
delle stesse istruzioni dall’istruzione 1 (or) con lo stesso registro coinvolto
 la dipendenza dell’istruzione 6 dall’istruzione 5 (sub) con registro coinvolto $t1 elimina la dipendenza della
stessa istruzioni dall’istruzione 2 (lw) con lo stesso registro coinvolto

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.

1. or $t1, $t1, $t2r 11. sub $t1, $t3, $t2

2. nop 12. nop

3. nop 13. nop

4. lw $t1, ($t1) 14. beq $t1, $t2, FINE

5. nop 15.

6. nop 16.

7. sw $t3, 4($t1) 17.

8. add $t2, $t1, $t3 18.

9. nop 19.

10. nop 20.

3b) Si calcolino i cicli di clock necessari all’esecuzione della sequenza completa.

Cicli di clock = 14 + 4 = 18

AXO – prova 1 di giovedì 20 febbraio 2020 – CON SOLUZIONI pagina 12 di 14


seconda parte – pipeline e segnali di controllo

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)

RF.RegLettura2 RF.DatoLetto2 RF.DatodaScrivere


$t3 0B (add) 1000 FFF5 (t3 iniz) 0044 0000

subito prima del fronte di SALITA conclusivo del ciclo di clock 6


segnali all’ingresso dei registri di interstadio

registro EX / MEM registro MEM / WB segnali a unità funzionali

.WB.MemtoReg .WB.MemtoReg MemWrite


X 0 (sw_stall) 0 (sw_stall)

.WB.RegWrite .WB.RegWrite MemRead


0 0 (sw_stall) 0 (sw_stall)

.M.MemWrite
1

.M.MemRead
0

TABELLA CONTENUTI

registro contenuto iniziale


t1 or t2 1001 0115 $t1 0x 1001 0000
$t2 0x 0001 0115
$t3 0x 1000 FFF5
memoria contenuto iniziale
0x 1000 AAA4 0x 1001 1112
0x 1001 0115 0x 0044 0000

AXO – prova 1 di giovedì 20 febbraio 2020 – CON SOLUZIONI pagina 13 di 14


esercizio n. 4 – domande su argomenti vari
rappresentazione di strutture dati in assembler

Si consideri la dichiarazione, in linguaggio C, di un array 2D (ossia una matrice) di elementi interi:

#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

MATRIX: .space 256 // 256 = 8 x 8 x 4 = N x N x sizeof(int)

la $t0, MATRIX // carica indir elem MATRIX [0, 0]

lw $t1, ROW // carica varglob ROW

sll $t1, 5 // 2^5 = 8 x 4 = N x sizeof(int) allinea indice di riga

addu $t0, $t0, $t1 // calcola indir elem MATRIX [row, 0]

li $t2, 7 // carica cost 7

sw $t2, 24($t0) // 24 = 6 x 4 = indice colonna x sizeof(int)

AXO – prova 1 di giovedì 20 febbraio 2020 – CON SOLUZIONI pagina 14 di 14

Potrebbero piacerti anche