Soluzioni del capitolo 7.

Negli esercizi dal 30 in poi ci capisco veramente poco, ma a parte la difficoltà stessa,  il TLB e la memoria virtuale sono spiegati da far schifo. 

Exercise N° Result Comments
1 ciclo eseguito molte volte che carica dati in locazioni di memoria distanti tra loro
        addi	$5,$0,100
ciclo:	lw	$2,100($1)
	addi	$1,$1,100
	bneq	$0,$5,ciclo
	subi	$5,$5,1   <- delayed branch slot

    

 
2 ciclo in cui sono richiesti sempre gli stessi dati, che si trovano però in indirizzi di memoria distanti fra loro  
3 ciclo come nell'ese. 1 ma con    addi  $1,$1,4  
4 serie di   if .. then..else   
5 ciclo con alcune chiamate a procedure
ordina:
...
scambia:
...
for i=1 to n do
ordina
scambia
...
 
6 lunga serie di codice senza salti  
7 tutti MISS. 
Contenuto finale della cache: 4,17,6,43

Ho considerato una cache da 16 byte totali, ma va bene ad ogni modo, questo è facile.

 
8 6 hit.  
9  2^12+(1+16+4*32) = 593920 bit.
ho 12 bit che specificano l'indice, quindi ho 2^12 combinazioni, ovvero 2^12 blocchi. ( per gli elementi K = 10^3, per i byte K=2^10)
 
10 un confronto con un bit pari a 1 (se bit di validità è 1 allora la cella contiene un indirizzo valido)  
11 1 ciclo per inviare l'indirizzo, e questo c'è sempre, poi accedo alla memoria e prelevo una parola. Dato che devo trasportare in cache 16 parole devo fare 16 accessi sequenziali e ogni volta traferire il dato, che mi costa un altro ciclo, quindi

schema a)  1+16*10+16*1 = 177 cicli di clock

ogni volta che accedo alla memoria leggo 4 parole e le trasferisco 4 per volta, poichè il bus è più ampio. devo comunque accedere 4 volte alla memoria:

schema b) 1+4*10+4*1 = 45

ogni volta che accedo alla memoria leggo solo 4 parole, quelle sulla stessa riga ma su "banchi" diversi, però le devo trasferire una alla volta, quindi in totale 16 transazioni sul bus:

schema c) 1+4*10+16*1 = 57

NOTA: certo che mentre trasporto le parole sul bus, potrei accedere alla memoria  e intanto leggere le 4 parole successive, in effetti ripensandoci l'esempio del cap.8 chiede qualcosa di molto simile ma in questo esercizio non è richiesto. A quel punto mentre trasporto le prime 4 parole accedo alle seconde 4 e mi sarei avvantaggiato di 4 cicli:

1 + 1*10(prime 4 parole) + 4*1 (le trasferisco sul bus) + 3*6 (guadagno 4 cicli ogni volta) + 12*1 = 45,

per lo schema b) mi avvantaggio di un solo ciclo
1 + 1*10 + 1*1 + 3*9 + 3*1 = 42

 
12 schema a) CPI = 1,2+0,005*177 = 2,085

schema b) CPI = 1,425

schema c) CPI = 1,485

 
13 devo avere almeno 4 miss in C1 e 3 miss in C2

Una sequenza può essere: 16,17,20,24  => 4 miss in C1 e 3 miss in C2 e quindi cicli di clock C1 = 4*8 > 3*11

 
14 Sequenza possibile: 16, 33 , 16 (3 miss in C1 e 2 miss in C2)  
15 Non so che calcolo avevo fatto:

AMAT = 1 ciclo * 2ns + 0,05*(1+20) cicli * 2ns = 4,1 ns

ho considerato che 1 sia proprio il tempo di accesso alla cache, che è nel caso di hit, ma c'è anche in caso di miss, vabbè è una cavolata, lo so.

 
16  

AMAT = 1,2*2ns + 0,03*(1+20)*2ns = 3,66 ns

Quindi non conviene.

Intendo non conviene come prestazioni in generale, come AMAT conviene.

 
17 Non ho capito cosa chiede l'esercizio!
L'unica cosa: se devo avere la frequenza dipendente dal tempo di accesso alla cache, nel caso dell'ese. 16 dovrei abbassare la frequenza a 1/(1,2*2ns) = 416MHz contro i 500MHz dell'ese. 15.

Ma con tutti gli altri dati che ci devo fare? e 1,5 accessi alla memoria per istruzione cosa significa, dato che non specifica che tipo di organizzazione cache-memoria stiamo usando?

 
18 ---  
19 ---  
20 Ci saranno 8 insiemi di 2 elementi ciascuno. Per trovare la posizione dei blocchi devo fare:
(numero del blocco)  mod  ( numero di insiemi)

Cache set associative a 2 vie con blocchi di 1 parola e dimensione totale di 16 parole

sono 4 hit e 12 miss (hai lasciato un numero)

 
21 Con la cache completamente associativa ho un solo insieme di 16 elementi.  Ho ho gli stessi hit del caso precedente.  
22 Cache fully-associative 4  
23 Cache da 8 parole in totale, con blocchi di una parola. Nel caso che sia set-associative a 2 vie ho 4 insiemi, quindi per trovare la collocazione nella cache dovrò fare (indirizzo in word) mod 4.

Devo far in modo che gli indirizzi vadano tutti ad incidermi sullo stesso insieme, mentre nel caso che sia a corrispondenza diretta andranno ad incidermi in blocchi diversi. Prendo gli indirizzi:
4,8,12,5,9,13 assumendo di fare alcuni cicli.

4 mod 4 = 0 ; 8 mod 4 = 0;  12 mod  =  0;  quindi per la sostituzione di tipo LRU il 12 andrà a sostituirmi l'indirizzo 4, poi sarà la volta del 4 che sostituirà l'8.....

Cache set-associative vs direct mapped

 
24 insiemi = S/(B*A)

indice = log2(S/B*A)

TAG = k - log2(S/B*A) - 2 - A/2 - b
(cioè 2 offset in byte, A/2 riduzione per l'associatività, b offset all'interno del blocco)

bit totali = (TAG*A + 1 bit validità*A + B*A) * # insiemi 
 
25 si, no ,no. Ma non sono per niente sicuro.  
26    
27 cicli di clock di stallo per le istruzioni =
istruzioni * frequenza di miss per le I * penalità di miss

cicli di stallo per la memoria dati = (istruzioni * % di I di accesso alla memoria)  *  ( % di miss sui dati * penalità di miss)

C1ist = 0,28I   C1dati = 0,28I   Totale = 0,56 I
C2ist = 0,2I   C2dati = 0,25I   Totale = 0,45 I
C3ist = 0,2I   C3dati = 0,2I    Totale = 0,4 I

CPI ideale = 2 - 0,56 = 1,44

 
28
Misuro rispetto ad un processore P0 con CPI ideale = 1,44.
P0 è 1,38 volte più veloce di P1, 1,31 di P2 e 1,53 di P3.
P2 > P1 > P3

A proposito c'è un esercizio simile nel paragrafo Errori e trabocchetti a pag 543, ma non capisco perchè fa quel calcolo [penalità di miss assoluta/periodo di clock]

 
29
1) passo = 132  dopo i primi due miss ho tutti hit.
2) passo = 131  ho tutti miss.
3) con una cache set-ass a 2 vie dopo i due miss iniziali ho tutti hit in entrambi i casi (anche se i due accessi in memoria incidessero sullo stesso insieme non avrei problemi di conflict-misses)
 
30    
31
Cache TLB Memoria virt.
hit hit hit
miss hit hit
hit miss hit
miss miss hit
hit hit (imposs.) miss
miss hit (imposs.) miss
hit (imposs.) miss miss
miss miss miss
 
32 in questa parte non c'ho capito niente, tutti questi bit che a volte sono byte, ecc mi confondono: siamo sicuri che dica proprio "indirizzi virtuali di 40 byte". 

Un'altra cosa importante.
Poniamo di avere un indirizzo virtuale di 32 bit, con pagine di 4KB: nel libro assegna 12 bit per l'offset interno alla pagina e dice che 2^12= 4KB. Ma 2^12 fa 4096 bit, e non byte! o no?

ho detto una c....  12 bit identificano 4096 indirizzi di memoria, ciascun indirizzo è sempre espresso in byte, quindi è giusto come fa nel libro, 2^12 = 4KB.

 
33    
34    
35    
36    
37    
38    
39    
40    
41    
42    
43    
44    
45    
46    
47    
48 si aspetta, aspetta, ora lo fo!