Lezione n.19 Processori RISC e CISC 1
Processori RISC e Superscalari Motivazioni che hanno portato alla realizzazione di queste architetture Sommario: Confronto tra le architetture CISC e RISC Prestazioni Architetture CISC E RISC Tradizionalmente sono stati seguiti due approcci alla progettazione di un Unità di Controllo (UC), cioè della parte della CPU che controlla il movimento dei dati. Logica cablata (tramite circuiti sequenziali) Logica microprogrammata (tramite microistruzioni) Evoluzione In origine venne usata la logica cablata Hard Wired (non modificabile). Era un metodo molto rigido, perché veniva fatta a livello di progetto fisico con connessioni vere e proprie. La microprogrammazione si affermò negli anni 60 come approccio ordinato alla progettazione (in termini di metodo di progettazione). L approccio tramite microprogrammazione offre il vantaggio di una maggiore flessibilità: Il progettista può intervenire fino all ultimo sul microprogramma, anche sostituendo o modificando le istruzioni. Facilità nella realizzazione di istruzioni di macchina complesse e potenti Tutto ciò portò allo sviluppo di calcolatori che avevano istruzioni molto complesse, in pratica operazioni che coinvolgevano molti trasferimenti ed elaborazioni dati. Questa categoria di macchine è stata successivamente nominata CISC (Complex Instruction Set Computers). Un esempio di macchina con un set d istruzioni complesso e il 68000. Motivazioni per i CISC Negli anni 60 ci fu il problema della software craising (crisi del software), ossia la costruzione del software aveva costi molto elevati. I motivi principali che hanno portato allo sviluppo dei processori CISC sono essenzialmente tre: 1. Riduzione del gap tra linguaggio macchina e linguaggio di programmazione. Il gap è inteso in termini di numero di istruzioni. Questo significa che con 2
l approccio CISC, dato un programma scritto in linguaggio d alto livello, si produce un minor numero d istruzioni macchina rispetto all approccio RISC, riducendo così il tempo d esecuzione del programma. 2. Programmi compatti: le istruzioni erano in grado di eseguire più operazioni. Questo forniva un vantaggio economico in quanto la memoria era cara negli anni 60. 3. La memoria centrale era più lenta della memoria di controllo. Si cercava allora di portare in memoria di controllo i programmi, perché questa memoria era più veloce. Tuttavia, ci si accorse che queste istruzioni portavano ad un elevato numero medio di cicli di clock nella memoria di controllo (ci volevano molte microistruzioni per poter eseguire un istruzione complessa). Questo era causa di lentezza. Inoltre i profili d esecuzione mostravano che l 80% delle istruzioni eseguite corrispondeva al solo 20% del repertorio d istruzioni. In pratica venivano eseguite solo le istruzioni più semplici, STORE, CALL, ADD e qualche altra. Altri punti a svantaggio dell approccio CISC erano inoltre i seguenti: La RAM diveniva sempre più veloce Veniva introdotta la memoria CACHE Quindi non c era più necessità di eseguire il programma nella memoria di controllo. Si pensarono allora nuovi criteri tra cui: Ottimizzare quel 20%, cioè il repertorio delle istruzioni più semplici, perché fa l 80% del lavoro. Questo significa: rinunciare alle istruzioni più complesse che sappiamo richiedono più cicli di clock contare sulla velocità della cache Si pensò allora la seguente strategia: creare un repertorio d istruzioni semplificato o istruzioni tutte della stessa dimensione o pochi formati in modo da facilitare la decodifica anche con la logica cablata. Questo portò al ritorno della logica cablata che era stata soppiantata dalla microprogrammazione. o decodifica ordinata Contare sul compilatore o Per utilizzare in modo ottimo le operazioni di macchina o Qualunque sia la complessità del linguaggio di programmazione d alto livello Nacquero così, sulla base di quelle osservazioni le architetture RISC 3
RISC L approccio RISC prevede l uso di istruzioni molto semplici, quindi sono necessarie più istruzioni RISC per risolvere un dato problema. Dall altra parte però queste istruzioni possono essere realizzate in logica cablata, consentendo di raggiungere alte velocità d esecuzione. Le architetture RISC hanno un elevato numero di registri di CPU. In questo modo una variabile può rimanere in un registro per lungo tempo e quindi essere riutilizzata in futuro con maggiore velocità (accesso alla CPU più veloce). Solo quando tutti i registri sono occupati, allora la variabile inutilizzata potrebbe essere esclusa dal registro. Con i RISC, le operazioni di manipolazione avvengono solo tra registri di CPU. L idea era quella di eliminare le operazioni di manipolazione tra memoria e CPU ottenendo una minimizzazione del traffico con la memoria. Quindi le uniche operazioni che richiedono l accesso alla memoria sono solo LOAD e STORE. Un esempio di processore RISC è il POWER PC. Vediamo il formato di un istruzione del POWER PC. Le istruzioni sono tutte a 32 bit. Il codice operativo ha una lunghezza fissa (tipicamente 6 bit). I formati sono 3 o 4. Registri: 3 campi operandi OP Rd Ra Rb FUN Campo di operazione di 6 bit Campo usato per distinguere le varie operazioni OP Rd Ra Displ/Imm OP Indirizzo lungo 4
L unità di controllo di una macchina CISC è di tipo microprogrammato, mentre l unità di controllo delle macchine RISC è realizzata in logica cablata. Esempio Istruzioni aritmetiche nel formato RISC ADD R1,R2,R5; -------------------R1:=R2+R5 MUL R7,R9,R10;------------------R7:=R9*R10 SUB R3,R3,R3;--------------------R3:=R3-R3=0 Queste istruzioni hanno tutte 3 registri di cui due sorgenti (es.r2 e R5 per la ADD e R9 e R10 per la MUL) ed uno destinazione (R1 per la ADD, R7 per la MUL). Il RISC esegue un istruzione in un colpo di clock, mentre il CISC richiede più colpi di clock per eseguire un istruzione. Si ricorda che l esecuzione di un istruzione richiede le seguenti fasi: 1. fetch 2. decodifica 3. esecuzione vera e propria (ALU) 4. memorizzazione del risultato in un registro 5. eventuale scrittura in memoria PRESTAZIONI Dato un generico programma, ci si chiede quali siano i fattori che influenzano le prestazioni del sistema. Questo programma è scritto in linguaggio d alto livello e viene poi tradotto in linguaggio macchina dal compilatore. Indichiamo con: N: numero complessivo d istruzioni macchina che devono essere eseguite CPI: numero medio di colpi di clock per istruzione macchina f=1/t: frequenza di clock, con T periodo di clock t: tempo impiegato per l esecuzione del programma Si ottiene che il tempo t per l esecuzione del programma è dato dalla seguente espressione: N CPI t = N CPI T = f il prodotto N*CPI costituisce il numero di cicli di macchina. Le prestazioni del sistema saranno tanto migliori tanto più piccolo è t. 5
t dipende dalla tecnologia, quindi da T, cioè dal periodo/frequenza di clock. Ricordiamo che T dipende dalla capacità d integrazione e quindi dalla capacità di costruire circuiti sempre più piccoli e più veloci. N dipende dal compilatore. Se il compilatore è scadente N sarà alto, se invece è buono N sarà basso. t dipende dall architettura perché N, CPI e T dipendono dall architettura. Infatti, se la macchina è fatta in modo complesso, è probabile che i percorsi tra un registro e una destinazione del contenuto del registro, siano lunghi e quindi poiché il clock scandisce il funzionamento della macchina è necessario che il clock sia sufficiente a fare quel trasferimento. CPI dipende solamente dall architettura poiché il clock dipende dal repertorio d istruzioni e da come è fatta la macchina e da quanto complesse sono le istruzioni. N dipende anche dall architettura perché se il repertorio di macchina consente con una sola istruzione di fare molte cose allora N sarà piccolo. Le macchine RISC fanno aumentare N, però cercano di ridurre in misura maggiore l influenza di T e CPI rispetto a N. BLOCCHI PER UNA CPU Vogliamo costruire una macchina che soddisfi un basso CPI. Vediamo quali sono i registri interessati quando si effettua il prelievo di un istruzione. 1. PC (Program Counter) 2. IR (Instruction Register) 3. Memoria Istruzione anche se non fa parte della CPU, ma interviene ugualmente. Stiamo supponendo che la memoria sia divisa in memoria istruzioni e memoria dati. L architettura del calcolatore sarà caratterizzata certamente da una parte che fa il prelievo dell istruzione. Questa parte è composta da un Program Counter (PC) che ci dice dove prendere la prossima istruzione in memoria. Poi ci sarà il Registro Istruzioni (IR) che è quel registro dove si mette l istruzione presa dalla memoria per poi decodificarla. Con le macchine attuali, la CPU legge ormai dalla Cache Memory, che è una memoria piccola ma veloce posta nello stesso circuito integrato della CPU ed è divisa in memoria istruzioni e memoria dati. Vediamo ora uno schema a blocchi rappresentativo della fase del prelievo di un istruzione 6
Program Counter (PC) Memoria Istruzioni (MI) Intruction Register (IR) UC Il PC genera l indirizzo e nell Instruction Register andrà il codice dell istruzione. Ovviamente il Program Counter andrà incrementato per selezionare l istruzione successiva da eseguire, oppure andrà modificato se c è da fare un salto (JUMP X). Tutta questa fase viene comandata dall Unità di Controllo UC. Dopo questa fase di prelievo dell istruzione, l UC deve interpretare il contenuto dell Instruction Register. Inizierà quindi la fase di decodifica dell istruzione. Decodifica dell istruzione Una volta che l istruzione è stata prelevata c è da decodificarla. Quindi la fase di decodifica necessita di : 1. un decodificatore 2. Register File 3. IR Se facciamo l ipotesi che le operazioni avvengano solo nei registri è sicuro che nella fase di esecuzione qualche registro verrà utilizzato, a meno che l istruzione non sia un istruzione di salto, che sappiamo non tiene conto di nessun registro. Allora in questa fase si leggeranno i registri e si presentano alla fase successiva i loro contenuti. 7
IR Decodificatore RF Blocco dove stanno i registri di macchina La logica di questa parte di decodifica è la seguente: Il contenuto di IR viene decodificato dal decodificatore D, che è in pratica l Unità di Controllo. L Unità di Controllo D genera i segnali di comando verso le varie parti di cui una verso RF e altri segnali verso destra nella quale risiedono gli stadi successivi. Ricordiamo che il primo stadio è quello di prelievo dell istruzione, il secondo stadio è quello di decodifica, il terzo stadio è invece quello di esecuzione. Esecuzione Nello stadio di esecuzione c è la ALU (Unità Aritmetica Logica). RF ALU UC Quello che esce dal Register File (RF) arriva alla ALU che fa le operazioni tra gli operandi di RF. Anche in questo stadio c è l UC che da il comando alla ALU dicendogli: devi fare la moltiplicazione o la somma o la divisione, etc. Il quarto stadio è la fase di accesso alla memoria. 8
Accesso alla memoria Un istruzione può richiedere la lettura o scrittura in memoria. Lo schema a blocchi rappresentativo di questa fase è il seguente: ALU Memoria Dati MD RF Esce il risultato UC Dalla ALU esce il risultato dell operazione svolta dalla ALU stessa (può essere anche il calcolo di un indirizzo di memoria. Il Register File RF è il luogo dal quale si prendono i dati per metterli in memoria oppure il luogo dove finirà il dato letto dalla memoria. Il tutto è comandato dall unità di controllo. L ultima fase è un eventuale fase di scrittura registri. Scrittura registri (fase di Write Back) Il dato calcolato dalla ALU o letto dalla memoria viene preso e portato in un registro di destinazione. ALU MUX RF MD Operazione di Load UC 9
Se l operazione era per esempio ADD, il risultato in uscita dalla ALU viene messo in un registro di RF. Se l operazione è un operazione di lettura dalla memoria dati (MD), il dato verrà letto dalla memoria e caricato nel Register File (operazione di Load). Anche in questa fase l UC effettua il controllo delle varie operazioni, tra cui ha il compito di asserire la via del Mux, che deve poi alimentare RF, sulla base del codice d operazione. Ovviamente se un dato deve essere scritto in un registro, l UC deve far arrivare un clock che memorizzi il dato dentro il registro di destinazione selezionato. Complessivamente abbiamo il seguente schema a blocchi. MI IR UC PC RF ALU MD L Unità di Controllo genera tutti i segnali di controllo necessari. Il Program Counter ci fa leggere la memoria, (presenta l indirizzo alla memoria) nella quale è posta l istruzione, che viene poi decodificata dall UC, la quale attiva i segnali che comandano quello che normalmente è il percorso dati. Nel grafico vanno aggiunti ulteriori percorsi per tener conto di eventuali salti (istruzione di salto) e quindi modifica del PC. 10
Pipeline Le istruzioni vengono eseguite da più moduli, ognuno dei quali fa una certa elaborazione. I S1 IF S2 ID S3 EX S4 ME WB CK A regime ( la pipeline è piena) ed ad ogni colpo di clock viene eseguita un istruzione. S1= stadio 1 S4= stadio 4 IF=Instruction Fetch ID= Decodifica dell istruzione EX= esecuzione dell istruzione ME= Lettura in memoria WB= Write back (scrittura nei registri) 11