Loading AI tools
tipo di architettura Da Wikipedia, l'enciclopedia libera
Reduced Instruction Set Computer (RISC), nell'elettronica digitale, indica un'architettura per microprocessori che predilige lo sviluppo di un'architettura semplice e lineare. Questa semplicità di progettazione permette di realizzare microprocessori in grado di eseguire il set di istruzioni in tempi minori rispetto a una architettura CISC.
I più comuni processori RISC sono AVR, PIC, ARM, DEC Alpha, PA-RISC, SPARC, MIPS, RISC-V, POWER e PowerPC.
All'inizio dell'industria dell'informatica i compilatori non esistevano ed i programmatori scrivevano direttamente in codice macchina o in assembly. Per facilitare il lavoro dei programmatori, i progettisti dei processori decisero di inserire nel set di istruzioni dei processori delle istruzioni anche molto complesse in modo da simulare le funzioni ad alto livello dei linguaggi di programmazione direttamente nei processori. Sempre al fine di facilitare lo sviluppo dei programmi, il set di istruzioni dei microprocessori permetteva dei metodi di indirizzamento dei dati complessi che consentivano di manipolare direttamente i dati in memoria, senza passare dai registri dei microprocessori. Questo non era in realtà possibile dato che il processore può elaborare solo dati contenuti nei registri (il Texas Instruments TMS9900 è un'eccezione), e quando il programmatore utilizzava questi metodi di accesso alla memoria il processore provvedeva a copiare il dato in un registro (a volte un registro riservato) per eseguire l'operazione e successivamente salvare il dato in memoria.
Un altro vantaggio dell'avere un set di istruzioni molto complesso è l'occupazione di memoria. Istruzioni molto complesse consentono di realizzare programmi compatti e all'inizio dell'informatica la memoria era una risorsa molto costosa. Ecco perché i processori avevano molte istruzioni e utilizzavano codifiche a lunghezza variabile di bit per definire le istruzioni in modo da massimizzare la densità di istruzioni.
Le CPU erano dotate di pochi registri per due motivi fondamentali:
Questi motivi spinsero i progettisti a realizzare istruzioni con metodi di accesso alla memoria molto complesse, per esempio erano comuni istruzioni in grado di caricare due dati, sommarli e poi salvare il risultato in memoria tutto utilizzando una sola istruzione. Un'altra versione della stessa istruzione caricherebbe i dati dalla memoria, li sommerebbe e salverebbe il dato in un registro per esempio. Una terza variante caricherebbe i dati dalla memoria e da un registro, eseguirebbe la somma e salverebbe i dati in un registro. I processori dotati di molte istruzioni di questo tipo vengono definiti processori CISC.
L'obiettivo principale di allora era realizzare processori che fossero in grado di eseguire operazioni con ogni possibile modo di indirizzamento. La possibilità di utilizzare memorie e registri come ingresso o uscita con le varie combinazioni era chiamata ortogonalità delle istruzioni. Sebbene questo complicasse la realizzazione dei processori si riteneva che velocizzasse i programmi dato che il programmatore poteva di volta in volta utilizzare il comando migliore a seconda del programma che stava scrivendo.
Verso la fine degli anni 70, ricercatori dell'IBM e di progetti analoghi dimostrarono che la maggior parte dei modi di indirizzamento non veniva utilizzato nei programmi. Questo era dovuto alla diffusione dei compilatori che, sostituendosi all'ottimizzazione a basso livello applicata dai programmatori, ignoravano i modi di indirizzamento più potenti per concentrarsi su quelli semplici. I compilatori di allora erano in grado di gestire solo le caratteristiche più semplici dei processori anche perché, all'epoca, la teoria dei compilatori era solo agli inizi. Comunque il mercato si stava muovendo con rapidità verso l'utilizzo sempre più massiccio dei compilatori, dato che i linguaggi ad alto livello permettevano di realizzare programmi con rapidità riusando il codice in modo efficiente.
Gli studi dimostrarono che molte istruzioni esotiche venivano utilizzate molto raramente e a volte erano più lente del codice scritto con le istruzioni generiche. L'esempio classico era l'istruzione INDEX
dei VAX: questa istruzione era più lenta di un loop implementato con le istruzioni comuni.
In quel periodo la velocità delle CPU e delle memorie era simile, ma era evidente l'incremento di velocità delle prime e pertanto in futuro si avrebbe avuto un divario sempre maggiore tra le due. Per ridurre il problema i progettisti pensarono di includere più registri e cache nei processori in modo da ridurre gli accessi alla memoria; i registri e la cache richiedevano molto spazio e allora si cercò di recuperare spazio riducendo la complessità dei processori.
Studi effettuati da informatici come Andrew Tanenbaum dimostrarono che le CPU prodotte allora erano molto sovradimensionate rispetto alle reali esigenze dei programmi. Tanenbaum dimostrò che il 98% delle costanti in un programma poteva essere memorizzato con parole di 13 bit sebbene la maggior parte delle CPU utilizzasse parole a multipli di 8 bit (8, 16, 24, ecc.) e quindi sprecassero spazio. Questi studi suggerirono di memorizzare le costanti nei bit non utilizzati del set di istruzioni, riducendo il numero degli accessi alla memoria; le costanti non verrebbero caricate dalla memoria o dai registri ma sarebbero state inglobate direttamente nel codice binario dell'istruzione rendendo la CPU più veloce ed efficiente. Tuttavia questo approccio richiedeva istruzioni con codifiche corte e una lunghezza di parola di almeno 32 bit per poter aver a disposizione uno spazio ragionevole per le costanti.
Dato che nelle applicazioni reali la maggior parte del tempo viene dedicata all'esecuzione di operazioni molto semplici, i ricercatori si concentrarono su queste operazioni comuni cercando di rendere la loro esecuzione il più veloce possibile. Visto che la massima velocità di funzionamento delle unità era limitata dal tempo necessario ad eseguire le istruzioni più lente e i modi di indirizzamento più esotici, si decise di eliminare le istruzioni e i modi di indirizzamento poco usati in modo da ottenere un set di istruzioni più snello contenente solo quelle istruzioni che effettivamente venivano richieste e che potevano essere ottimizzate per essere eseguite rapidamente, spesso in un solo ciclo di clock.[1]
L'obiettivo di ridurre le istruzioni portò all'ideazione del nome reduced instruction set computing (lett. "elaborazione con insieme di istruzioni ridotto"): un numero ridotto di istruzioni con metodi di accesso semplici e lineari che permetteva l'utilizzo di soluzioni di tipo pipeline dati. L'utilizzo di pipeline permette di realizzare microprocessori in grado di eseguire la maggior parte delle istruzioni in un ciclo di clock. In un'architettura CISC è molto più difficile includere una pipeline dato che i molteplici metodi di indirizzamento complicano nettamente il funzionamento dell'unità e perciò a parità di potenza di calcolo, un'architettura CISC a pipeline richiede molti più transistor di una architettura RISC a pipeline più significative di quella monoistruzione del CISC a 8 bit 6502.
L'acronimo RISC ha portato spesso dei fraintendimenti. Molti, leggendo «insieme di istruzioni ridotto», pensarono ad un insieme menomato, inadeguato a eseguire con semplicità programmi complessi. Invece i processori RISC moderni sono spesso dotati di un set di istruzioni molto completo, ma non forniscono metodi di indirizzamento esotici o istruzioni utilizzate raramente. Ispirati dalla filosofia RISC, sono state sviluppate macchine basate su set di istruzioni minimali come le MISC, le OISC e le transport triggered architecture, mentre alcune ricerche si sono mosse verso il Turing tarpit.
L'approccio RISC ha il grande vantaggio della velocità ma il suo principale svantaggio è l'occupazione di memoria da parte del codice. Essendo presenti solo istruzioni relativamente semplici, il codice scritto per macchine RISC tende ad essere più grande del codice scritto per macchine CISC.
Nel frattempo, gli ingegneri trovarono alcuni metodi e tecnologie migliori per incrementare la capacità dei processori senza aumentare la frequenza. All'inizio degli anni 1980 era diffusa l'idea che l'architettura avesse raggiunto il suo limite teorico di velocità. Si riteneva che nuovi incrementi di prestazioni si sarebbero ottenuti solamente grazie ai miglioramenti nei materiali semiconduttori o all'aumento di frequenza. Permettendo transistori più compatti, avrebbero permesso di innalzare la frequenza di funzionamento. Molti sforzi furono rivolti verso il calcolo parallelo e verso metodi di collegamento rapidi. Inoltre, il divario tra la velocità dei processori e delle memorie aumentava, perciò i progettisti iniziarono a studiare tecnologie che riducessero gli accessi alla memoria e aumentassero la velocità dei processori; tuttavia queste tecnologie erano molto difficili da implementare con metodi di accesso alla memoria complessi.
Le prime novità si registrarono nella progettazione di nuove pipeline dati. In una pipeline l'istruzione viene suddivisa in sotto operazioni elementari, che vengono svolte in sequenza dalle unità funzionali disposte come una catena di montaggio. Un normale processore ha una singola unità generica che preleva un'istruzione, la decodifica, carica gli operandi, esegue l'operazione vera e propria e salva il risultato. Queste fasi vengono svolte in modo sequenziale da un processore classico; un processore dotato di pipeline esegue invece queste operazioni in parallelo, dato che, come in una catena di montaggio, possiede più unità specialistiche, ognuna delle quali esegue una singola fase, incrementando in misura notevole le prestazioni.
Altra strategia per incrementare le prestazioni era la creazione di più unità funzionali che lavorassero in parallelo. Per esempio un processore con due unità aritmetiche può lavorare in parallelo su due istruzioni di somma raddoppiando le prestazioni. Questa replicazione delle unità funzionali combinate con le pipeline portò alla realizzazione di processori superscalari in grado di eseguire più di un'operazione per ciclo di clock. Queste nuove idee avevano lo svantaggio di richiedere molti transistor per essere implementate.
I RISC furono inizialmente avvantaggiati dalla semplicità di progetto, e il parco dei transistor lasciava molto spazio libero nel processore per poter implementare queste tecniche. I CISC, invece, con la loro architettura più complessa, si trovarono ad implementare con maggior difficoltà queste idee, anche perché il loro ampio set di istruzioni, e i molti modi di indirizzamento rendevano più complesso implementare una pipeline rispetto a un classico processore RISC. I primi RISC avevano prestazioni inferiori agli equivalenti CISC, ma i processori RISC colmarono presto il divario e all'inizio degli anni 90 superavano i processori CISC praticamente in ogni campo. Oltre a considerazioni di carattere prestazionale, il fatto di dedicare pochi transistor al core vero e proprio del processore permetteva al progettista di un processore RISC un approccio molto flessibile.
Con i molti transistor liberi si poteva per esempio:
I progetti RISC quasi sempre sviluppano i processori seguendo l'architettura Harvard. In questa architettura i flussi dei dati e i flussi delle istruzioni sono separati in modo da consentire al processore di funzionare senza interruzione e permettono al processore una gestione più rapida ed efficiente della cache. Questo vuol dire che, se il processore è dotato di cache, il programma non può modificare dinamicamente il suo codice, dato che le modifiche non verrebbero viste dalla cache del processore. Questo impedisce al codice automodificante di funzionare su questi processori.
Alcuni dei primi RISC con pipeline erano dotati di alcune peculiarità non desiderate, la più famosa è la branch delay slot. La branch delay slot indica il fatto che ogni volta che il processore incontrava una condizione di salto eseguiva comunque l'istruzione successiva al salto anche se questa istruzione non doveva essere eseguita. Questo è un effetto indesiderato delle pipeline e ad oggi i processori moderni utilizzano particolari accorgimenti (durante i quali il processore è detto essere in stallo) per evitare l'esecuzione dell'istruzione se questa non è realmente necessaria.
Il primo sistema al mondo che si può ritenere aderire alla filosofia RISC fu il supercomputer CDC 6600 sviluppato nel 1964 da Jim Thornton e Seymour Cray. Thornton e Cray progettarono una CPU specializzata per eseguire calcoli (dotata di 74 opcode, un numero nemmeno paragonabile alle 400 opcode dell'Intel 8086) e 10 processori periferici dedicati alla gestione dell'I/O. Il CDC 6600 è dotato di un'architettura load/store con solo due metodi di accesso. Il computer aveva 10 unità funzionali aritmetiche/logiche più cinque unità dedicate al caricamento e al salvataggio dei dati. La memoria era suddivisa in più banchi in modo da consentire alle unità load/store di funzionare in parallelo. Il clock del processore era dieci volte il clock della memoria.
Un'altra delle prime macchine load/store fu il minicomputer Data General Nova sviluppato nel 1968. I progetti che portarono alle prime architetture che esplicitarono il concetto di processore RISC, comunque, furono svolti in seno alle università statunitensi che, utilizzando i fondi forniti dal DARPA per il programma VLSI, svilupparono molte innovazioni nel campo dell'elettronica e della miniaturizzazione.
Il progetto Berkeley RISC iniziò nel 1980 sotto la direzione di David Patterson. Il progetto mirava ad ottenere elevate prestazioni tramite l'uso di pipeline e di molti registri gestiti con la tecnica della register window. In una normale CPU vi erano un numero ridotto di registri (8 o 16 era un numero comune) che erano accessibili a tutto il programma. Nella CPU progettata dal gruppo di Patterson i registri erano 128, ma il programma poteva accedere in ogni momento solamente a 8 di questi. Questa organizzazione permetteva di realizzare delle chiamate di sistema o dei cambi di contesto molto rapidi. In una CPU classica una chiamata di sistema imponeva al processore di salvare i registri in memoria per permettere alla procedura di avere i registri liberi; nella CPU di Patterson basta spostare l'indice della finestra per ottenere dei registri liberi senza salvare niente in memoria velocizzando notevolmente il tutto.
Il progetto RISC sviluppò il processore RISC-I nel 1982. Il processore era formato da 44 420 transistor, pochi rispetto agli oltre 100 000 utilizzati da alcuni CISC dell'epoca. Il RISC-I era dotato di sole 32 istruzioni, ma era più veloce di qualsiasi processore a singolo chip dell'epoca. Il suo successore, il RISC-II (1983), era ancora più piccolo, con i suoi 40 760 transistor, 39 istruzioni ed era tre volte più rapido del RISC-I.
Nello stesso periodo, John L. Hennessy iniziò un progetto simile chiamato MIPS alla Stanford University nel 1981. Il progetto MIPS si concentrava sul realizzare un processore ove la pipeline fosse sempre operativa. La pipeline era già in uso allora su alcuni processori, ma il progetto MIPS sviluppò molte soluzioni che sono diventate di uso comune. Per ottenere una pipeline sempre piena era necessario garantire che le operazioni fossero sempre completate in un solo ciclo di clock da tutte le unità funzionali, quindi i progettisti decisero di eliminare dal processore tutte le istruzioni troppo lente anche se utili. Ad esempio il processore MIPS non prevedeva operazioni di moltiplicazione o divisione.
Il primo progetto di produrre una CPU su un singolo chip lo si deve all'IBM, che nel 1975 iniziò un progetto che fu di ispirazione per i gruppi successivi. Il progetto di ricerca ha portato allo sviluppo del processore IBM 801. L'801 venne prodotto su singolo chip nel 1981 con il nome di ROMP, un acronimo che indica Research (Office Products Division) Mini Processor. Come dice il nome, la CPU era progettata per svolgere compiti d'ufficio; nel 1986 l'IBM presentò l'IBM RT che non ebbe successo per le prestazioni non all'altezza delle aspettative. Nonostante tutto il progetto 801 ispirò molti altri progetti di ricerca, incluso il progetto POWER della stessa IBM.
Durante quegli anni i lavori sulle architetture RISC erano molto diffusi all'interno dei centri di ricerca. Il progetto svolto a Berkeley era talmente importante che spesso veniva utilizzato come sinonimo dell'intero paradigma RISC. Molte aziende erano inizialmente restie a investire sull'architettura RISC, dato che in un prodotto commerciale la ridotta efficienza della memoria avrebbe potuto compromettere le prestazioni dei processori. Comunque, nonostante alcune difficoltà iniziali, nel 1986 tutti i progetti RISC erano diventati prodotti commerciali e non si può negare che tutti i moderni processori RISC debbano molto al progetto del RISC-II.
La ricerca svolta a Berkeley non portò direttamente allo sviluppo di prodotti commerciali ma il progetto del RISC-II venne utilizzato dalla Sun Microsystems per sviluppare i processori SPARC, dalla Pyramid Technology per sviluppare la sua linea di macchine multiprocessore e da praticamente ogni altra società che lavorò in questo settore. Le macchine della Sun dimostrarono che il progetto RISC era valido, che i benefici erano reali e permisero alla società di dominare il settore delle workstation.
John Hennessy abbandonò (temporaneamente) Stanford per commercializzare il progetto MIPS e fondò la MIPS Computer Systems. Il primo progetto della società fu l'R2000, un processore MIPS di seconda generazione. I processori MIPS sono diventati tra i processori RISC più utilizzati: difatti sono integrati all'interno di console come la PlayStation e la Nintendo 64 e sono usati nella maggioranza dei router. Attualmente è un processore molto utilizzato anche nel mercato embedded.
IBM, reduce dal fallimento del progetto RT-PC, imparò dai suoi errori e sviluppò la piattaforma RS/6000 basata su architettura POWER. La società spostò i suoi server AS/400 sulla nuova architettura e gli ingegneri riuscirono a realizzare anche chip con istruzioni molto complesse ma anche molto veloci. Questi progetti portarono allo sviluppo della linea iSeries. Il POWER subì un processo di semplificazione che portò allo sviluppo dei processori PowerPC, processori più semplici, non dotati delle istruzioni peculiari dei prodotti IBM e realizzabili su singolo chip per contenerne i costi. I processori PowerPC sono molto utilizzati in applicazioni legate all'automazione e alle automobili. Esistono alcune macchine dotate di più di 10 processori PowerPC. La CPU è stata utilizzata per anni da Apple per i suoi computer, sebbene ultimamente la società abbia deciso di passare ai processori Intel Core.
Molti altri progetti sono sorti rapidamente. Dal Regno Unito ricerche simili hanno portato alla creazione di processori come l'INMOS Transputer e l'architettura ARM. L'architettura ARM ha avuto un'enorme diffusione nel settore dei dispositivi embedded e mobili. Intel ha prodotto i processori i880 e i960 alla fine degli anni '80, sebbene questi abbiano avuto poco seguito commerciale. Motorola ha prodotto il Motorola 88000, un processore che non ha mai avuto molto successo e che è stato abbandonato quando Motorola si è consociata con IBM per produrre i processori PowerPC. AMD ha realizzato l'AMD 29000, un processore molto utilizzato nelle stampanti laser e nelle macchine per l'ufficio.
Attualmente la maggior parte delle CPU prodotte seguono un approccio RISC. La filosofia RISC offre potenza con costi ridotti e consumi parchi, difatti domina il settore dei dispositivi embedded. Telefoni cellulari, palmari, automobili, videogiochi portatili e altri si affidano a processori RISC. I processori RISC, inoltre, diventarono i dominatori incontrastati dei server ad alte prestazioni durante gli anni 90. Dopo la presentazione delle Sun SPARCstation, i concorrenti della Sun si convertirono alle macchine RISC rendendo il mercato dei server totalmente RISC in breve tempo.
Nonostante i molti successi dei processori RISC, attualmente la piattaforma di riferimento per i computer da tavolo è l'architettura x86 prodotta da Intel; il fatto è che Intel e il suo contendente diretto AMD dominano il mercato dei personal computer con macchine ad architettura CISC, in quanto gli utenti preferiscono mantenere la compatibilità con le loro applicazioni piuttosto che ricercare prestazioni più elevate utilizzando architetture più moderne. Difatti nessuna architettura RISC ha una base utenti talmente ampia da poter competere con quella dell'architettura x86. Inoltre Intel, avendo enormi guadagni dai suoi processori, può investire immense cifre di denaro in ricerca per produrre processori che, pur rispettando i vincoli dell'architettura x86, offrano ottime prestazioni. Comunque, dall'avvento del processore Pentium Pro in poi, i processori Intel prelevano le istruzioni x86 di tipo CISC dalla memoria e le traducono internamente in rapide istruzioni RISC che poi il processore elabora come un RISC classico. Tali famiglie di processori, pur comportandosi da processori CISC, in realtà funzionano internamente come processori RISC.
I consumatori sono interessati alle prestazioni dei processori, al loro costo e alla loro compatibilità con i programmi; non sono interessati a sapere quanto spendono le società per sviluppare i processori. Questo ha generato un fenomeno curioso: lo sviluppo di nuovi processori diventa un affare sempre più costoso e complesso, i costi di sviluppo sono esplosi negli ultimi anni e anche i costi per approntare nuove fonderie di silicio è costantemente in aumento. Questo ha portato fuori mercato tutti i produttori RISC ad alte prestazioni tranne IBM con l'architettura Power. Le architetture MIPS e SPARC vengono sviluppate a ritmi ridotti e sempre per settori specializzati mentre altre architetture, come la PA-RISC e la DEC Alpha, sono state abbandonate all'inizio degli anni 2000. Attualmente i processori più veloci nei calcoli interi sono basati su architetture x86 mentre nei calcoli in virgola mobile le soluzioni RISC di IBM sopravvivono per via della inefficiente gestione dei numeri in virgola mobile dell'architettura x86.
L'architettura CISC prevede un set esteso di istruzioni con metodi di indirizzamento complessi. Una definizione semplicistica dei microprocessori RISC parla di microprocessori con un set di istruzioni ridotto (semplificato) rispetto a quello dei classici processori CISC. La definizione attualmente più diffusa in ambito informatico parla di architettura load-store dato che le architetture RISC permettono di accedere alla memoria unicamente tramite delle istruzioni specifiche (load e store) che provvedono a leggere e scrivere i dati nei registri del microprocessore, mentre tutte le altre istruzioni manipolano i dati contenuti all'interno dei microprocessori. Nei microprocessori CISC è l'esatto opposto, praticamente tutte le istruzioni possono accedere ai registri o alla memoria utilizzando metodi di accesso anche molto sofisticati.
L'idea che ha ispirato questa architettura è la constatazione che i progettisti hardware impiegavano molte risorse e molto tempo per realizzare metodi di accesso molto potenti che i programmatori in realtà ignoravano. Gli sviluppatori e i compilatori infatti tendevano a utilizzare le istruzioni e i metodi di indirizzamento più semplici ignorando tutti gli altri metodi e le istruzioni specializzate.
Normalmente un processore RISC è dotato di alcune caratteristiche distintive; le principali sono:
Le soluzioni RISC hanno portato ad alcuni prodotti di grande successo come:
Bisogna inoltre ricordare come la grande espansione del mercato di smartphone e tablet avvenuta negli anni compresi tra il 2010 e il 2014 abbia contribuito a rilanciare la domanda di processori ad architettura ARM, nonché ad una rinnovata spinta della ricerca in questo settore, con la realizzazione di processori ARM della serie Cortex A8, Cortex-A9 o dei SOC Apple A5 e Apple A6.
Seamless Wikipedia browsing. On steroids.
Every time you click a link to Wikipedia, Wiktionary or Wikiquote in your browser's search results, it will show the modern Wikiwand interface.
Wikiwand extension is a five stars, simple, with minimum permission required to keep your browsing private, safe and transparent.