Cap.4
La memoria
4.1
Gerarchia di memoria
La
latenza della memoria ha un impatto enorme sulle prestazioni
di un processore. Per eseguire grossi programmi in modo efficiente,
l'R10000 implementa una gerarchia di memoria non bloccante,
con due livelli di cache non associativa.
Le
istruzioni primarie del chip e la cache dati operano in modo
concorrente, garantendo una bassa latenza e un'alta banda
disponibile; il chip controlla poi una grossa cache secondaria.
Tutte le cache utilizzano un algoritmo di tipo LRU (last-recently-used).
Entrambe
le cache primarie utilizzano un indice degli indirizzi virtuali
e un tag degli indirizzi fisici. Per minimizzare la latenza,
il processore può accedere ad ogni cache primaria in modo
concorrente con le traslazioni degli indirizzi nel TLB; ogni
cache contiene 16 Kbyte (quattro volte la dimensione minima
di una pagina virtuale).

Fig.10
Unità
di load/store. La figura 10 contiene il diagramma a blocchi
dell'unità di load/store e della cache dati. La coda degli
indirizzi rilascia le istruzioni di load e di store all'unità
di calcolo degli indirizzi e alla cache dati; quando la cache
non è occupata, un'istruzione di load può accedere simultaneamente
al TLB, al vettore di tag della cache, e al vettore dati della
cache: ciò si traduce in una latenza di due cicli.
Traslazione
degli indirizzi di memoria (TLB). L'indirizzamento dovrebbe
essere a 64 bit, ma la dimensione massima è stata ridotta
per diminuire il costo del TLB e dei vettori di cache tag;
l'R10000 implementa così un translation look-aside buffer
a 64 slot, che trasla indirizzi virtuali a 44 bit in indirizzi
fisici a 40 bit.
Ogni
slot mappa una coppia di pagine virtuali, e seleziona in modo
indipendente una dimensione di pagina compresa tra 4 Kbyte
e 16 Mbyte. Il TLB consiste in una memoria indirizzabile per
contenuto (che confronta gli indirizzi virtuali) e una sezione
di RAM (che contiene i corrispondenti indirizzi fisici).
4.2
La cache
Cache
istruzioni primaria
Questa
cache di 32 Kbyte può contenere fino a 8192 istruzioni, ognuna
precodificata in un formato a 36 bit, dato che il processore
può decodificare questo formato più rapidamente di quello
originale. In particolare, i 4 bit extra indicano quale unità
funzionale dovrebbe eseguire l'istruzione; il precodificatore
poi riposiziona i campi degli operandi e di destinazione in
modo che siano nella stessa posizione per ogni istruzione,
e modifica alcuni opcode per semplificarne la decodifica da
parte dei registri di destinazione. Il processore effettua
il fetch di quattro istruzioni in parallelo.
Cache
dati primaria
La
cache dati utilizza due banchi da 16 Kbyte; il processore
alloca i vettori di dati e di tag di ogni banco in modo indipendente,
e li dirige alle quattro pipeline seguenti:
- external
interface
- tag check
- reload
- store graduate
Per
semplificare l'interfacciamento e ridurre l'ammontare delle
richieste di buffering, l'interfaccia esterna ha la priorità.
La
cache dati ha una dimensione di linea di otto parole, un compromesso
più che accettabile: una dimensione maggiore riduce l'area
di RAM occupata dai tag e diminuisce leggermente i cache miss,
ma aumenta la banda utilizzata durante il riempimento.
Ognuno
dei due banchi di cache comprende due vettori logici per supportare
il tipo set-associativo a due vie; l'accesso
a questi array è alternato, in modo da supportare differenti
lunghezze, come mostrato nella figura 11.

Fig.11
Il
processore legge simultaneamente la parola da entrambe le
vie, dato che controlla in parallelo i tag e solo in seguito
seleziona i dati dalla via corretta. L'interfaccia esterna
riempie poi la cache accedendo a due parole in parallelo,
poiché conosce in anticipo la via corretta.
La
cache è indicizzata virtualmente, in modo che l'indicizzazione
possa avvenire nello stesso ciclo di clock in cui viene generato
l'indirizzo virtuale; è però etichettata fisicamente, per
mentenere la coerenza con la cache secondaria.
Cache
secondaria
E'
costituita da chip di RAM sincrona esterni al processore,
con dimensione variabile da 512 Kbyte a 16 Mbyte, di tipo
set-associativo a due vie. L'utente può poi configurare la
dimensione delle linee a seconda delle esigenze di sistema
(da 16 a 32 parole).
La
cache di tipo set-associativo riduce i miss e incrementa la
predicibilità. Per una cache esterna, tuttavia, ciò richiede
solitamente una RAM speciale o più pin di interfaccia; l'R10000
implementa una cache pseudo set-associativa utilizzando semplice
RAM sincrona ed un solo bit in più di indirizzamento.

Fig.12
La
figura 12 mostra come i riempimenti della cache
vengono fatti in pipeline. I singoli gruppi di RAM contengono
entrambe le vie, e un vettore di bit del chip tiene traccia
di quale via è stata utilizzata più recentemente; dopo un
miss, due quad word vengono lette da questa via nella cache
secondaria, mentre per leggere il tag si utilizza il bit in
più di indirizzamento.
A
questo punto vi possono essere tre casi:
- hit
sulla via primaria: il dato diventa immediatamente disponibile
- hit sulla via secondaria: il processore legge ancora
dalla cache secondaria
- nessun hit: il processore deve riempire la cache
secondaria con la memoria
Una
cache esterna di dimensioni così grosse necessita di codici
a correzione d'errore per salvaguardare l'integrità dei dati:
l'R10000 implementa un codice ECC a 9 bit e un bit di parità
per ogni quad word.
Altre letture consigliate:
-CISC
vs RISC, scontro fra filosofie costruttive
-Approfondimento
dell'ISA dei processori
-Analisi dell'architettura
AI-64 di Intel
-Il Multi-Threading
Hardware
-La storia della
famiglia di processori x86 (Intel & AMD)
-In-depth Technical
Analysis dell'Athlon
-Il G4 e la famiglia
di processori PowerPC
-Tecnologia di
integrazione SOI
 |
Vuoi
essere avvertito quando usciranno nuovi Articoli ?
Iscriviti anche tu alla comunità di Lithium.it
ed entra nel nostro forum
|
|
|
|
|