Berkeley RISC
# Berkeley RISC

Berkeley RISC è il nome dato a uno dei due progetti di ricerca sulle architetture RISC finanziato dal progetto VLSI project dell'ARPA. Il progetto venne gestito da David Patterson della Berkeley University tra il 1980 e il 1984. Nello stesso periodo alla Stanford University si svolgeva l'altro progetto, che, tra il 1981 e il 1984, portò allo sviluppo dei processori MIPS. Comunque il progetto Berkeley RISC è il progetto che più ha influenzato lo sviluppo dei processori RISC e le scoperte di questo gruppo sono state utilizzate da praticamente tutti i progettisti di CPU RISC. Il progetto portò allo sviluppo dell'architettura SPARC.

## L'idea RISC

Gli scienziati del progetto RISC e MIPS sono partiti dalla constatazione che la maggior parte dei programmi non sfruttasse tutte le istruzioni dei processori, ma che in realtà ne utilizzasse solo un piccolo sottoinsieme. Si è notato che l'intero sistema operativo UNIX, una volta compilato, utilizzava solamente il 30% delle istruzioni messe a disposizione dal Motorola 68000. Quindi il processore aveva un elevato numero di transistor preposti a decodificare e ad eseguire istruzioni che in realtà non vengono mai chiamate. L'idea dei processori RISC è di implementare solamente quelle istruzioni che vengono realmente utilizzate dai programmi e di utilizzare gli altri transistor per velocizzare i processori.

I processori RISC si concentrarono sull'aggiunta di molti registri, che il programma poteva utilizzare per memorizzare i valori intermedi dei dati, in modo da evitare accessi alla lenta memoria centrale. Un buon compilatore era in grado di generare del codice che sfruttasse intensamente i registri, riducendo di molto gli accessi alla memoria e innalzando quindi le prestazioni. A parità di transistor un processore RISC era molto più veloce di un classico processore CISC.

I processori RISC inoltre eliminarono molti modi di indirizzamento e consentirono solamente il trattamento di dati memorizzati nei registri. Solamente le istruzioni di load e di store potevano accedere alla memoria. In un processore classico l'istruzione ADD poteva accettare come parametro dati in memoria. Nel caso di un'elaborazione di dati dalla memoria il processore avrebbe dovuto caricare i dati in alcuni registri nascosti, eseguire l'elaborazione vera e propria e poi salvare i dati nuovamente in memoria. Quindi il processore doveva avere una complessa unità decodifica e dei registri nascosti. Un processore RISC eliminando questa modalità di accesso rende l'unità di decodifica più semplice e non necessita di registri nascosti. Il rovescio della medaglia è che i programmi devono sempre prevedere esplicitamente il caricamento e il salvataggio dei dati dai registri e quindi sono mediamente più grandi.

Quando venne sviluppato il progetto RISC la memoria era un componente molto costoso e quindi ridurre la densità di istruzioni memorizzate nella memoria poteva avere un reale effetto economico sulle macchine. Per ridurre questo effetto si decise di utilizzare parole di 32 bit una parola molto lunga per l'epoca. Una parola così grande permetteva di memorizzare direttamente delle piccole costanti all'interno dell'istruzione in modo da ridurre gli accessi alla memoria. Inoltre spesso i programmi utilizzavano con elevata frequenza gli stessi dati e quindi invece di salvare i dati in memoria il processore li memorizzava in un registro per averlo subito pronto durante il successivo uso, questo rendeva il processore molto più rapido in teoria. Per esempio una funzione matematica poteva caricare dalla memoria i dati e poi lavorare solo sui registri rendendo il programma molto rapido.

Comunque ad un osservatore esterno non era evidente se il paradigma RISC avrebbe realmente migliorato le prestazioni. L'unico modo per verificarlo era eseguire delle simulazioni e le simulazioni mostravano che il processore aveva delle prestazioni molto elevate.

Il progetto RISC e MIPS differivano notevolmente da come gestivano i registri. Il progetto MIPS aggiunse una serie di registri e li rese disponibili alle istruzioni mentre il progetto RISC seguì un approccio diverso. Il progetto RISC utilizzava il concetto di register window. Il processore aveva molti registri ma ne rendeva disponibili al programma solo un numero limitato. Quando il programma effettuava una chiamata di sistema il processore muoveva la register window verso un blocco libero di registri, questo evitava il salvataggio dei registri usati in memoria riducendo gli accessi alla memoria. Questa tecnica aveva lo svantaggio che se una procedura aveva molte variabili locali il processore si sarebbe trovato presto a corto di registri e quindi avrebbe dovuto salvare alcuni dati in memoria pur avendo altri registri ma che essendo fuori dalla finestra dei registri non risultano visibili. I ricercatori di Stanford ignorarono il concetto di finestra dei registri ritenendo che un compilatore intelligente avrebbe potuto far uso migliore dei registri rispetto a una gestione fissa come quella di Berkeley.

## RISC I

Il primo prodotto del progetto RISC fu un processore inizialmente chiamato Gold. La sua progettazione iniziò nel 1980 come parte del corso sulla progettazione VLSI ma la sua progettazione richiedeva prestazioni superiori a quelle fornite dai programmi di sviluppo dell'epoca. I programmi si bloccavano frequentemente e i progettisti dovettero riscrivere o adattare molti dei programmi per poter progettare il processore. La realizzazione del processore finale richiese un'ora di calcoli ad un VAX 11/780.

Il progetto finale del RISC I venne pubblicato sulla ACM nel 1981. Il processore aveva 44,500 transistor, implementava 31 istruzioni e conteneva 78 registri a 32 bit. Il processore gestiva sei finestre da 14 registri l'una e 18 registri globali. L'unità di controllo e di decodifica occupava solamente il 6% dei transistor mentre in un processore classico queste unità occupavano il 50% dei transistor. L'unità che occupava più spazio era quella dei registri. Considerando la potenza del processore la microarchitettura era molto semplice e lineare.

RISC I per incrementare le prestazioni utilizzava una pipeline a due stadi ma senza un riordino delle istruzioni come fanno le moderne CPU. Il processore aveva problemi a gestire i salti condizionati dato che comunque eseguiva l'istruzione subito dopo il salto indipendentemente dal risultato del salto. Il compilatore doveva mettere dopo il salto un'istruzione indipendente dal salto e spesso per semplicità metteva una NOP.

Dopo un mese passato a validare ed eliminare i bug del progetto, i progettisti il 22 giugno 1981 si rivolsero alla fonderia MOSIS per produrre il processore con una tecnologia a 2 µm (2000 nanometri secondo la scala moderna). Una serie di incidenti e di ritardi costrinsero la fonderia a rifare quattro volte le maschere del processore e i primi esemplari funzionanti non furono disponibili che nel maggio 1982. Il primo computer funzionante basato sul processore entrò in funzione l'11 giugno. Il test del processore mostrò dei risultati deludenti, le istruzioni venivano eseguite in 2 µs sebbene il progetto originario prevedesse l'esecuzione in 400 ns, il processore era cinque volte più lento del previsto. La spiegazione di questo difetto non è mai stata chiarita completamente, ma alcune istruzioni erano eseguite alla velocità prevista e quindi si presume che sia stato un problema di produzione più che di progettazione.

Quando il progetto funzionò a piena velocità le prestazioni si dimostrarono eccellenti. Simulazioni basate su una serie di piccoli programmi eseguiti sul RISC I a 4 Megahertz, sul VAX 11/780 a 5 Megahertz e sul processore a 16 bit Zilog Z8000 a 5 Megahertz furono chiarificanti. I programmi erano circa il 30% più grande degli equivalenti programmi VAX e grande quasi quanto quelli dello Z8000. Quindi la temuta esplosione di dimensione del codice non si verificava mentre il RISC I si dimostrava due volte più rapido del VAX e quattro volte più rapido dello Z8000. Era molto interessante notare che il processore effettuava all'incirca lo stesso numero di accessi di un processore CISC, questo era merito dell'ampio numero di registri che limitavano gli accessi alla memoria.

Il successo del processore inoltre va valutato nel contesto tecnologico dell'epoca. Se anche il RISC I fosse stato più lento del VAX sarebbe stato comunque un successo. Era un processore RISC a 32 bit reali che era stato prodotto da una fonderia con processi produttivi antiquati. In un disegno tradizionale buona parte del chip è dedicato all'unità di decodifica; un processore tradizionale come il Motorola 68020 richiese la costruzione di nuove fonderie per poterlo produrre in modo economico. Se la stessa fonderia avesse prodotto il RISC I, il divario tra i processori sarebbe stato schiacciante.

## RISC II

Mentre il progetto RISC I procedeva verso la sua realizzazione i ricercatori di Berkeley iniziarono a svilupparne la nuova versione che prese il nome in codice di Blue. I lavori su Blue avanzarono con maggior lentezza del progetto Gold. Questo fu dovuto sia alla mancanza di urgenza sia al cambio di team di sviluppo e di studenti. Il nuovo progetto inglobò diverse nuove caratteristiche e migliorie che ne incrementarono le prestazioni.

La differenza chiave tra i processori era che il nuovo progetto eliminava una delle tre linee dedite alla gestione della cache riducendo notevolmente la dimensione del gestore dei registri. Questo cambiamento richiedeva uno stretto accorpamento con il bus di sistema ma era un piccolo prezzo da pagare per ottenere un sistema molto più veloce e quindi delle prestazioni più elevate.

Il nuovo progetto era molto più parco del precedente. Mentre Gold conteneva 78 registri e sei finestre, Blue aveva 138 registri divisi in 7 finestre da 32 registri e 10 registri globali. La presenza di più registri in ogni finestra aumentava la possibilità di avere i dati direttamente nei registri senza dover accedere alla memoria. Inoltre il nuovo progetto era talmente efficiente che, pur avendo quasi il doppio dei registri del progetto precedente, occupava meno transistor. Quando il progetto venne passato alla fonderia occupava 39.000 transistor e venne chiamato RISC II.

Un'altra caratteristica importante del processore era che includeva un formato di istruzioni che permetteva di espanderne alcune. Alcune istruzioni che utilizzavano solo un operatore o che non ne utilizzano nessuno (come la NOP) venivano memorizzate in un formato compatto a 16 bit che poi veniva espanso in istruzioni a 32 bit in modo trasparente all'interno del processore prima di arrivare all'ALU. Questo stratagemma permise di ridurre la dimensione del codice del 30% migliorando la densità del codice inoltre un programma funzionava più rapidamente su Blue rispetto a Gold per via dei minori accessi alla memoria.

RISC II venne prodotto dalla fonderia in modo corretto e le sue prestazioni furono molto interessanti. Il prestazioni del processore dipendevano dai programmi in esecuzione ma il processore forniva rispetto al VAX prestazioni comprese tra l'85% e il 256%. Quindi il RISC II riusciva a superare il VAX più di due volte in alcuni programmi. Il team confrontò il processore con il Motorola 68000 il migliore processore allora in commercio. Il RISC II superò sempre il 68000 e fornì prestazioni comprese tra il 140% e il 420%.

## Sviluppi

Il progetto RISC terminò con la realizzazione del RISC II ma i suoi risultati sopravvissero al progetto. Il core fu riutilizzato per il progetto SOAP del 1984 che in sostanza utilizzava il core RISC per far funzionare codice Smalltalk e in seguito nel progetto VLSI-BAM che realizzò un processore in grado di far funzionare programmi in Prolog invece dello Smalltalk. Un'altra evoluzione fu SPUR un set di chip sviluppati per realizzare una completa workstation a 32 bit.

Il progetto RISC è meno famoso di altri progetti ma fu la base del processore commerciale SPARC processore sviluppato dalla Sun Microsystems. Fu la Sun con la prima SPARCstation a dimostrare la netta superiorità del progetto RISC sugli altri progetti, la sua macchina era superiore a quella di qualsiasi altro produttore. I produttori di praticamente ogni macchina basata su UNIX si convertirono a processori RISC che portarono allo sviluppo dei processori DEC Alpha e dei PA RISC. La SGI invece acquisì la MIPS Computer Systems. Dal 1986 i maggiori produttori mondiali di semiconduttori crearono processori RISC come il Motorola 88000, il Fairchild Clipper, l'AMD 29000 l'Intel i880 e il PowerPC

Con il passare degli anni il paradigma RISC si diffuse sempre più anche architetture classicamente CISC come la x86 dell'Intel internamente oramai lavora come un processore RISC. Gli ultimi processori x86 ricevono le istruzioni CISC, le convertono in istruzioni RISC e le elaborano internamente come classici processori RISC. L'area dedicata a questa conversione è ridotta rispetto all'area totale del processore e quindi il processo di conversione è conveniente. Con l'avvento di questi processori la distinzione tra processori CISC e processori RISC si è fatta molto labile e sfumata.

