lucidi in formato pdf - Dipartimento di Matematica e Informatica

Transcript

lucidi in formato pdf - Dipartimento di Matematica e Informatica
Migliorare le prestazioni
di processori e memorie
Corso: Architetture degli Elaboratori
Docenti: F. Barbanera, G. Bella
UNIVERSITA’ DI CATANIA
Dip. di Matematica e Informatica
Tipologie dei Miglioramenti
Implementativi: ad esempio, aumentare la
velocità di clock
„
„
I vecchi programmi continuano a girare senza
problemi
E’ il caso dei miglioramenti dall’80386 al Pentium
II
Architetturali:
ridisegnato
„
instruction
set
esteso
o
Per esempio, macchine RISC
F. Barbanera, G. Bella
2
Migliorare le prestazioni v.2.3
1
Miglioramenti
1. Memoria cache: la CPU è molto più veloce
della memoria…
2. Predizione di salto: linearizzare l’esecuzione
del codice
3. Esecuzione fuori ordine: eseguire le istruzioni
in ordine diverso da quello dato
4. Esecuzione
speculativa: eseguire
prima di sapere se servirà
F. Barbanera, G. Bella
3
codice
Migliorare le prestazioni v.2.3
1. Memoria cache
Una memoria piccola e veloce per memorizzare le parole
di dati usate più recentemente (come sappiamo!)
F. Barbanera, G. Bella
4
Migliorare le prestazioni v.2.3
2
Cache di livello 1
A bordo della CPU
Dimensioni tipiche: 16-64 KB
Tipicamente separata (split cache) per istruzioni e dati
Ciascuna porzione associata a una porta di memoria
(due porte separate come nel Mic-1)
Accesso indipendente alla memoria: raddoppiano le
prestazioni
(operano indipendentemente: larghezza di banda raddoppiata)
F. Barbanera, G. Bella
5
Migliorare le prestazioni v.2.3
Cache di livello 2
Fra la cache di livello 1 e la memoria
Dimensioni tipiche: 512 KB – 1 MB
Unificata per istruzioni e dati
Non e’ a bordo della CPU ma si puo’ includere in un
package per essa (come per il SEC del Pentium II)
F. Barbanera, G. Bella
6
Migliorare le prestazioni v.2.3
3
Cache di livello 3
Alloggiata sulla scheda ospitante la CPU
Fra la cache di livello 2 e la memoria
Dimensioni tipiche: alcuni MB
Unificata per istruzioni e dati
F. Barbanera, G. Bella
7
Migliorare le prestazioni v.2.3
Caratteristiche di cache a livelli
Inclusive: Livello 3 include livello 2; livello 2 include
livello 1
Basate sul principio di località
„ Località spaziale: un programma usa celle di
memoria vicine
„ Località temporale: alta probabilità di accedere
nuovamente a celle appena richieste
Memoria vista come insieme di linee di cache,
ognuna di 4-64 byte
Se viene indirizzata una parola, il controllore della
cache verifica se essa è in cache, altrimenti
sostituisce una linea con quella richiesta
F. Barbanera, G. Bella
8
Migliorare le prestazioni v.2.3
4
Cache a mappatura diretta
- intuizione
Si immagini di suddividere tutta la RAM in
porzioni di dimensioni fisse, chiamate linee
Si immagini di suddividere tutte le linee in
gruppi di γ linee, identificando ciascun gruppo
con un tag
Si potrà indirizzare la memoria richiedendo la
linea β di tag α
Si potrà considerare un gruppo (di γ linee)
aventi tutte lo stesso tag oppure tag diverso
F. Barbanera, G. Bella
9
Migliorare le prestazioni v.2.3
Cache a mappatura diretta
Esempio
con 2048 linee
Attenzione: alcuni testi presentano
errori su questa figura!
Valid
Una linea di memoria è registrata esattamente in un
posto: se non sta lì, allora non sta nella cache
Formato di una linea di cache (nell’esempio):
„
„
„
Data: (32 byte) copia della linea di memoria
Tag: (16 bit) valore che identifica un gruppo di linee di memoria
Valid: (1 bit) settato se Data contiene valori validi (aggiornati)
F. Barbanera, G. Bella
10
Migliorare le prestazioni v.2.3
5
Indirizzamento di un byte in
cache - intuizione
Il byte sia la minimia cella indirizzabile di memoria
Un tag si può vedere come un insieme di linee
A sua volta, una linea è un insieme di parole (4 byte)
A sua volta, una parola è un insieme di byte
Allora per indirizzare un byte, se ne deve stabilire la
posizione all’interno di una parola, della quale si deve
stabilire la posizione all’interno di una linea, della quale si
deve stabilire la posizione all’interno di un tag.
Esempio. La CPU indirizza il byte δ della parola χ della
linea β del tag α
F. Barbanera, G. Bella
11
Migliorare le prestazioni v.2.3
Indirizzi di memoria generati
dalla CPU – esempio di 32 bit
TAG: quale tag di linee è richiesto (216 tag)
LINE: quale linea all’interno del tag (211 linee)
WORD: quale parola all’interno della linea (23 parole)
BYTE: quale byte all’interno della parola (22 byte)
F. Barbanera, G. Bella
12
Migliorare le prestazioni v.2.3
6
Indirizzamento di un byte in
cache
Appena la CPU genera un indirizzo di tale formato, il
controllore della cache:
ricerca linea LINE nella cache;
se il TAG dell’indirizzo coincide con il Tag della linea di
cache e il bit Valid è settato, allora si ha un successo
(cache hit);
altrimenti si ha un insuccesso (cache miss): l’intera linea
LINE di tag TAG viene letta dalla memoria principale e
sostituita alla porzione Data della linea LINE di cache;
TAG rimpiazza Tag; bit Valid viene settato
F. Barbanera, G. Bella
13
Migliorare le prestazioni v.2.3
Prestazioni
Inizialmente, linee contigue di memoria vengono
messe in cache
Pertanto, se Y è la dimensione della cache e un
programma
„
Accede alla linea d’indirizzo X, con X < Y, cache hit
„
Quindi accede alla linea X+Y, cache miss
Raro inconveniente
Cautelativaemente, non si dovrebbe mai scrivere su
linee troppo distanti di memoria
Soluzione: cache associativa ad n modi
F. Barbanera, G. Bella
14
Migliorare le prestazioni v.2.3
7
Cache associativa ad n modi (vie)
n linee di memoria per linea di cache
Una linea di memoria va ricercata fra le n presenti in
una linea di cache
(dà ottime prestazioni)
Associazione a 4 modi
La ricerca si effettua mediante controllo sui tag
F. Barbanera, G. Bella
15
Migliorare le prestazioni v.2.3
Cache associativa ad n modi
Uno stesso tag (per esempio β1) si può trovare su linee
di cache diverse
Rimpiazzare linee è complicato. Per esempio, dove
inserire la linea di memoria 7 di tag β13?
β1
β6
β3
β1
β19
β1
β1
F. Barbanera, G. Bella
16
Migliorare le prestazioni v.2.3
8
Progettazione di una cache
Rimpazzamento delle linee
„
„
LRU (Least Recently Used),
MRU (Most Recently Used)
Se la CPU intende scrivere una linea che si trova
„
in cache
Š Write through (immediato: resettare bit Valid!)
Š Write deferred (attraverso cache)
„
non in cache
Š Write through (immediato: resettare bit Valid!)
Š Write allocation (attraverso cache)
Osservazione elementare: tutti i bit Valid sono resettati
all’accensione.
17
Migliorare le prestazioni v.2.3
2. Predizione di salto
Then:
Else:
Next:
CMP i,0
BNE Else
MOV k,1
BR Next
MOV k,2
Frammento Assembly
F. Barbanera, G. Bella
Le pipeline funzionano meglio se il codice non ha salti
„
„
Unità di lettura e decodifica separate
Quando l’unità di decodifica scopre il salto, l’unità di lettura
deve già fornire una nuova istruzione
Con salti non condizionati, spesso si legge l’istruzione
successiva malgrado non serva
Con salti condizionati, le prime pipeline si fermavano
fino a quando non si stabiliva se saltare all’etichetta
THEN (salto preso) o all’ELSE (salto non preso)
Bisognerebbe predire il futuro!
F. Barbanera, G. Bella
18
Migliorare le prestazioni v.2.3
9
Stragegie di predizione
1. Tutti i salti all’indietro siano presi (ad esempio, si
trovano alla fine di un ciclo, e molti cicli sono
eseguiti più volte)
2. Tutti i salti in avanti siano non presi (ad esempio,
servono a gestire gli errori: errori rari implicano
salti in avanti tipicamente non presi)
E se la predizione fosse errrata?
Quali misure adoperare?
F. Barbanera, G. Bella
19
Migliorare le prestazioni v.2.3
Misure di error recovery
Eseguire le istruzioni che seguono un salto condizionato
adoperando le seguenti misure all’atto della scrittura su
un registro della memoria.
1. Si scrivano i dati freschi su un registro di scratch,
poi copiato in memoria solo quando si accerta la
correttezza della predizione
2. Si faccia una copia di backup del registro della
memoria, da usare per ripristinare i vecchi dati
quando si accerti l’errore nella predizione
Medesima filosofia…
F. Barbanera, G. Bella
20
Migliorare le prestazioni v.2.3
10
Predizione dinamica di salto
La CPU mantiene in hardware una
tabella con le informazioni sui salti
condizionati più recenti
Ogni linea contiene l’indirizzo
dell’istruzione di salto e un bit che
indica se il salto e’ stato preso
l’ultima volta che è stato eseguito
Quindi la strategia di predizione è: il salto si comporti
come la volta precedente
Quando la predizione di un salto è accertata errata, si
modifica il bit relativo al salto nella tabella
Gestibile esattamente come una cache
F. Barbanera, G. Bella
21
Migliorare le prestazioni v.2.3
Predizione statica di salto
Si espleta prima dell’esecuzione di un programma.
Non richiede hardware specializzato e costoso (come la
predizione dinamica)
1. Suggerimenti da parte del compilatore:
„
„
„
Se il compilatore ritiene che certi salti saranno presi (si
pensi, ad esempio, a un ciclo for),
allora vengono compilati in istruzioni precipue del
linguaggio assemblatore, le quali indicano il
suggerimento del compilatore
In realtà è una modifica architetturale
2. Profili di funzionamento: si simula il programma e le
informazioni sull’andamento dei salti
direttamente passate al compilatore
F. Barbanera, G. Bella
22
vengono
Migliorare le prestazioni v.2.3
11
3. Esecuzione fuori ordine
Architettura superscalare: singola
pipeline con più unità funzionali.
lettura
delle
istruzioni
decodifica
delle
istruzioni
lettura
degli
operandi
ALU
ALU
LOAD
Gi
à
vis
ta
!
scrittura
STORE
• La lettura di un’istruzione comincia
Floating
prima che la precedente abbia
point
percorso l’intera pipeline
• Dipendenza: l’esecuzione di alcune istruzioni non può cominciare
prima di aver ricevuto dei dati calcolati da istruzioni precedenti
• Soluzione: eseguire nel frattempo altre istruzioni, anche seguenti,
che non abbiano dipendenze (da cui esecuzione fuori ordine)
F. Barbanera, G. Bella
23
Migliorare le prestazioni v.2.3
Dipendenze
RAW (Read After Write): tentativo di leggere
un registro la cui scrittura(*) non è ancora
terminata
WAR (Write After Read): tentativo di scrivere
su un registro la cui lettura(*) non è ancora
terminata
WAW (Write After Write): tentativo di scrivere
un registro la cui scrittura(*) non è ancora
terminata
(*)
= da parte di qualche istruzione precedente
F. Barbanera, G. Bella
24
Migliorare le prestazioni v.2.3
12
L’esecuzione di un’istruzione inizi un ciclo dopo il ciclo di decodifica.
+ e – impieghino
qu 2 cicli, * impieghi 3 cicli.
ali
cic
lo
…
son e c
o i om
niz ple
iat ta
e te
Scoreboard: tabella di contatori per ciascun registro,
indica volte che un registro è usato da un’istruzione
Dipendenza RAW:
I4 non viene inziata
Dipendenza WAR:
I6 non viene inziata
In caso di dipendenza, l’istruzione successiva e’ bloccata!
F. Barbanera, G. Bella
25
Migliorare le prestazioni v.2.3
Completamento fuori ordine renderebbe impossibile il precise interrupt
Esempio di esecuzione in ordine
Esempio di esecuzione fuori ord.
L’esecuzione di un’istruzione inizi un ciclo dopo il ciclo di decodifica.
+ e – impieghino 2 cicli, * impieghi 3 cicli.
Anche se I4 è
bloccata, abbiamo
iniziato I5 ed I6
E se I5 usasse R6?
Ossia, se le istruzioni eseguite fuori ordine usassero registri che
l’istruzione bloccata avrebbe modificato?
Va aggiunto allo scoreboard un bit in più per ogni registro che indichi
se il registro è “atteso” da un’istruzione bloccata
F. Barbanera, G. Bella
26
Migliorare le prestazioni v.2.3
13
Rinominazione dei Registri
L’unita’ di decodifica ha rinominato R1 come S1 nell’istruzione 6 e 7.
Pertanto, le istruzioni 5 e 6 possono essere eseguite in parallelo.
F. Barbanera, G. Bella
27
Migliorare le prestazioni v.2.3
4. Esecuzione speculativa
Esecuzione anticipata di codice prima di sapere se
servirà
Potenzia l’esecuzione fuori ordine
Assistita dal compilatore
Per esempio, anticipare la lettura (LOAD) delle
variabili utilizzate all’interno di un ciclo prima che il
ciclo cominci
Certamente c’è il rischio di fare lavoro inutile
F. Barbanera, G. Bella
28
Migliorare le prestazioni v.2.3
14
Esecuzione speculativa: esempio
si può già calcolare k
si possono già calcolare
evensum e oddsum
Ma non si deve scrivere in memoria
perché in generale non è detto che
un’operazione speculativa sia giusta!
Soluzione: il codice speculativo usi
registri di scratch.
F. Barbanera, G. Bella
29
Migliorare le prestazioni v.2.3
Problemi e soluzioni
Se un’istruzione speculativa causasse un cache miss?
Rischiamo lavoro inutile.
Soluzione. Caricamento speculativo: quando
un’istruzione speculativa tenta di leggere una linea
dalla cache, abbandona qualora non la trovi
Se un’istruzione speculativa causasse un’eccezione?
Esempio.
if (x > 0) z = y/x
Per ogni istruzione c’è un poison bit che viene settato
se l’esecuzione speculativa di quell’istruzione causa
eccezione. Prima dell’esecuzione “normale”
dell’istruzione, se ne controlla il poison bit
F. Barbanera, G. Bella
30
Migliorare le prestazioni v.2.3
15