30.06.2015 Views

CALCOLATORI ELETTRONICI

CALCOLATORI ELETTRONICI

CALCOLATORI ELETTRONICI

SHOW MORE
SHOW LESS

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

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!