Sei sulla pagina 1di 78

1

Caches
CALCOLATORI
ELETTRONICI LM
2
Cache
Per semplicit inizialmente supponiamo che vi sia un solo livello di
cache
La cache una memoria con un tempo di accesso di alcuni ordini di
grandezza inferiore a quello della memoria e di dimensioni molto
ridotte che contiene un sottoinsieme dei dati della memoria
La CPU, quando deve reperire un dato, tenta PRIMA di reperirlo
nella cache (hit) e poi, in caso negativo, nella memoria (miss)
Nella cache sono allocati non singoli bytes ma gruppi di bytes a
indirizzi contigui (normalmente 32 o 64 o 128 e comunque sempre
allineati): ciascuno di questi gruppi si chiama linea o blocco
PRINCIPIO DI LOCALITA SPAZIALE E TEMPORALE
WORKING SET
CPU
Registri
Cache I liv.
Cache II liv.
Cache III liv.
Memoria
Disco
Nastro
Cache
Cache
3
0
Memoria
32-256 byte
per blocco di dati
(linea di dati)
0
Cache
2
5
m
m+1
n
n+2
2
5
m
m+1
n
n+2
Tempo di accesso memoria >100 cicli di clock
Tempo di accesso cache : da 1 a 4 cicli di clock
Numero
blocco (linea)
Offset
nel blocco
Indirizzo emesso dal processore
Individuazione
posizione in cache
Linea
della cache
Dato
Blocco di dati
Numero della linea ovvero indirizzo
del byte di indirizzo pi basso del blocco
diviso per la dimensione del blocco di dati
Indirizzo del
blocco di dati
Il dato cui si accede in parallelo (RD o WR)
va dal byte alla dimensione blocco
4
Memorie associative
(Content Addressable Memories)
Memorie associative: contengono sia i dati che i loro indirizzi di
memoria (chiamati TAG ovvero cartellino)
Un dato NON viene reperito tramite una decodifica degli indirizzi
presentati alla memoria ma tramite il confronto fra tutti i numeri
dei blocchi (indirizzi) allocati nella memoria associativa e il
numero di blocco (indirizzo) del dato richiesto (confronto
combinatorio). Il confronto pu dare esito positivo o negativo
Numero del
blocco
Dati
Dati
Dati
Dati
Dati
Dati
Dati
Dati
Numero del
blocco
Numero del
blocco
Numero del
blocco
Numero del
blocco
Numero del
blocco
Numero del
blocco
Numero del
blocco
NB Una linea pu consistere anche di un solo dato !
5
Cache full-associative
315
TAG
0
Slot
1
Validit
7225 1 0
7226 2 1
57 m 1
88 n 1
Linea
Linea
Linea
Linea
Linea
Cache
Linea 0
Linea 1
Linea 2
Linea k
Linea w
Linea w+1
Linea z
Memoria
In ciascuna degli n slot pu essere inserita qualunque
linea (blocco allineato di n bytes) della memoria. Il
TAG il numero della singola linea
Esempio: memoria da 64GB (36 bit di indirizzo) con
linea da 256 bytes. Offset nella linea 8 bit.
Tag=36-8= 28 bit
256 bytes/linea
Numero
linea (28 bit)
Offset nel
blocco (8 bit)
Indirizzo emesso dal processore
Il numero di linea confrontato con tutti i TAG presenti nella cache per
verificare se HIT (e se il bit di validit e 1): loffset indica la posizione del primo
byte del dato richiesto dal processore allinterno della linea (pu riguardare
byte, word, double word etc. ma mai scavalcare il confine della linea). Sistema
che sfrutta al meglio la cache ma estremamente complesso dal punto di vista dei
comparatori (se la cache ha 1024 slots - ovvero cache da 256 Kbytes - sono
necessari 1024 comparatori da 28 bit)
La cache ovviamente
sempre composta di un
numero di slot multiplo di
due e altrettanto per la
dimensione della linea
Numero
della linea
(blocco di dati)
(Linea e blocco sono sinonimi)
Parallelismo 6
Cache directly mapped
Linea 0
Linea 1
Linea 2
Linea k
Linea w
Linea w+1
Linea z
Memoria
TAG
0
Slot
1
Validit
1 0
2 1
m 1
n 1
Linea
Linea
Linea
Linea
Linea
Cache
In ogni slot della cache pu essere allocato solo un sottoinsieme di
linee della memoria. Ad esempio nello slot 0 solo quelle che
cominciano a un indirizzo pari alla divisione del numero di linea della
memoria per il numero di slots della cache, nello slot 1 solo quelle che
cominciano a un indirizzo pari alla divisione del numero di linea della
memoria per il numero di slots della cache pi 1 etc.etc. Esempio:
memoria da 1 MB, linee da 128 bytes: 8000 linee. Cache da 64 linee.
Nello slot 0 le linee di numero 0, 64, 128, 192 etc.etc, nello slot 1 le
linee di numero 1, 65, 129, 193 etc.
Parallelismo 7
Linea 0
Linea 1
Linea 2
Memoria
Linea 3
Linea 4
Linea 5
Linea 6
Linea 7
Linea 8
Linea 9
Linea 10
Linea 11
Linea 12
Linea 13
Linea 14
Linea 15
TAG
0
Slot
1
Validit
1 0
2 1
Linea
Linea
Linea
Cache
3 1 Linea
Cache directly mapped
Un esempio
8
Cache directly mapped
Di fatto i bit successivi meno significativi del numero di linea indicano
lunico slot in cui la linea pu essere allocata. Esempio indirizzo del
processore a 36 bit (64 GB) , linea di 256 bytes (8 bit): il numero di
linea da 28 bit (quanti blocchi sono 2
28
- 2
10
x 2
10
x 2
8
?). E se la
caches da 1024 slots (quindi di dimensione 256KB) i 10 bit meno
significativi del numero di linea (index) indicano lo slot in cui la linea
pu essere allocata
Numero
linea (28 bit)
Offset nel
blocco (8 bit)
Indirizzo emesso dal processore
Offset nel
blocco (8 bit)
TAG (18 bit)
Slot
(10bit)
Un solo comparatore di minore complessit (18 bit) e un solo
decodificatore a 10 bit per lindividuazione dello slot il cui TAG
da confrontare
Molto poco flessibile
Index
Cache directly mapped
9
TAG DATI
Offset nel
blocco
TAG
Slot
Indirizzo emesso dal processore
Cache
In ogni slot pu essere inserito un solo blocco per ogni Index
Index
Cache
10
Un compromesso
Cache set-associative a pi vie
Set-associative a pi vie: vi sono pi possibilit per ogni index
N comparatori se n sono le vie. Parallelismo dei comparatori identico a
quello della cache directly mapped
Nelle caches directly mapped il dato pu essere reso disponibile prima
della verifica della validit e del TAG (salvo verifica ovviamente). Nelle
cache set-associative dopo la verifica del TAG
Talvolta meccanismi speculativi (si fornisce ad esempio il dato
corrispondente alla via 0 poi si verifica)
TAG DATI
Offset nel
blocco
TAG
Slot
Indirizzo emesso dal processore
11
Cache set associative
INDIRIZZO BLOCCO DI CACHE
Tag Index Offset Stato
Tag
Dato
Data
word
Hit/miss
Confronto dei TAG e selezione dei dati
sulla base del tipo di dato richiesto
dalla CPU (byte, word, DW etc.)
Via 0 Via 1 Via n
Via 0 Via 1 Via n
Via 0 Via 1 Via n
Via 0 Via 1 Via n
Riassumendo
12
In una cache fully associative una linea pu essere
allocata in qualunque slot della cache
In una cache directly mapped in un solo slot della cache,
quello individuato dall INDEX
In una cache set-associative in una qualsiasi delle vie
dello slot individuato dallINDEX
http://www.ecs.umass.edu/ece/koren/architecture/Cache/d
efault.htm
http://www.ecs.umass.edu/ece/koren/architecture/Cache/p
age3.htm
http://www.ecs.umass.edu/ece/koren/architecture/Cache/f
rame2.htm
13
Algoritmi di rimpiazzamento
Le caches hanno una dimensione limitate e quindi
necessario (allatto di un miss in lettura, ad esempio)
stabilire quale linea deve essere scartata (ovvero solo
sovrascritta se non modificata oppure riscritta in
memoria e poi sovrascritta se modificata)
Vi sono sostanzialmente tre possibile politiche: RAND
(Random), LRU (Least Recently Used), e FIFO (First In
First Out) le quali hanno efficienza e complessit diverse
RAND: in questo caso la rete logica di controllo deve
prima verificare se vi sono linee invalide (e quindi
rimpiazzare una di esse); in caso negativo, in base a un
generatore di numeri casuali (ad esempio uno shift
register retroazionato con un operatore EX-OR)
individuare una linea valida da rimpiazzare. Ovviamente
pu essere raffinato scegliendo prima fra le linee non
modificate e poi fra quelle modificate. Nonostante la ovvia
casualit di scelta ha un ottimo rapporto costo-
prestazioni
14
Algoritmi di rimpiazzamento
STACK: una rete speciale per ogni set. Ad ogni hit vogliamo che la via
colpita diventi la pi recente e le altre si spostino di rango di conserva
diminuendo di una posizione in termini di rango
Supponiamo che vi siano 4 vie e che nel set in questione tutte le linee di
cache siano valide. La via presente (il suo numero) in Ra pi recente di
quella in Rb che pi recente di Rc etc.
Na, Nb, Nc, Nd hanno i quattro valori delle vie ovvero 0,1,2,3 (non in
ordine)
Rx come Ra, Rb,Rc,Rd: registri a 2 bit
X: numero della via su cui si avuto un hit
Rd contiene il numero di via il cui dato deve essere rimpiazzato, per
il particolare set, in caso di miss (e il cui valore entra in tal caso in
Ra mentre gli altri traslano di una posizione). Insomma in caso di
miss si scarta Rd e la nuova linea viene messa in posizione Ra
traslando a destra tutte le altre
Na Nb Nc Nd
AND AND AND
CLK
X
Ex-OR Ex-OR Ex-OR
Ra Rb Rc Rd
15
Algoritmi di rimpiazzamento
Si supponga che lHIT avvenga per X= 2 e che i dati (ovvero il numero delle
vie) nei 4 registri, a partire da sinistra, siano rispettivamente 1, 0, 2, e 3.
Ovviamente 3 (contenuto del registro Rd) la via candidata al
rimpiazzamento in caso di miss. Il trasferimento a traslazione si ha fino a Rc
(che contiene 2) in quanto Rd NON riceve il clock. Dopo limpulso di clock si
ha quindi la situazione 2, 1, 0, 3 (in cui 3 rimasta la via candidata al
rimpiazzamento mentre le altre sono state correttamente aggiornate
posizionando la via numero 2 come pi recente)
Linvalidazione di una linea comporta il fatto che il suo valore sia allocato
in Rd e che le vie che erano precedentemente meno recenti (solo loro)
traslino a sinistra di una posizione. Il meccanismo perfettamente
simmetrico rispetto a quello dellhit. Ad esempio si supponga la
situazione di figura e venga invalidata la linea 0 che si trova in Rb. La 0
passa in Rd mentre la linea 2 passa in Rb e la linea 3 in Rc. A questo
scopo si deve aggiungere una ulteriore parte di circuito simmetrico a
quello di figura che condizione un clock di traslazione a sinistra fino al
posto in cui si trova la linea invalidata.
1 0 2 3
AND AND AND
CLK
X
Ex-OR Ex-OR Ex-OR
Ra Rb Rc Rd
2
16
CONTATORI: un contatore per ogni via di ogni set.
I valori dei contatori riflettono la posizione nellambito del
rimpiazzamento: 0-> pi recente, 3-> meno recente
Eventi
01) Hit sulla linea 0
02) Miss (line fill rimpiazzo la 2 - val. 3)
03) Invalidazione linea 1
04) Hit sulla linea 0
05) Invalidazione linea 3
06) Miss (line fill rimpiazzo la 3 val 3)
07) Hit sulla linea 2
08) Miss (line fill rimpiazzo la 2 - val. 3)
09) Miss (line fill rimpiazzo la 0 - val. 3)
10) Miss (line fill rimpiazzo la 3 - val. 3)
Validit
1 1 1 1
1 1 1 1
1 1 1 1
1 0 1 1
1 0 1 1
1 0 1 0
1 0 1 1
1 0 1 1
1 1 1 1
1 1 1 1
Nella maggior parte delle realizzazioni i contatori possono solo
essere resettati o contare in avanti. In caso di hit sono
incrementati i contatori di valore pi basso e resettato quello
della linea hit. In caso di miss si seleziona la linea con il
contatore pi elevato e poi si agisce come se su quella linea ci
fosse un hit.
In caso di invalidazione si porta a 3 la linea invalidata e sono
decrementati di 1 tutti contatori con valore pi elevato della
linea in questione
C0 C1 C2 C3
0 1 3 2
1 2 0 3
1 3 0 2
0 3 1 2
0 2 1 3
1 3 2 0
2 3 0 1
3 0 1 2
0 1 2 3
1 2 3 0
Stato finale
C0 C1 C2 C3
1 0 3 2
0 1 3 2
1 2 0 3
1 3 0 2
0 3 1 2
0 2 1 3
1 3 2 0
2 3 0 1
3 0 1 2
0 1 2 3
Stato iniziale
Algoritmi di rimpiazzamento
Si noti che lalgoritmo a contatori equivale a quello con i registri
a traslazione: l era la posizione spaziale e qui il conteggio che
determinano lespulsione: il numero della posizione spaziale
per equivalente al valore del contatore !
17
Algoritmi di rimpiazzamento
PSEUDO-LRU (per 4 vie)
I 4 elementi di un set sono indicati con I0, I1, I2 e I3
Se una linea e' non valida viene rimpiazzata.
Vi sono tre bit (B0, B1 e B2) per set
Se lultimo accesso al set stato a I0 o a I1 allora B0 =1
altrimenti B0=0
Se lultimo accesso alla coppia I0;I1 stato a I0 allora
B1=1 altrimenti B1=0
Se lultimo accesso alla coppia I2;I13 stato a I2 allora
B2=1 altrimenti B2=0
All'atto del rimpiazzamento:
La cache prima seleziona quale fra I0:I1 e I2:I3 ha avuto
laccesso meno recente (B0) e poi seleziona allinterno
della coppia (rispettivamente B1 o B2)
B0=0 ?
Si (I0:I1) piu' remoti No (I2:I3) piu' remoti
B1=0 ? B2=0 ?
Si No Si No
I2 I3
I0
I1 RIMPIAZZA
Lalgoritmo "pseudo in quanto I1 potrebbe essere pi remoto
ma offuscato da I0. Ad esempio se allinizio la sequenza di
riempimento stata I0, I1, I2, I3, un hit su I0 si porta dietro I1
(ovvero in ogni caso il rimpiazzamento successivo sia ha in I2 o
I3). A metodologia ovviamente applicabile anche a 8 vie. Quanti
bit sono necessari per ogni set ?
18
Algoritmi di rimpiazzamento
FIFO
In questo caso vi un singolo contatore modulo numero
delle vie per ogni set che viene incrementato, a partire dal
valore 0, per ogni miss in lettura (ovvero per ogni
rimpiazzamento effettuato). Linserimento viene effettuato
nella linea puntata dal contatore.
Se si suppongono tutte le linee inizialmente invalide si
inizia a inserire nella linea 0, poi 1 etc. e il contatore conta
0, 1, 2 3, 0 etc.
Lalgoritmo ha una singolarit nel fatto che non rispetta
esattamente il criterio laddove una linea venga invalidata.
Infatti se il contatore ha valore 3 e per qualche motivo si
invalida la linea 2 ovviamente la 2 (e non la 3) dovrebbe
essere la linea candidata al rimpiazzamento che quando
avviene porta il contatore al valore 0 (a causa
dellincremento). E comunque un evento a bassa
frequenza e si ha un ottimo rapporto costo-prestazioni
http://www.ecs.umass.edu/ece/koren/architecture/Cache/fr
ame1.htm
http://www.ecs.umass.edu/ece/koren/architecture/PReplac
e/
Ma allora cosa il TLB ?
19
Processore
Cache
RAM
Miss
Indirizzo
virtuale
Indirizzo
fisico
Hit
TLB
Dati
Il TLB non altro che una cache che anzich fornire dei dati di
memoria fornisce degli indirizzi di memoria (gli indirizzi fisici)
essendo indirizzata dagli indirizzi virtuali emessi dal processore
Il tempo di accesso del TLB analogo a quello della cache (primo
livello). Nei processori pi moderni il TLB a due livelli (come le
caches)
NB: i processori (teoricamente oggi) possono NON essere
impaginati. In tal caso il TLB ovviamente non esiste e gli
indirizzi virtuali coincidono con quelli fisici
Come ogni cache il TLB pu essere organizzato fully associative.,
directly mapped o set associative e valgono gli stessi problemi di
rimpiazzamento delle caches. Normalmente sono da 64-1024
slots spesso organizzate come 8 ways-associative
http://www.ecs.umass.edu/ece/koren/architecture/CacheTLB/inde
x.html
Cache indirizzate virtualmente
20
Processore
Cache
RAM
Miss
Indirizzo
virtuale
Hit
Dati
Cos facendo si risparmia un livello di indiretto (il TLB o peggio la
tabella della pagine ) ma:
Indirizzi virtuali diversi potrebbero essere mappati allo stesso
indirizzo fisico (per processi diversi necessario un tag nella cache)
e si ha quindi una duplicazione dei dati in cache e nel caso di
update bisogna aggiornate tutti gli slots che contengono il dato e la
cosa richiede un hw complesso. Oppure necessario svuotare la
cache ad ogni cambio di contesto (cosa assolutamente non
necessaria nel caso di caches indirizzate fisicamente)
21
Scrittura cache
Due politiche possibili:
Si : write-allocate
No: no-write-allocate
N.B.: scritture MOLTO meno frequenti della lettura e con
maggiore probabilit di indirizzi sparsi
In caso di miss si rimpiazzano i blocchi ?
Nel caso di write-allocate di fatto si opera con un read miss
seguito da una scrittura
Nellaltro caso semplicemente si scrive sul livello a valle senza
modificare la cache (fino alla memoria se non si trova nelle
caches)
Scrittura cache
22
E in caso di hit in scrittura ? Si scrive anche nel livello superiore?
Due politiche possibili
Si : write through
No: write back
Nel primo caso ove sia necessario un rimpiazzamento la linea e
semplicemente sovrascritta. Il dato modificato rimane nel a
valle. Nel caso di read-miss non ci sono riscritture in memoria
e il livello superiore ha sempre dati aggiornati
Nel secondo caso necessaria una riscrittura della linea nel
livello a valle (ad esempio la cache di II livello rispetto a quella
di I livello) prima di sovrascriverla. Si ha un traffico molto
inferiore (minore occupazione di banda) ma una gestione pi
complessa
Si ricordi che la linea una struttura indivisibile e quindi anche
se un solo byte ne stato modificato lintera linea deve essere
riscritta in memoria non essendo possibile identificare i bytes
modificati. Leventuale maggiore lentezza del livello a valle
(spesso la memoria) ha un impatto minore sulle prestazioni
Tutti i processori moderni usano il write back nella versione
write once che sar esaminata pi avanti
Si noti che la scrittura differita implica un bit di stato per ogni
linea con indicazione di modifica del dato (dirty bit)
Posted write
23
Molto spesso per ridurre limpatto del tempo di accesso del livello
superiore (nel caso si tratti di memoria) si usa la tecnica del posted-write
Processore
Cache
FIFO
RAM
Viene inserito un buffer di scrittura nel quale scrive senza ritardi il
processore (o la cache nel caso di riscrittura per rimpiazzamento) e
dal quale poi il controllore di memoria preleva i dati da scrivere in
memoria
Normalmente gli slots della FIFO sono 4 nel caso di figura. Se la
coda piena si aspetta !
In questo caso lacceso ai dati richiede anche unanalisi in tempo
reale del contenuto della FIFO per verificare se il dato richiesto non
si trovi proprio nella FIFO
Coerenza
24
Le caches hanno problemi di coerenza
Con questo termine si indica il fatto che ogni accesso da parte
di un qualsiasi agente deve garantire che il dato sia quello pi
recente.
La coerenza riguarda caches su processori diversi ma anche le
caches multilivello in un processore
Per semplicit si suppone che ogni processore abbia due livelli di
cache (L1 e L2) e poi la memoria. L2 sempre di dimensione
maggiore di L1. Supponiamo anche che le caches siano inclusive
ovvero che se un dato presente in L1 sia presente anche in L2
(ma non viceversa)
Il meccanismo comunque direttamente e facilmente estendibile
al caso di n-livelli
25
Politiche di Coerenza
Lettura
Come si garantisce che un dispositivo diverso dal processore (ad
esempio un DMA controller) legga dalla memoria il dato pi
aggiornato (se fosse il dato in cache il dato corrispondente in
memoria potrebbe essere vecchio - stale) ? Ricordiamo le politiche
di scrittura
Write-through
Per ogni scrittura (dato presente o meno nella cache) il dato viene
sempre scritto in memoria garantendo comunque la coerenza.
Ovviamente viene appesantito laccesso al bus
Write-through bufferato
Uguale al precedente ma con posted write chiamato anche deferred
write. Migliora lefficienza del processore (non deve aspettare il bus
fino a quando c una sola richiesta pendente) ma impegna
ugualmente il bus. Ovviamente nessun nuovo accesso al bus da parte
di altri dispositivi deve essere permesso fino alla scrittura del dato
(non facile e poco efficiente)
Write-back
In questo caso la memoria viene aggiornata dalla cache solo quando
necessario. Questo richiede la presenza di un registro dei dati
modificati nella cache. Di fatto si ha la necessit di interrogare la
cache per ogni accesso in lettura sul bus (ad esempio da parte di un
DMA controller) per sapere se essa contiene il dato e in caso positivo,
bloccare il ciclo di bus corrente, forzare la riscrittura del dato in
memoria da parte del processore e attendere che il dato sia riscritto
forzosamente nella memoria prima di concedere laccesso al master
alternativo.
26
Politiche di Coerenza
Scrittura
Cosa succede invece quando un altro master che scrive in memoria ?
Write-through
Il controllore di cache deve monitorare il bus del sistema e invalidare
nella cache eventuali dati sovrascritti in memoria (che fino a quel
momento erano identici a quelli in cache)
Write-back
Il controllore di cache deve monitorare il bus del sistema, e ove vi sia
un tentativo di scrittura di un dato presente in cache deve effettuare
le seguenti operazioni:
a) Se il dato modificato deve interrompere il ciclo di bus dellaltro
master, scrivere in memoria il dato presente nella cache e poi
invalidare il dato in cache. Si noti che la riscrittura comunque
necessaria anche in presenza di scrittura da parte dellaltro master
in quanto la linea composta da molti bytes e non possibile
sapere quali bytes sono stati modificati. Laltro master potrebbe
scrivere in bytes diversi da quelli modificati in cache. A questo
punto laltro master pu scrivere il proprio dato. Si noti che la
cosa necessaria in quanto in cache vi una linea intera e
potrebbero risultare modificati proprio uno o pi bytes che non
sono sovrascritti dallaltro master
b) Se il dato non modificato esso deve essere solamente invalidato
in cache
27
Politiche di Coerenza
con due livelli
L1 e L2 write-through
Per ogni scrittura del Processore (dato presente o meno nella cache) il dato
viene comunque scritto fino alla memoria garantendo comunque la
coerenza. Ovviamente viene appesantito laccesso al bus. La scrittura da
parte di L2 potrebbe essere deferred. In caso di scrittura da parte di altro
master invalidazione eventuale in entrambe le caches dei dati
corrispondenti
L1 write-through e L2 write-back
In questo caso L2 deve monitorare il bus e ove un altro master tenti di
leggere un dato deve riscrivere in memoria dati eventualmente
modificati prima della lettura. Nel caso poi di scrittura da parte di un
altro agente eventuali dati modificati nella cache L2 (in questo caso
sempre coerente con L1) vanno riscritti in memoria da parte di L2
(essendo write-back) e poi i dati riscritti in entrambe le caches sono
invalidati in quanto laltro agente li modifica.
N.B. il processore non ha nessuna nozione della presenza di una cache
secondaria (e analogamente per una cache secondaria nei confronti
di una eventuale cache di III livello)!!!! I segnali che scambia con il
mondo esterno sono gli stessi in presenza o assenza della cache
secondaria ! Nei due casi controllore di memoria e controllore di
cache secondaria debbono fornire e ricevere i segnali appropriati.
Come si garantisce che un altro agente diverso dal processore (ad
esempio un DMA controller) legga dalla memoria il dato pi aggiornato
(se il dato fosse in cache, il dato corrispondente in memoria potrebbe
essere vecchio ovvero stale) ?
28
Politiche di Coerenza
con due livelli
L1 e L2 entrambe write-back
Quando il processore legge un dato (line fill) a causa di un miss
interno in L1, L2 verifica se ha il dato al suo interno. In caso
positivo fornisce il dato. Ovviamente se il dato presente in L2, il
dato cacheable (cio pu essere portato nella cache del
processore). Se invece il dato non presente in L2, L2 richiede il
dato al controllore di memoria MC - (anchesso ignaro se la
richiesta provenga dalla cache del processore o da L2 ovvero
stessa interfaccia). Se il dato cacheable si ha un line-fill
contemporaneo in L1 e L2. In caso contrario non si ha line fill in
nessuna cache (ma solo lettura del dato richiesto)
In caso di scrittura da parte del processore con L1 e L2 entrambe
write-back vi sono vari casi che dipendono se il sistema mono o
multiprocessore: in ogni caso necessario che il sistema garantisca
sempre laccesso ai dati pi recenti.
PROTOCOLLO MESI
29
M.E.S.I. (scrittura)
(monoprocessore - write back)
M modified (L1 e L2)
La linea presente nella cache e ivi stata modificata senza essere stata
riscritta sul dispositivo a valle (L2 per L1, memoria per L2) ovvero
contiene un dato pi recente rispetto al dispositivo a valle. La scrittura
provoca transito da M a M senza ciclo a valle
E exclusive (L1 e L2)
La linea presente identica nella cache e nel dispositivo a valle (L2 per
L1 e la memoria per L2) ma non stata modificata (ovvero il suo
contenuto coincide rispettivamente con quello presente a valle). La
scrittura provoca transito da E a M senza ciclo a valle.
S shared (stato possibile solo per L1, nel monoprocessore)
La linea presente nella cache L1 (e in quella L2 con valore identico
anche a quello nella memoria ovvero stato E). La scrittura provoca
una scrittura anche a valle su L2 (e non scrittura in memoria), transito
da S a E per L1 (quindi alla successiva scrittura non deve scrivere a
valle) e transito da E a M per L2. L2 nel mono processore non mai in
stato shared perch non c nessun processore esterno al sistema in
questione da avvertire in caso di scrittura (v. caso multiprocessore)
I invalid (L1 e L2)
La linea non disponibile nella cache e una lettura provoca un line fill
(se la linea cacheable). Una scrittura provoca un write-through senza
scrittura sulla cache (no write allocate)
N.B. La cache del codice pu essere solo S o I
(Si ricordi che L2 per L1 equivalente alla memoria ovvero
L1 NON cosciente della presenza di L2 !!!)
Lo stato iniziale delle linee di caches sono pilotate da segnali esterni
ricevuti dal dispositivo che segue in cascata (L2 per L1, Mem,Cntr. per L2).
30
Possibili Stati
di una stessa linea
L2 L1
I I
M
E
M
Non presente
E
S
Non presente
Caso monoprocessore
NB: Non presente: dato non presente in quanto caches inclusive
L2 mai shared nel caso monoprocessore !!!
L1 sempre in uno stato correlato a quello di L2 (e pi
restrittivo). Per uno stesso dato L1 NON pu essere in stato M se
anche L2 non in stato M
31
Politiche di Coerenza
(L1 e L2 write back)
Nel caso monoprocessore un line-fill carica il dato in L1 e L2 e il
dato assente in entrambe le caches. L1 viene portato in stato S
(tramite opportuno segnale proveniente dal controllore di memoria
per L1 attivo) e L2 in stato E.
Una successiva scrittura in L1 (che cos si porta in stato E)
sovrascrive (a causa dello stato S) anche L2 (che si porta in stato M)
ma non in memoria.
Una successiva scrittura scrive solo in L1 che si porta anchessa in
stato M.
NB: poich la dimensione di L1 inferiore a quella di L2 possibile
che a causa di un rimpiazzamento di un dato in L1 quel dato si trovi
ancora in L2 (E o M). Un nuovo line fill dello stesso dato in L1 porta
L1 rispettivamente a S o a E
1) Nel prosieguo si suppone che le caches siano inclusive ovvero la
cache primaria contiene sempre un sottoinsieme del dati della
cache secondaria. Il MESI pu comunque funzionare anche in
caso di cache non inclusive
2) Lo stato della cache primaria sempre pi restrittivo o uguale a
quello dello cache secondaria rispetto alla scrittura
32
Politiche di Coerenza
(monoprocessore)
Una lettura da parte di un master alternativo sul bus con il MESI
deve ricevere sempre il dato pi recente. Se L2 in stato E (siamo
nel caso monoprocessore) allora ove il dato sia presente in L1 in
stato S (oppure non c NON pu essere in Exclusive)) e quindi il
dato in memoria quello pi recente. Se lo stato di L2 M una
lettura al dato provoca una verifica (snoop) da parte di L2 in L1 per
verificare se presente e con un valore pi recente (stato M). Il dato
pi recente scritto in memoria. Alla fine delle operazioni si avr L1
in stato S e L2 in stato E.
Una scrittura da parte di un master alternativo provoca un
enquiry da parte del Memory Controller su L2. Se L2 in stato E
(e quindi il dato in L1, se presente, in stato S) si invalidano L1 e
L2. Se L2 in stato M, L2 verifica a sua volta se vi una versione
pi recente del dato in L1 (ove presente). La versione pi recente
del dato viene scritta in memoria permettendo poi laccesso al
master alternativo. L1 e L2 vengono portate in stato I.
In ogni caso laddove sia necessaria una riscrittura da parte delle
caches L1 o L2 questa avviene prima dellaccesso in lettura o
scrittura del master alternativo.
Casi in cui il dato letto o scritto da un master alternativo (privo di
cache propria ex DMA) si trovi in una delle due caches
33
COERENZA READ del PROCESSORE -
ANALITICO
Solo DMA (che non ha CACHE !!!)
Monoprocessore
1) Miss in L1 e non in L2. Line fill da L2 a L1. Lo stato di L1 dipende
dallo stato di L2 (che viene trasmesso a L1). Se L2 in stato exclusive,
L1 va in stato shared; se L2 in stato modified L1 va in stato exclusive
(v. scrittura). Non esiste il caso dato presente in L1 e non in L2
2) Miss in L1 e L2 -> doppio line fill. Il dato in L1 e shared e in L2
exclusive
N.B. Se L2 in stato exclusive nel caso di miss in L1 il dato letto in
stato shared altrimenti nel caso di scrittura dello stesso dato su
L1 si avrebbe un passaggio in stato modified di L1 senza
riscrittura su L2. In caso di accesso al dato da parte di agente
esterno il controllore di memoria interrogando L2 scoprirebbe
che ha un dato uguale alla memoria e quindi permetterebbe
laccesso allagente esterno a un dato che invece stale. Il
meccanismo di interrogazione recursiva si ferma in questo caso
(in altri casi no) quando il dato a un livello inferiore uguale a
quello del livello superiore. Da cui la restrizione sugli stati
indicata precedentemente
34
COERENZA WRITE del PROCESSORE -
ANALITICO
Solo DMA (che non ha CACHE !!!)
Monoprocessore
1) Miss in L1 e L2: lettura dalla memoria in L1 e L2 e poi scrittura
in L1 e L2, stato di L2 finale modified e stato di L1 exclusive
2) Miss in L1 e non in L2. Lettura da L2 a L1 e poi scrittura in L1 e
L2 . Stato finale come il punto precedente (1)
3) Hit in L1. Tre casi
a) L1 shared (e quindi L2 exclusive). Scrittura su L1 e L2, L2
passa in modified e L1 in exclusive.
b) L1 exclusive (e quindi necessariamente L2 gi modified).
Scrittura solo su L1 che passa in stato modified
c) L1 modified (e quindi L2 modified): identico al punto b
35
COERENZA READ/WRITE
del DMA
Lettura da parte del DMA
1) Miss in L1 e L2 oppure HIT con LI e L2 entrambi non
modified: NOP
2) Hit in L1 modified (e quindi L2 modified): riscrittura di L1 in
memoria e su L2. L1 passa in shared e L2 in exclusive (DMA
non ha cache !!!)
3) Hit in L2 modified (e L1 exclusive oppure dato non presente in
L1): riscrittura di L2 in memoria. L2 in stato exclusive e, se
dato in L1 (exclusive), L1 passa shared
Scrittura da parte del DMA
1) Miss in L1 e L2: NOP
2) Hit in L2 ed eventualmente in L1 entrambi non modified:
invalidazione di L2 ed eventualmente di L1
3) Hit in L2 e L1 (in stato modified): riscrittura in memoria di L1
e invalidazione di L1 e L2
4) Hit in L2 (modified) con L1 exclusive: riscrittura di L2 e
invalidazione di L1 e L2
SNOOP in entrambi i casi !
36
M.E.S.I. (multiprocessore)
M modified
La linea presente solo nelle caches del processore in questione e nella
cache specifica stata modificata senza essere stata riscritta nel
dispositivo a valle (differisce dal dispositivo a valle). Alla linea si pu si
pu accedere in lettura e scrittura senza ciclo di bus a valle
E exclusive
La linea presente solo nelle caches del processore in questione e il
contenuto nella cache specifica coincide con quello del dispositivo a
valle. Alla linea si pu si pu accedere in lettura e scrittura senza ciclo
di bus a valle. Una scrittura la fa transitare in stato M.
S shared
La linea potenzialmente presente in pi caches anche di pi
processori. (Potenzialmente in quanto poteva essere presente in due
processori e poi uno dei due ha dovuto rimpiazzarla). Una scrittura
sulla cache specifica causa una scrittura anche a valle e invalida la
stessa linea nelle caches di altri processori, se presente
I invalid
La linea non disponibile nella cache e una lettura provoca un LINE-
FILL. Una scrittura provoca un WRITE-THROUGH se non write-
allocate oppure una lettura seguita da scrittura se write-allocate
37
Possibili Stati
di una stessa linea
Caso multiprocessore
L2 L1
I I
M
E
M
Non presente
E
S
Non presente
S
S
Non presente
1) In generale nel caso di caches multilivello una cache a livello
inferiore contiene un sottoinsieme dei dati della cache a livello
superiore (cache inclusive)
2) Lo stato della cache a livello inferiore sempre pi restrittivo o
uguale a quello dello cache superiore rispetto alla scrittura
38
COERENZA READ
Multiprocessor (solo L1 e L2)
1) Miss in L1 e non in L2.
Se L2 shared o exclusive L1 legge la linea in shared
Se L2 modified, L1 passa in exclusive.
NB: Come nel caso monoprocessore ma si noti che in questo caso
per possibile che LI e L2 siano o diventino entrambi shared
(mentre nel caso mono processore L2 NON mai in stato S)
39
COERENZA READ
Multiprocessor
2) Miss in L1 e L2 . Si ha uno snoop sul bus
Il dato non in nessuna cache e quindi si ha un doppio line
fill. L1 in stato shared e L2 in stato exclusive
(analogamente al caso del solo DMA)
Il dato presente in qualche altra cache non modificato
(shared o exclusive) . Durante lo snoop le caches colpite
vengono tutte portate in stato shared. Il dato letto in L1 e
L2 del processore richiedente entrambe in stato shared
Il dato presente nelle caches di un solo processore e in
stato modified (un dato pu essere modified in un solo
processore !!!). Back-off sul bus, riscrittura in RAM,
caches colpite entrambe in stato shared. Il dato poi
letto in L1 e L2 del processore richiedente in stato shared.
Se un dato era modified in una L1 scritto anche sulla
corrispondente L2
N.B. uno snoop sul bus consiste in uno snoop sulle L2 che a loro
volta lo rimbalzano sulle L1 ove siano in stato modified
40
COERENZA WRITE
Multiprocessor
1) Miss in L1 e L2.. Tre casi:
a) Il dato non in altre caches: come nel caso monoprocessore
b) Il dato presente in altre caches non modificato. Invalidazione
del dato in tutte le caches che contengono il dato e poi come
nel caso monoprocessore (lettura del dato in L1 e L2 e poi
scrittura solo sulle caches). Alla fine L1 exclusive e L2 modified
c) Il dato presente in un altro processore modificato. Back-off
del bus, riscrittura del dato modificato e poi invalidazione
delle caches del processore coinvolte (si ricordi che sia L1 che
L2 possono essere in stato modified). Si noti che la riscrittura
della intera linea modificata avviene in tutti i casi esaminati
poich la scrittura attuale potrebbe riguardare anche un solo
byte della linea e il dato deve essere letto dalle caches per
potere essere modificato Poi come nel caso monoprocessore,
Quindi in ogni caso alla fine L2 modified e L1 exclusive. Si
sarebbe potuto scrivere il dato anche in memoria )e in tal caso
L1 Shared e L2 Exclusive ma sarebbe costato un ciclo di
memoria inutile tempo perso)
2) Miss in L1 e non in L2.
Il dato presente in L2 passa in L1 e viene scritto
Tre casi
L2 exclusive. Scrittura su L2 che passa in stato modified senza
snoop sul bus e L1 in stato exclusive.
a) L2 modified. L2 resta modified e L1 modified
b) L2 shared. Snoop con invalidazione sul bus poi lettura in L1 e
L2 e scrittura delle caches: alla fine L1 exclusive e L2 modified
41
COERENZA WRITE
3) Hit in L1 (e quindi anche il L2). Tre casi:
a) L1 in stato modified. Scrittura solo in L1
b) L1 in stato exclusive. Scrittura solo in L1 che passa in
modified
c) L1 in stato shared. Due casi:
I. L2 in stato shared. Snoop con invalidazione sul
bus, poi scrittura su L1, L2 e scrittura nelle
caches. Alla fine L1 exclusive e L2 modified
I. L2 in stato exclusive. Niente snoop sul bus e
scrittura in memoria, scrittura su L1 e L2 che
passano rispettivamente in exclusive e modified
N.B. non si pu dare il caso di L1 shared e L2 modified, per
come strutturato il MESI (in quanto un dato shared
in L1 solo dopo una lettura e prima di qualsiasi
scrittura e in tal caso L2 pu essere solo in stato shared
o exclusive)
N.B. in alcune realizzazioni la scrittura, quando non confinata
allinterno di caches di un processore che da solo detiene il dato,
viene anche ribaltata sulla memoria: quale lo stato finale in
questo caso di L1 e L2 ?
42
Altre politiche di coerenza
P
M
C
I/O
P
M
C
I/O
P
M
C
I/O
P
M
C
I/O
MC
Protocollo di coerenza directory based
La memoria complessiva data dalla somma delle
memorie presenti nei vari sottosistemi pi quella
solitaria
Anzich un protocollo distribuito (come nel caso del
MESI ove le informazione sui blocchi risiedono
distribuite in tutte le caches che ne hanno una copia) le
informazioni su ogni blocco di memoria risiedono in un
direttorio associato a ogni blocco e allocato presso la
memoria cui fa riferimento
Lo scopo quello di avere le informazioni relative alla
condivisione per ogni blocco allocate in una singola
locazione evitando tutto il traffico broadcast tipico del
MESI. Problematica presente nel caso di molti bus (v.
QuickPath alla fine del corso)
Utilizzato nei moderni processori (dove coesiste con
laltro)
(Memoria comune solitaria)
43
Protocollo directory based
MC
M
P1
C1
I/O
D
M
P2
C2
I/O
D
M
P3
C3
I/O
D
M
P4
C4
I/O
D
D
Direttorio
In questo modello si assume il caso pi generale di un sistema con
memorie doppia porta su ogni processore pi una memoria
centrale
Ogni processore pu accedere a ognuna delle memorie che hanno
un indirizzamento globale (si tratta quindi di ununica memoria
distribuita fisicamente su pi siti)
Ogni direttorio (D) collegato alla porzione di memoria cui fa
riferimento ed allocato corrispondentemente (la sua posizione
dipende quindi dai bit pi significativi dellindirizzo del singolo
banco)
Cache (anche multilivello)
44
Protocollo directory based
Un QUALSIASI protocollo di coerenza ha due operazioni principali da gestire:
read miss e scrittura su un blocco shared (a parte le invalidazioni, le altre operazioni
read hit e scrittura su blocco esclusivo sono relativamente prive di conseguenze a
livello globale)
A questo scopo un direttorio deve contenere informazioni sullo stato di ogni linea e
in particolare:
Shared: uno o pi processori hanno la loro linea nella loro cache,
coerente con la memoria
Non cached: nessun processore ha la linea nella propria cache
Modificata: Solo un processore ha la linea nella propria cache che
stata ivi modificata e la copia in memoria non coerente. In questo caso
il processore in questione chiamato il possessore (unico) della linea
(Si noti che in questa visione una linea di possesso esclusivo o modificata sono
assimilate)
Il direttorio deve contenere non solo lo stato della linea ma anche lelenco dei
processori che hanno la linea nella loro cache (per invalidarle in caso di scrittura)
Normalmente la cosa si realizza con un vettore in cui ogni bit indica se la linea
presente nel corrispondente processore. Lo stesso vettore viene normalmente usato
per indicare il processore possessore unico della linea (se esiste) Se la linea
presente in pi processori lo stato ovviamente shared e quindi pu essere letta
direttamente. Se la linea presente in un solo pu essere in stato modified o non-
modified: quando una linea viene modificata in una cache manda prima un
messaggio di invalidazione al nodo home per invalidare la liena nelle altre caches,
Ovviamente se si tratta di lettura la linea passa in shared in entrambi i processori
mentre se viene scritta il possessore diventa il processore che scrive e nella cache
del vecchio processore la linea diventa invalid.
Le modalit di transizione fra gli stati sono ovviamente identiche a quelle del
MESI ma diversa il meccanismo attuativo. Nel caso MESI vi un broadcast
mentre in questo caso si ha una comunicazione fra nodo richiedente e direttorio ed
eventualmente in seguito fra direttorio e nodi remoti che contengono la linea.
Ovviamente si ha un beneficio se i bus di comunicazione sono pi di uno !
45
Definizioni
Nodo locale: nodo da cui si origina la richiesta
Nodo home: il nodo in cui risiedono la memoria che contiene la
linea coinvolta e il relativo direttorio. Ovviamente nodo locale
e nodo home possono coincidere (richiesta locale di linea)
Nodo remoto: un nodo che contiene un copia della linea o in
modo esclusivo o in modo condiviso. Pu coincidere o con il
nodo locale o con il nodo home. Lunica differenza che i
messaggi avvengono allinterno del nodo anzich fra nodi
MC
M
P
C
I/O
D
M
P
C
I/O
D
M
P
C
I/O
D
M
P
C
I/O
D
D
L
L
L
Home Remoto
Locale
Se nel nodo
remoto la
linea
modificata
bisogna
recuperarla
(read) o
invalidarla se
riscrittura
su altra
cache
(write)
Da locale a direttorio e da
direttorio home a remoto(i)
L=linea in questione
46
Messaggi (write allocate)
Messaggio
Sorgente Destinazioni Contenuto Funzione
Read miss Cache
locale
di un
proc.
Al direttorio
home
P,A Il processore P ha un read miss
allindirizzo A; Richiede i dati e
diventa uno sharer (viene
aggiunto alla lista)
Write miss Cache
locale
di un proc
Al direttorio
home
P,A Il processore P ha un write miss
allindirizzo A; Richiede i dati e
diventa possessore (owner)
Invalidazione
locale
Cache
locale
di un proc
Al direttorio
home
A Invalidazione di tutte la caches
che hanno la linea con
lindirizzo A
Invalidazione
cache remota
Direttorio
home
Cache
remota
A Invalidazione di una copia
shared della linea che contiene
lindirizzo A
Lettura Direttorio
home
Cache
remota
A Lettura della linea con indirizzo
A (che diventa shared) e
trasmissione al nodo home
Lettura con
invalidazione
Direttorio
home
Cache
remota
A Identico al precedente con
invalidazione (ex. per write)
Invio dati Direttorio
home
Cache
locale
D Lettura di un dato dalla memoria
home e trasmissione alla cache
richiedente
Write back Cache
remota
Direttorio
home
A,D Write back di un valore D
modificato per lindirizzo A
(rimpiazzamento o lettura home
[porta a stato shared])
P: numero del processore, A: indirizzo del dato in memoria
D contenuto della linea
Sovrapposizione accessi
47
Se la dimensione in bit del numero di pagina virtuale coincide con la dimensione in
bit del TAG della cache (il che non sempre vero dipende dalla dimensione della
cache) si pu tentare di accedere contemporaneamente al TLB (con il numero di
pagina virtuale) e alla cache (individuando lo slot della cache tramite lindex). Il
TAG del dato in cache (che in questo caso coincide con il numero di pagina fisica)
viene confrontato con il numero di pagina fisica estratto dal TLB per la verifica
dellhit. Ovviamente in cache vi solo una possibile porzione della pagina. La
cache in questo caso deve avere un numero di slots che moltiplicati per la
dimensione del blocco eguagliano la dimensione della pagina. Normalmente invece
prima via TLB si cerca lindirizzo iniziale della pagina fisica e poi si cerca nella
cache se lindirizzo presente- Quindi tutto dipende dalla dimensione del TAG
nella cache e quindi dalla dimensione della cache
Esempio: se pagina da 128 KB e le linee sono da 64 Bytes gli slots necessari sono
128k/64= 2K. Se la cache a 8 vie si ha che la dimensione complessiva della cache

64 * 2K * 8 (vie) = 1MB
Ovviamente il tutto condizionato dalla validit sia del TLB che
dello slot della cache (o di una via nel caso set associative) e dal
HIT nel TLB
Offset blocco
Slot
index
Pagina virtuale
Offset in pagina
Indirizzo virtuale
TLB
Cache
Pagina fisica= TAG della cache
TAG
Comparatore
Index
Pagina virtuale
Dati nelle caches
Parallelismo 48
Ci sono due tipi di caches: suddivise e unificate. Si dicono
suddivise quelle che contengono o solo dati o solo istruzioni
e unificate quelle che contengono indifferentemente dai e
istruzioni
Nei processori moderni sono per lo pi suddivise quelle di
primo livello (architettura Harward) e unificate quelle di
livello superiore
49
R2000/R3000 - RISC
(DLX reale)
IF/ID ID/EX EX/MEM MEM/WB
IF ID EX MEM WB
I
Cache
D
Cache
Memoria
Architettura Harvard
Pipeline split-cycle (fasi 1 1 1 1 e 2) 2) 2) 2)
IF
ID
EX
MEM
WB
1 1 1 1 Traduzione indirizzo virtuale TLB
2 2 2 2 Accesso alla I-Cache (indirizzamento) - Ovviamente se hit
1 1 1 1 Lettura della istruzione e check parit
2 2 2 2 Lettura registri se Branch calcolo indirizzo destinazione
1 1 1 1 Inizio operazione ALU se Branch verifica salto
2 2 2 2 Fine op. ALU se Load/Store traduzione indirizzo virtuale (TLB)
1 1 1 1 Accesso alla D-Cache (se write) (indirizzamento)
2 2 2 2 Trasferimento dati dalla D-Cache (se read check parit)
1 1 1 1 Scrittura del Register File
2 2 2 2
Normalmente la condizione di Branch verificata alla fine di EX
quando gi altre due istruzioni successive sono iniziate. In questo caso
per il test viene fatto in 1 11 1 e lindirizzamento della I-cache in 2 22 2
( (( (allindirizzo di destinazione e quindi una sola istruzione di penalit,
quella nello stadio ID)
1 2 2 2 2 1 2 2 2 2 1 2 2 2 2 1 2 2 2 2 1 2 2 2 2
Feedback Branch
Dati
Indirizzi fisici
Parametri dinamici delle caches
Parallelismo 50
Hit rate (= 1 - Miss rate): frequenza di accessi con successo
Average Memory Access Time (AMAT):
Hit time + Miss rate x Miss penalty
Miss penalty: tempo di accesso al livello superiore + tempo di
trasferimento del blocco
51
Metodologia speculativa
Si predice un hit e si legge il dato senza attendere il controllo del
Tag (la cosa non ovviamente possibile in scrittura). Verifica
dopo la lettura
Si utilizza nella pipeline il dato letto nella cache e intanto si
controlla il Tag (anche nel DLX pipelined con cache).
Ovviamente ripristino in caso di errore . Funziona molto bene
con le cache directly mapped ma pone dei problemi con le caches
set-associative (quale via scegliere ?). Normalmente si hanno dei
meccanismi statistici per indicare la via pi probabile
E normale avere pi richieste contemporanee (outstanding):
processori superscalari e accesso ai livelli superiori in caso di
miss
Se errore (miss predetto come hit), svuotamento e recupero
nella pipeline
Si effettua un prefetch delle istruzioni (v. 8088/8086)
Molto dipende anche dal compilatore (ovvero dalla sequenza
delle istruzioni)
Accelerazione delle caches
Accelerazione delle caches
52
Altri metodi
Uso di caches directly mapped (massima velocit) e impiego
di un buffer di n-slots (tag+dati) in cui mantenere le ultime n
linee scartate
Allatto di un miss si carica nella cache dalla memoria la
linea richiesta e in un buffer (stream buffer) la linea
successiva dalla memoria. Al miss successivo si controlla per
prima cosa lo stream buffer (sistema valido solo se la
larghezza di banda della memoria superiore alle necessit)
Accelerazione delle caches
53
Cache write-through: la scrittura in memoria avviene
normalmente per posted-write. In caso di miss (ovvero se il dato
non in cache verificare che non sia nella coda di scrittura)
analisi dei buffer di posted-write
Cache write back: prima si deve riscrivere (linea dirty) e poi si
legge. Appoggiare la linea da riscrivere a un buffer esterno
(ancora tecnica posted-write)
Nel caso di miss non aspettare il caricamento completo del blocco
ma non appena disponibile il dato necessario alla CPU
fornirglielo e completare poi il caricamento del blocco.
Ovviamente questo implica una complicazione della cache
54
Caso favorevole (il pi comune, normalmente ben oltre il
95%): cache hit. Elementi da tenere comunque in
considerazione
1. Organizzazione della pipeline (dove viene interrogata)
v. caso del DLX
2. Politica di recupero in caso di predizione errata dei
branches ( gi stata scritta la cache ? )
3. Tempo di latenza nel caso di cache hit
a) Impatta sul clock della pipeline normalmente per il
15% a parit di tecnologia
b) Per non impattare troppo sul periodo di clock si
effettua l accesso in pi cicli . Tipicamente tempo
di accesso da 1 a 3 cicli per la L1 e numero
maggiore per gli altri livelli. Questo presuppone che
le pipelines siano pi di una per evitare stalli
drammatici
Efficienza delle caches
55
Caso sfavorevole: cache miss. Elementi da tenere in
considerazione
1. Recupero dal livello successivo. Se livelli multipli
la cosa si svolge in modo recursivo
2. E nel frattempo ? .. Out Of Order (v. P6)
3. Tempo di verifica miss: 1 o pi cicli
4. Individuazione vittima (linea da rimpiazzare):
1 o pi cicli
5. Write back se la linea modificata (linea dirty)
6. Richiesta al livello successivo: vari cicli
7. Trasferimento dal livello successivo: vari cicli. Il
tempo complessivo dipende dalla dimensione del
blocco e dal parallelismo del bus
8. Caricamento del dato rimpiazzato e
aggiornamento del tag: 1+ cicli
9. Restart della esecuzione
10. In pratica: da 6 a centinaia di cicli
Miss
56
Il tempo di latenza in caso di hit determinato
da:
Organizzazione della cache
Associativit
Check parallelo dei tags costoso
(molti comparatori a molti bits)
Selezione della via (fan-in,
lunghezza linee elettriche)
Dimensione di blocchi
La selezione di word pu essere
lenta (fan-in, connessioni)
Numero di blocchi (set x
associativit)
Ritardo dei fili nellarray
ovvero:
1) Ritardo di linea di parola:
larghezza
2) Ritardo di linea di bit :
altezza
Tempo di accesso (hit)
Linea word
Linea
bit
Dato
Ritardo crescente
R
i
t
a
r
d
o

c
r
e
s
c
e
n
t
e
Distanza Manhattan larghezza + altezza
Problematiche di modellazione analogica dei circuiti e delle
interconnessioni
57
Compulsory
Il primo accesso a qualunque blocco (linea) di memoria
(cold start misses o first-reference misses ). Il primo
accesso. Per definizione a un blocco non presente nella
cache con tutti i problemi correlati
Capacity
La cache non in grado di contenere tutti i blocchi
necessari allesecuzione di un programma ovvero il
working set maggiore della capacit della intera cache.
Ne deriva che un blocco viene scartato per essere poi
richiamato subito dopo (limitazione globale riguarda la
dimensione globale della cache)
Conflict
Le restrizioni sulla allocazione in cache (se non full-
associative): index uguale per un numero di blocchi
contemporaneamente utilizzati superiore alla
associativit (collision misses). Di fatto si obbligati a
scartare blocchi che immediatamente dopo servono
(limitazione locale riguarda la associativit del singolo
set)
Le tre C che impattanto sulla
frequenza di miss
Compulsory Capacity - Conflict
Ottimizzazione
Come impatta la dimensione dei blocchi?
Aumento della dimensione: riduzione dei misses compulsory (meno
problematiche di primo accesso - sfrutta il principio di localit accessi
successivi probabili nello stesso blocco). Insomma vi minore
probabilit di dovere iniziare un blocco nuovo. Di converso nascono
problemi di capacit se il blocco diventa troppo grande
La scelta della dimensione dipende anche dalla latenza (tempo per
raggiungere il blocco) e dalla banda di trasferimento. Per latenza
grande e banda grande pu essere ragionevole e aumentare la
dimensione del blocco (e viceversa) fermi restando i limiti di cui al
punto precedente
Blocchi di dimensione pi piccola a parit di dimensione della cache
riducono ovviamente il rischio di conflitto (numero maggiore di indici
ma pongono problemi di compulsory misses)
58
Compulsory Capacity - Conflict
Statistiche - % Miss
59
Cache KB Assoc. Tot. Miss Compuls. Capacity Conflict
4 1 0.098 0.0001 0.070 0.027
4 2 0.076 0.0001 0.070 0.005
4 4 0.071 0.0001 0.070 0.001
4 8 0.071 0.0001 0.070 0.000
8 1 0.068 0.0001 0.044 0.024
8 2 0.049 0.0001 0.044 0.005
8 4 0.044 0.0001 0.044 0.000
8 8 0.049 0.0001 0.044 0.000
16 1 0.049 0.0001 0.040 0.009
16 2 0.041 0.0001 0.040 0.001
16 4 0.041 0.0001 0.040 0.000
16 8 0.041 0.0001 0.040 0.000
32 1 0.042 0.0001 0.037 0.005
32 2 0.038 0.0001 0.037 0.000
32 4 0.037 0.0001 0.037 0.000
32 8 0.037 0.0001 0.037 0.000
64 1 0.031 0.0001 0.028 0.008
64 2 0.030 0.0001 0.028 0.003
64 4 0.029 0.0001 0.028 0.001
64 8 0.021 0.0001 0.028 0.001
128 1 0.021 0.0001 0.019 0.002
128 2 0.019 0.0001 0.019 0.000
128 4 0.019 0.0001 0.019 0.000
128 8 0.019 0.0001 0.019 0.000
256 1 0.013 0.0001 0.012 0.001
256 2 0.012 0.0001 0.012 0.000
256 4 0.012 0.0001 0.012 0.000
256 8 0.012 0.0001 0.012 0.000
512 1 0.008 0.0001 0.005 0.003
512 2 0.007 0.0001 0.005 0.002
512 4 0.006 0.0001 0.005 0.000
512 8 0.006 0.0001 0.005 0.000
Una cache directly mapped ha lo stesso miss rate di una cache di
dimensione met ma con associativit 2 (valido per caches di
dimensioni inferiori a 128K).
Considerazioni sulle statistiche
60
La associativit migliora la frequenza di hit a parit di
capacit complessiva ma peggiora un po il tempo di accesso
Associativit
Cache (KB) 1-w 2-w 4-w 8-w
4 3.44 3.25 3.22 3.28
8 2.69 2.58 2.55 2.62
16 2.23 2.40 2.46 2.53
32 2.06 2.30 2.37 2.45
64 1.92 2.14 2.18 2.25
128 1.52 1.84 1.92 2.00
256 1.32 1.66 1.74 1.82
512 1.20 1.55 1.59 1.66
Il miglioramento di un parametro influisce sugli altri. Ad
esempio laumento della dimensione dei blocchi riduce il
miss rate ma ovviamente aumenta il miss penalty (non si
dimentichi che il caricamento e scaricamento di un blocco
richiede pi tempo) e maggiore associativit aumenta il
tempo di accesso (in ns)
Altre statistiche dimostrano che si hanno pochi vantaggi
oltre l8-way set- associative (un working set non quasi mai
distribuito su troppi blocchi disgiunti)
Tempi medio di
accesso in cicli di
clock
Le tre C della frequenza di
miss
61
Ovviamente aumentando la dimensione della cache migliorano
tutti i parametri (a parte il compulsory che rimane sostanzialmente
immutato)
Legenda
Nero (coincide con lasse delle X) compulsory
Verde capacity
Blu-Giallo-Rosso-Azzurro conflict (in funzione della associativit)
Compulsory
Il primo accesso a qualunque blocco (linea) di memoria (cold
start misses o first-reference misses ).
Capacity
La cache non in grado di contenere tutti i blocchi necessari
allesecuzione di un programma
Conflict
Le restrizioni sulla allocazione in cache (se non fully-associative)
ovvero il numero di blocchi a uguale index
Le tre C della frequenza di
miss
62
Miss Rate vs dimensione dei blocchi
a parit di dimensione della cache e della associativit
Compulsory Capacity - Conflict
Ovviamente aumentando la dimensione dei blocchi si riduce
dapprima il miss rate (diminuendo il compulsory - blocchi pi
grandi) ma poi aumenta a seguito della prevalenza dei miss di tipo
conflict (pi blocchi che cercano di entrare nello stesso slot)
Cache Size
63
A parit di dimensione complessiva della cache variando la
associativit
I miss compulsory e di capacity sono (pressoch) costanti
Variano i miss di conflict La associativit (ovviamente) li
riduce
0
1
2
3
4
5
6
7
8
9
1W 4W 1W 4W
%

m
i
s
s

p
e
r

I
s
t
r
u
z
i
o
n
e
Conflict
Capacity
Compulsory
associativit
Le tre C della frequenza di
miss
8K 16K
Dimensione cache
Compulsory Capacity - Conflict
64
A parit di dimensione di cache variando le
dimensioni delle linee (blocchi)
I miss compulsory diminuiscono
incrementando i blocchi
I miss di capacity e conflict possono
aumentare allaumentare della dimensione
della linea
0
1
2
3
4
5
6
7
8
32Bytes 64B 32B 64B
Conflict
Capacity
Compulsory
%

m
i
s
s

p
e
r

I
s
t
r
u
z
i
o
n
e

Le tre C della frequenza di
miss
8K 16K
Dimensione
della linea
Dimensione cache
Compulsory Capacity - Conflict
65
Altre problematiche di coerenza
Sincronizzazione fra processi e fra processori
La coerenza non riguarda solo le caches ma pi in generale il funzionamento
complessivo dei sistemi. Fra i meccanismi di coerenza si debbo annoverare
anche i meccanismi che permettono la gestione delle primitive.
Il nocciolo di una primitiva che deve esistere un meccanismo che
permetta azioni atomiche nelle quali alcuni cambiamenti avvengono senza
interferenza
Il meccanismo abbastanza facilmente realizzabile in sistemi
monoprocessore ma pi complesso in sistemi multiprocessore e/o
multithreading
La sincronizzazione fra processi del tutto similare alla problematica
dellI/O: controllo di programma o interruzione
Listruzione di Test and Set (o istruzione equivalente) equivale in tutto e per
tutto alla funzione di lettura di un flag di ready in I/O
test1: IN al, addr8255-portaC
AND al, mask
BZ test1
.......
test2: TST semaphore, test2 ; lettura prima di scrittura
Equivalente alla Test and Set sono anche anche la Fetch and Increment (si
legge un dato e contemporaneamente lo si incrementa in memoria leggendo
il dato letto si sa se il semaforo era rosso) e la Exchange Memory and Register
(tipica degli iAPx). Istruzioni atomiche. Nella seconda in un registro si pone
il valore 1 e si scambiano contenuti di registro e memoria. Analogo test a
seguire. Si noti che lettura e scrittura DEBBONO essere non interrotte
(azioni atomiche).
66
Sincronizzazione
Un altro meccanismo utilizzato quello della linked load e della store
condizionale (ritorna un 1 se OK ovvero se il dato da scrivere identico a quello
letto)
try: MOV R3, R4 ; carica il valore da scambiare
LL R2,(R1) ; Linked Load (leggi la locazione del semaforo)
SC R3,(R1) ; Store Condizionale
BZ R3, try ; ripeti se il contenuto della memoria
nel frattempo cambiato
MOV R4, R2 ; fine dello scambio fra R4 e locazione di
memoria
La store viene effettuata se il contenuto della memoria allatto della scrittura
uguale al dato letto dalla LL. Alla fine se tutto andato a buon fine il contenuto
di R4 e della memoria puntata da R1 si sono scambiati il dato. La store
condizionale rende in R3 il successo o meno della store stessa. Ovviamente il
meccanismo indica se fra la linked load e la cond-store si inserito qualche altro
processo. Si noti che il meccanismo realizza una operazione atomica anche se le
singole istruzioni non sono atomiche Nel caso multiprocessore le istruzioni viste
hanno il difetto di impegnare il bus comune. In presenza di caches il problema si
pu eliminare. Si veda la seguente sequenza:
lock: LD R2, (R1) ; leggi il semaforo e portalo in cache
BNZ R2, lock ; libero (=0) ? Se si
ADDI R2, R0, #1 ; incrementalo (occupato =1)
EXCH R2, (R1) ; scambia il dato con la memoria
BNZ R2, lock ; qualcuno arrivato prima ?
La lettura del semaforo viene fatta in cache. Quando occupato la cosa si ripete
senza utilizzare il bus. Quando il possessore del semaforo lo rilascia viene
invalidata la cache e i processori accedono per la lettura in memoria anzich
nella cache. Il primo che riesce a completare la sequenza successiva vince la gara
e gli altri trovano il semaforo gi rosso e ritorna alla casella di partenza (lock).
67
Attivazione di processi
Listruzione di Test and Set costosa in termini di efficienza (blocca
il processo come nel caso dellI/O a controllo di programma) e viene
spesso sostituita dal meccanismo di interruzione sia per processi
intraprocessor che interprocessor.
Per i primi un processo dormiente viene spesso risvegliato
attraverso una interruzione interna (INT n). Per i processi che si
trovano su processori diversi i processori dispongono di un sistema
di interrupt interprocessor nel quale un processore attiva una
segnale di interruzione che viene ricevuto e decodificato dai
processori destinazione attraverso un meccanismo di broadcast. Il
meccanismo integrato in molti processori moderni.
Sito web
Coerenza 68
https://www.cs.tcd.ie/Jeremy.Jones/vivio/vivio.htm
A questo indirizzo si trovano delle interessanti animazioni fra
cui quelle relative alle caches
69
Branch Target Buffer
Se si vogliono evitare stalli dovuti ai salti nel DLX (anche uno solo)
necessario predire il branch nello stadio di IF (cio prima che listruzione sia
decodificata) ovviamente con il rischio che la predizione risulti erronea e
che sia quindi necessario poi inserire gli stalli necessari una volta che nello
stadio EX la condizione di branch viene verificata
P C
Indirizzo PC
Indirizzo di
destinazione
T/U
Indirizzo PC
Indirizzo di
destinazione
T/U
Indirizzo PC
Indirizzo di
destinazione
T/U
Indirizzo PC
Indirizzo di
destinazione
T/U
Indirizzo PC
Indirizzo di
destinazione
T/U
Indirizzo PC
Indirizzo di
destinazione
T/U
Il BTB si comporta come una cache i cui TAGs sono costituiti dagli
indirizzi che precedentemente sono stati individuati come branch. Il dato
costituito dall indirizzo di destinazione e fra i bit di stato sono inclusi
quelli che predicono se il branch deve essere Taken o Untaken
Nel caso di miss si procede normalmente salvo individuare che si tratta di
branch nello stadio EX. In tal caso uno degli slot (secondo una della
politiche tipiche della cache) viene rimpiazzato e la predizione iniziale
portata al valore di quanto riscontrato nello stadio EX
Branch Target Buffer
Taken
Untaken
Predizione dei branch
70
Come sono organizzati i bit di predizione ? Su base statistica
Caso pi semplice (predizione statica): il branch sempre
predetto taken
La probabilit di errore con questa politica per benchmark SPEC
del 34% (molto alta)
Predizione (statica) sulla base della direzione del branch (avanti o
indietro)
La predizione normalmente usata che sono predetti taken i
branch allindietro (v. loop) mentre sono predetti untaken i
branch in avanti
Nello SPEC per la maggioranza dei branch in avanti taken e
quindi la predizione taken (ovvero se si predice taken per salti in
avanti) migliore
Predizione (dinamica) sulla base del profilo informativo legato
alle precedenti esecuzioni
Lerrore di predizione varia dal 5 al 22%
71
Branch Target Buffer
Buffer di predizione: caso pi semplice un bit che indica cosa
successo l'ultima volta.
In presenza di preponderanza di un caso quando si verifica il
caso opposto si hanno due errori successivi.
Loop1
Loop2
Quando esce da loop 2 sbaglia (predetto
taken ma in realt untaken) ma sbaglia
ancora quando predice untaken in loop1
72
Branch Target Buffer
Normalmente due bit. Due schemi possibili
TAKEN
TAKEN
UNTAKEN
UNTAKEN
TAKEN TAKEN
U
N
T
A
K
E
N
UNTAKEN UNTAKEN
TAKEN
UNTAKEN
T
A
K
E
N
UNTAKEN
TAKEN
TAKEN
UNTAKEN
TAKEN TAKEN
UNTAKEN UNTAKEN
TAKEN
UNTAKEN
In questo caso dopo due
misprediction si cambia
stabilmente predizione
In questo caso dopo due
misprediction si cambia
la predizione ma pronti a
ritornare alla predizione
precedente se c una
ulteriore misprediction
Con entrambi questi due schemi si ottiene una accuratezza
superiore all80%
Simulatore
Parallelismo 73
http://www.ecs.umass.edu/ece/koren/architecture/BTBuffer/project.html
http://www.ecs.umass.edu/ece/koren/architecture/BrPredict/BranchPredict
ion.html
Algoritmi avanzati per BTB
74
Preditore adattativo a due livelli
Due registri: BHR (Branch History Table) e PHT (Pattern
History Table)
Primo caso: gestione globale
0 0 1 0 1 1 1 0
Ex:
BHR (Shift Register)
(contenuto = 2E
h
)
0 0 1 0 1
0 1 1 0 0
1 1 1 0 0
1 0 1 0 1
(00)
(01)
(2E)
(FF)
PHT
1 -> Branch taken
0 -> Branch not taken
Storia degli n (8) branches
pi recenti (ovvero cosa
realmente successo ovvero se
il branch risultato taken o
meno)
Cosa si
deciso
prima con
la stessa
successione
globale ?
Decisione: salto
Decisione: no salto
Nel caso in questione il contenuto di BHR 2E
h
=47
10
75
Algoritmi avanzati per BTB
In presenza di un branch si analizza la successione degli
eventi di branch pi recenti (ovvero se effettivamente
presi o non presi) Per ogni configurazione di questa
successione si punta ad un pattern che indica le decisioni
prese in presenza di tale successione
Dopo ogni Branch nel BHR il risultato del salto (quello
che effettivamente successo)
Deve essere definita una funzione che decida quale
predizione fare sulla base del PHT selezionato dal BHT e
di altri parametri del sistema.
Questo tipo di preditore (che richiede n + (2**n x m) FF -
ove n la lunghezza del BHR e m quella della singola riga
del pattern- ovviamente poco significativo in quanto non
distingue fra i vari branches
76
Algoritmi avanzati per BTB
Secondo caso: preditore misto
In questo caso vi un BHR composto da K shift registers ciascuno
di n bits (uno per ogni indirizzo di branch incontrato mentre vi
un solo PHT) che registrano quanto successo effettivamente in
presenza del branch in questione
m
K
n
2**n
K branches presi in considerazione
Indirizzo
BHT
Stesso slot PHT
puntato
77
Algoritmi avanzati per BTB
N.B.: registri relativi a Branches diversi possono ovviamente
puntare allo stessa riga di pattern ove di contenuto
identico
Anche in questo caso vi una incongruenza: mentre si
distingue la storia di ogni sequenza di decisioni per ogni
indirizzo di branch incontrato il pattern che origina la
decisione sempre il medesimo qualunque sia lindirizzo di
branch di origine
Il numero di FF necessari k x n + (2**n x m)
78
Algoritmi avanzati per BTB
Terzo caso: preditore omogeneo
E un (pesante) raffinamento del secondo caso
m
Numero di bit k x n + (2**n x m x k)
k
n
2**n
Si noti che aumenta anche la
complessit della rete di gestione !!
BHT Indirizzo