CALCOLATORI ELETTRONICI
CALCOLATORI ELETTRONICI
CALCOLATORI ELETTRONICI
Create successful ePaper yourself
Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.
<strong>CALCOLATORI</strong><br />
<strong>ELETTRONICI</strong><br />
RISC e Superscalari 1<br />
27 Aprile 2009<br />
Sterpone Luca<br />
Sommario<br />
◦ Miglioramento dei processori<br />
◦ Processori RISC<br />
• Architettura di base<br />
• Pipeline<br />
• Approfondimenti<br />
◦ Superscalari<br />
• Introduzione<br />
• Architettura<br />
Evoluzione dei Processori<br />
Evoluzione dei Processori [cont.]<br />
L’evoulzione annua nelle<br />
prestazioni dei computer<br />
era circa 25-30% durante<br />
gli anni ’70 (mainframe e<br />
minicomputer)<br />
Evoluzione dei Processori [cont.]<br />
Evoluzione dei Processori [cont.]<br />
L’incremento di prestazioni<br />
annuale sale a più del 50%<br />
per le architetture RISC<br />
negli anni ’80<br />
Questa incredibile crescita è<br />
dovuta a miglioramenti di<br />
◦ tecnologia<br />
◦ architettura dei<br />
processori<br />
◦ compilatori.<br />
1
Operazioni Elementari<br />
◦ Tutte le operazioni svolte dalla CPU<br />
possono essere ricondotte a 4 tipologie<br />
elementari:<br />
• prelievo di un dato o di una istruzione dalla<br />
memoria e caricamento in un registro<br />
• scrittura in memoria di un dato contenuto in un<br />
registro<br />
• trasferimento di un dato da un registro ad un<br />
altro<br />
• esecuzione di un’operazione aritmetica o logica<br />
e memorizzazione del risultato in un registro.<br />
◦ Le 4 operazioni verranno descritte con<br />
riferimento al seguente modello della<br />
CPU, semplificato rispetto a quello reale.<br />
Analisi dei programmi<br />
◦ Le scelte che conducono al progetto di<br />
una CPU dipendono anche dall’analisi<br />
delle caratteristiche dei programmi che<br />
questa dovrà eseguire, in quanto è<br />
auspicabile che le istruzioni ed i modi di<br />
indirizzamento più utilizzati siano<br />
particolarmente ottimizzati.<br />
Analisi dei programmi [cont.]<br />
◦ Da una analisi generale sulle caratteristiche<br />
dei programmi si conclude che:<br />
• le istruzioni ad alto livello più frequenti sono<br />
quelle di assegnazione (circa 40%) e di salto<br />
condizionato (40%)<br />
• se si considera il costo pesato in termini di<br />
istruzioni macchina richieste, si rileva che:<br />
◦ le istruzioni di chiamata e ritorno da<br />
procedura corrispondono a circa 1/3 del<br />
totale<br />
◦ un altro terzo corrisponde alle istruzioni di<br />
iterazione<br />
◦ le istruzioni di assegnazione e salto<br />
condizionato corrispondono soltanto al 10-<br />
15% del totale<br />
• Esiste una forte percentuale di accessi a dati scalari<br />
locali.<br />
Analisi dei programmi [cont.]<br />
◦ In conclusione, le prestazioni possono<br />
essere migliorate significativamente se<br />
• si dispone di un numero di registri ragionevole,<br />
attraverso i quali si può ridurre<br />
significativamente il numero di accessi in<br />
memoria<br />
• si utilizza un meccanismo intelligente di<br />
pipeline delle istruzioni, in modo da ridurre<br />
l’incidenza di salti e chiamate a procedura.<br />
◦ Make the common case fast<br />
Organizzazione dei Registri<br />
◦ Il numero dei registri influenza<br />
fortemente le prestazioni di un<br />
processore. Quando sono molti si parla<br />
di register-file o scratch-pad memory<br />
◦ È possibile che per ogni registro venga<br />
imposto un particolare uso; si possono<br />
avere<br />
• registri dati<br />
• registri indice<br />
• registri contatore.<br />
I Registri<br />
◦ I registri sono la forma di memoria con<br />
minore tempo di accesso in quanto:<br />
• risiedono sullo stesso chip della CPU<br />
• sono costruiti con la tecnologia più veloce<br />
• sono accessibili con un meccanismo di<br />
indirizzamento semplice<br />
◦ Si può guadagnare in efficienza di<br />
esecuzione in 2 modi:<br />
• aumentando il numero di registri<br />
• ottimizzando il loro uso.<br />
2
Register Window<br />
◦ Nell’ambito di una procedura, i registri possono<br />
essere usati:<br />
• per contenere le variabili locali<br />
• per passare i parametri<br />
◦ È però necessario un meccanismo per il<br />
salvataggio del loro valore quando si esegue la<br />
chiamata<br />
◦ Poichè il livello di annidamento delle procedure è<br />
mediamente basso, si possono organizzare i<br />
registri in blocchi (Register Window)<br />
◦ Ogni procedura vede solo la propria Register<br />
Window; ad ogni chiamata a procedura o ritorno<br />
da procedura, viene cambiata la Register Window<br />
attiva.<br />
Register Window [cont.]<br />
◦ Il passaggio di parametri alle procedure si può realizzare<br />
facendo parzialmente sovrapporre le Register Window<br />
della procedura chiamante e di quella chiamata<br />
Registri per Registri per Registri per<br />
i parametri le var. localili<br />
i parametri<br />
livello i<br />
Registri per Registri per Registri per<br />
livello i+1<br />
i parametri le var. locali i parametri<br />
◦ Quando si supera il livello massimo di annidamento<br />
permesso, il primo blocco di registri viene salvato in<br />
memoria<br />
◦ I blocchi di registri possono essere organizzati in un<br />
buffer circolare.<br />
Register Window [cont.]<br />
Restore<br />
A loc<br />
B in<br />
Save<br />
A B<br />
in<br />
loc<br />
Saved<br />
Window<br />
Pointer F loc<br />
C in<br />
loc<br />
F in<br />
C loc<br />
Register Window [cont.]<br />
◦ È stato calcolato che con 8 Register Windows solo<br />
l’1% delle istruzioni call o return richiede di<br />
salvare o ripristinare dalla memoria un blocco di<br />
registri.<br />
◦ Esempi di RISC con Register Window:<br />
• Berkeley RISC: 8 window da 16 registri ciascuna<br />
• Pyramid: 16 window da 32 registri.<br />
E loc<br />
D in<br />
E in<br />
Call<br />
Return<br />
D loc<br />
Current<br />
Window<br />
Pointer<br />
CISC e RISC<br />
◦ Negli ultimi 3 decenni si sono<br />
contrapposte 2 tipologie di<br />
microprocessori :<br />
• CISC (Complex Instruction Set Computer):<br />
processori con un set di istruzioni sempre più<br />
ampio e complesso, in grado di colmare il salto<br />
tra linguaggi macchina e linguaggi ad alto<br />
livello<br />
◦ DEC VAX<br />
◦ IBM 370<br />
◦ Intel Pentium.<br />
• RISC (Reduced Instruction Set Computer):<br />
processori con un set di istruzioni ridotto.<br />
Processori RISC<br />
◦ Caratteristiche:<br />
• set di istruzioni semplice e limitato<br />
• elevato numero di registri<br />
• pipeline delle istruzioni particolarmente<br />
ottimizzata.<br />
◦ Esempi<br />
• IBM 801 (1979) ◦ Pyramid<br />
• Berkeley RISC-I (1982)<br />
◦ SPARC<br />
• Berkeley RISC-II (1984)<br />
◦ Intel 860<br />
• Stanford MIPS R4000, R6000<br />
◦ DEC Alpha<br />
• HP Spectrum<br />
• Motorola 88000<br />
◦ PowerPC<br />
3
Processori RISC: Unità di<br />
Controllo<br />
◦ Le istruzioni RISC non hanno la<br />
complessità delle microistruzioni CISC;<br />
per questa ragione l’unità di controllo dei<br />
RISC non è microprogrammata ma<br />
cablata.<br />
Processori RISC: Load & Store<br />
◦ Le uniche istruzioni che coinvolgono la<br />
memoria sono LOAD (memoria ⇒<br />
registro) e STORE (registro ⇒ memoria).<br />
Questo permette di semplificare il formato<br />
delle istruzioni e di ridurre sensibilmente<br />
il loro numero (ad es, nel VAX ci sono 25<br />
tipi di ADD; nei RISC 2).<br />
Processori RISC: Istruzioni<br />
◦ I RISC hanno un formato delle istruzioni<br />
fisso o con poche alternative: il codice<br />
operativo ha di solito una lunghezza fissa;<br />
ne conseguono alcuni vantaggi:<br />
• la decodifica del codice operativo può avvenire<br />
in parallelo con il caricamento degli operandi<br />
dai registri<br />
• l’unità di controllo è più semplice<br />
• la fase di fetch è più ottimizzata<br />
◦ I RISC possiedono un numero limitato di<br />
modi di indirizzamento.<br />
Processori RISC: Codice<br />
• I compilatori per RISC sono più semplici, in<br />
quanto producono codice composto da<br />
istruzioni più semplici; le sequenze ottimizzate<br />
per operazioni complesse possono essere<br />
predeterminate<br />
• Il codice generato per un RISC ha dimensioni<br />
comparabili con quelle per un CISC in quanto:<br />
• il numero di istruzioni RISC generate è<br />
maggiore ma<br />
• ogni istruzione occupa un numero inferiore di<br />
byte (anche perché si riducono gli accessi in<br />
memoria)<br />
• Codici più corti sono più efficienti perché:<br />
• si riduce il numero di fetch<br />
• si riduce il numero di page fault.<br />
Architettura di base [cont.]<br />
Architettura di base [cont.]<br />
PC<br />
M<br />
U<br />
X<br />
4<br />
A<br />
d<br />
d<br />
Memoria<br />
Istruzioni<br />
NPC<br />
IR<br />
Registri<br />
A<br />
B<br />
Imm<br />
M<br />
U<br />
X<br />
M<br />
U<br />
X<br />
=0 ?<br />
A<br />
L<br />
U<br />
Memoria<br />
Dati<br />
M<br />
U<br />
X<br />
PC<br />
M<br />
U<br />
X<br />
4<br />
A<br />
d<br />
d<br />
Memoria<br />
Istruzioni<br />
NPC<br />
IR<br />
Registri<br />
A<br />
B<br />
Imm<br />
Dati e Istruzioni sono memorizzati<br />
in due memorie separate: cache<br />
dati e cache istruzioni.<br />
M<br />
U<br />
X<br />
M<br />
U<br />
X<br />
=0 0?<br />
A<br />
L<br />
U<br />
Memoria<br />
Dati<br />
M<br />
U<br />
X<br />
4
Architettura di base [cont.]<br />
Architettura di base [cont.]<br />
M<br />
U<br />
X<br />
Le istruzioni sono<br />
codificate su 32 bit.<br />
=0 ?<br />
M<br />
U<br />
X Next Program Counter:<br />
contiene l’indirizzo della =0 ?<br />
prossima istruzione.<br />
PC<br />
4<br />
A<br />
d<br />
d<br />
Memoria<br />
Istruzioni<br />
NPC<br />
IR<br />
Registri<br />
A<br />
B<br />
M<br />
U<br />
X<br />
M<br />
U<br />
X<br />
A<br />
L<br />
U<br />
Memoria<br />
Dati<br />
M<br />
U<br />
X<br />
PC<br />
4<br />
A<br />
d<br />
d<br />
Memoria<br />
Istruzioni<br />
NPC<br />
IR<br />
Registri<br />
A<br />
B<br />
M<br />
U<br />
X<br />
M<br />
U<br />
X<br />
A<br />
L<br />
U<br />
Memoria<br />
Dati<br />
M<br />
U<br />
X<br />
Imm<br />
Imm<br />
Architettura di base [cont.]<br />
Architettura di base [cont.]<br />
M<br />
U<br />
X<br />
La CPU contiene un<br />
insieme di registri che<br />
contengono i dati su cui<br />
=0 ?<br />
la ALU lavora.<br />
M<br />
U<br />
X<br />
Gli operandi su cui la<br />
ALU lavora vengono<br />
prelavati dai registri e<br />
messi in due registri<br />
speciali A e=0 B. ?<br />
PC<br />
4<br />
A<br />
d<br />
d<br />
Memoria<br />
Istruzioni<br />
NPC<br />
IR<br />
Registri<br />
A<br />
B<br />
Imm<br />
M<br />
U<br />
X<br />
M<br />
U<br />
X<br />
A<br />
L<br />
U<br />
Memoria<br />
Dati<br />
M<br />
U<br />
X<br />
PC<br />
4<br />
A<br />
d<br />
d<br />
Memoria<br />
Istruzioni<br />
NPC<br />
IR<br />
Registri<br />
A<br />
B<br />
Imm<br />
M<br />
U<br />
X<br />
M<br />
U<br />
X<br />
A<br />
L<br />
U<br />
Memoria<br />
Dati<br />
M<br />
U<br />
X<br />
PC<br />
M<br />
U<br />
X<br />
4<br />
Architettura di base [cont.]<br />
A<br />
d<br />
d<br />
Memoria<br />
Istruzioni<br />
NPC<br />
IR<br />
Registri<br />
=0 ?<br />
M<br />
A U<br />
Se l’operazione X A specifica<br />
un indirizzamento L Memoria<br />
immediato, B<br />
Dati<br />
M il Udato viene<br />
messo nel U registro Imm.<br />
X<br />
Imm<br />
M<br />
U<br />
X<br />
PC<br />
M<br />
U<br />
X<br />
4<br />
Architettura di base [cont.]<br />
A<br />
d<br />
d<br />
Memoria<br />
Istruzioni<br />
NPC<br />
La ALU esegue operazioni aritmetiche/logiche<br />
e di salto.<br />
I dati su cui opera sono memorizzati in:<br />
• A, Imm: trasferimento dati o<br />
aritmetico/logica<br />
• A,B: aritmetico/logica<br />
=0 ?<br />
• NPC, Imm: trasferimento del controllo.<br />
IR<br />
Registri<br />
A<br />
B<br />
Imm<br />
M<br />
U<br />
X<br />
M<br />
U<br />
X<br />
A<br />
L<br />
U<br />
Memoria<br />
Dati<br />
M<br />
U<br />
X<br />
5
Architettura di base [cont.]<br />
Instruction Fetch (IF)<br />
Instruction fetch<br />
M<br />
U<br />
X<br />
Decode/<br />
Register fetch<br />
Execute<br />
=0 ?<br />
Memory<br />
Access<br />
Write<br />
back<br />
◦ Preleva dalla IM l’istruzione che deve<br />
essere eseguita espressa su 32 bit<br />
◦ Incrementa il PC.<br />
PC<br />
4<br />
A<br />
d<br />
d<br />
Memoria<br />
Istruzioni<br />
NPC<br />
IR<br />
Registri<br />
A<br />
B<br />
M<br />
U<br />
X<br />
M<br />
U<br />
X<br />
A<br />
L<br />
U<br />
Memoria<br />
Dati<br />
M<br />
U<br />
X<br />
Imm<br />
Decode/Register Fetch (ID)<br />
◦ Decodifica l’istruzione<br />
◦ Accedere ai registri general purpose per<br />
prelevare gli operandi e li memorizza nei<br />
registri dedicati A e B<br />
◦ Se l’indirizzamento è immediato,<br />
memorizza l’operando nel registro Imm.<br />
Execute (EX)<br />
◦ Esegue l’operazione richiesta, che può<br />
essere:<br />
• Calcola il risultato di una operazione aritmetica<br />
• Calcola il risultato di una operazione logica<br />
• Calcola l’indirizzo in DM per una operazione di<br />
trasferimento dati<br />
• Calcola l’indirizzo in IM a cui si deve fare<br />
accesso in seguito ad un salto.<br />
Memory Access (MEM)<br />
◦ Nel caso di operazione di trasferimento<br />
dati accede alla DM<br />
◦ Nel caso di salto condizionato o meno<br />
aggiorna il PC.<br />
Write Back (WB)<br />
◦ Aggiorna i registri general purpose sulla<br />
base del risultato dell’ALU.<br />
6
Architettura di base [cont.]<br />
◦ I moduli IF, ID, EX, MEM, WB eseguono il<br />
loro compito in un colpo di clock<br />
◦ Il processore qui descritto esegue:<br />
• Tutte le istruzioni in 5 colpi di clock<br />
• Le istruzioni di salto in 4 colpi di clock.<br />
Esempio di funzionamento<br />
CC1 CC2 CC3 CC4 CC5 CC6<br />
Istruzione i IF ID EX MEM WB<br />
Istruzione i+1 IF ID<br />
Fine esecuzione istruzione i.<br />
Al prossimo colpo di clock inizierà<br />
l’esecuzione dell’istruzione i+1.<br />
Esempio di funzionamento [cont.]<br />
CC1 CC2 CC3 CC4 CC5 CC6<br />
Istruzione i IF ID EX MEM WB<br />
Istruzione i+1 Durante ID della istruzione i la<br />
porzione di CPU che serve per<br />
IF ID<br />
eseguire IF non fa nulla.<br />
Osservazione<br />
◦ Durante il ciclo di clock CC j dell’istruzione<br />
i solo una della unità funzionali sta<br />
lavorando, le altre sono inerti<br />
◦ Sovrapponendo le operazioni necessarie<br />
per eseguire istruzioni differenti:<br />
• Si mantengono operative tutte le unità<br />
funzionali della CPU<br />
• Si aumentano le prestazioni della CPU.<br />
Pipeline<br />
CC1 CC2 CC3 CC4 CC5 CC6<br />
Istruzione i IF ID EX MEM WB<br />
Pipeline [cont.]<br />
CC1 CC2 CC3 CC4 CC5 CC6<br />
Istruzione i IF ID EX MEM WB<br />
Istruzione i+1<br />
IF ID EX MEM WB<br />
Istruzione i+1<br />
IF ID EX MEM WB<br />
Istruzione i+2<br />
IF ID EX MEM<br />
Istruzione i+2<br />
IF ID EX MEM<br />
Istruzione i+3<br />
IF ID EX<br />
Istruzione i+3<br />
IF ID EX<br />
Istruzione i+4<br />
Istruzione i+5<br />
IF<br />
ID<br />
IF<br />
Istruzione i+4<br />
Istruzione i+5<br />
Dopo 5 cicli di clock la<br />
pipeline è piena, ogni unità<br />
funzionale sta lavorando: si<br />
sovrappone l’esecuzione di<br />
5 diverse istruzioni.<br />
IF<br />
ID<br />
IF<br />
7
Pipeline [cont.]<br />
CC1 CC2 CC3 CC4 CC5 CC6<br />
Istruzione i IF ID EX MEM WB<br />
Pipeline [cont.]<br />
CC1 CC2 CC3 CC4 CC5 CC6<br />
Istruzione i IF ID EX MEM WB<br />
Istruzione i+1<br />
IF ID EX MEM WB<br />
Istruzione i+1<br />
IF ID EX MEM WB<br />
Istruzione i+2<br />
Il risultato della IFistruzione ione ID i<br />
EX MEM<br />
viene prodotto dopo 5 colpi<br />
Istruzione i+3 di clock: latenza della IF ID EX<br />
pipeline.<br />
Istruzione i+4<br />
IF ID<br />
Istruzione i+5<br />
IF<br />
Istruzione i+2<br />
IF ID EX MEM<br />
Istruzione i+3<br />
Istruzione i+4<br />
Istruzione i+5<br />
IF ID EX<br />
Quando la pipeline è piena i IF<br />
risultati delle istruzioni vengono<br />
scritti ad ogni colpo di clock: è<br />
come se la CPU eseguisse una<br />
istruzione un 1 ciclo di clock.<br />
ID<br />
IF<br />
Pipeline [cont.]<br />
◦ La pipeline aumenta il numero di<br />
istruzioni che la CPU è in grado di<br />
completare nell’unità di tempo:<br />
throughput<br />
◦ La pipeline NON riduce il tempo<br />
necessario per eseguire una singola<br />
istruzione<br />
◦ In generale la gestione della pipeline<br />
comporta un overhead: il tempo di<br />
esecuzione di una istruzione AUMENTA.<br />
Aumento del throughput<br />
◦ Un aumento del throughput comporta una<br />
riduzione del tempo di esecuzione dei<br />
programmi, e quindi un aumento della<br />
velocità<br />
◦ Questo risultato si ottiene benchè la<br />
pipeline AUMENTI il tempo necessario per<br />
eseguire una singola istruzione.<br />
Osservazione<br />
◦ Ogni operazione nella pipeline avviene in<br />
un colpo di clock<br />
◦ La durata del colpo di clock dipende dalla<br />
unità più lenta tra quelle presenti nella<br />
CPU: si può dare il colpo di clock solo<br />
quando tutte le unità funzionali hanno<br />
completato il loro lavoro.<br />
Esempio<br />
◦ CPU con frequenza di clock di 10 ns<br />
◦ Tutte le istruzioni richiedono 5 colpi di<br />
clock<br />
◦ Overhead dovuto alla pipeline 1 ns<br />
◦ Tempo di esecuzione di una istruzione:<br />
• Senza pipeline: 5 · 10 ns = 50 ns<br />
• Con pipeline: 1 ns + 10 ns = 11 ns<br />
◦ Miglioramento: 50/11 = 4.5<br />
8
Processore con Pipeline<br />
EX/MEM<br />
M<br />
U<br />
X<br />
IF/ID<br />
ID/EX<br />
=0 ?<br />
MEM/WB<br />
PC<br />
4<br />
A<br />
d<br />
d<br />
Memoria<br />
Istruzioni<br />
Registri<br />
M<br />
U<br />
X<br />
M<br />
U<br />
X<br />
A<br />
L<br />
U<br />
Memoria<br />
Dati<br />
M<br />
U<br />
X<br />
9