Architetture RISC e CISC
In questa pagina 8
In questa pagina 5
CISC: perché istruzioni complesse
Negli anni '70 i linguaggi ad alto livello si allontanavano dal linguaggio macchina (divario semantico). La risposta CISC (Complex Instruction Set Computer, es. VAX, x86): molte istruzioni, molte modalità di indirizzamento, istruzioni che fanno direttamente operazioni da linguaggio ad alto livello (copie di stringhe, chiamate di procedura con salvataggio del contesto). Obiettivi: compilatori più semplici, programmi più corti, più funzioni in microcodice (vedi Unità di controlloCompiti dell'unità di controllo e micro-operazioni; segnali di controllo del datapath con tabella per le classi di istruzioni; controllo cablato (combinatorio o a stati finiti) e controllo microprogrammato (memoria di controllo, microistruzioni orizzontali e verticali); confronto.Unità di controllo →).
Che cosa eseguono davvero i programmi
Le misure sull'esecuzione di programmi compilati (Pascal, C) mostrano che:
- dominano gli assegnamenti (circa il 40% delle istruzioni ad alto livello) e le istruzioni condizionali;
- le chiamate di procedura sono le più costose in tempo (accessi alla memoria per parametri e contesto);
- la grande maggioranza delle procedure ha meno di 6 parametri e poche variabili locali;
- gli operandi sono per lo più variabili scalari locali.
Conclusione: conviene rendere veloci le operazioni semplici e frequenti e tenere gli operandi nei registri.
Caratteristiche RISC
Reduced Instruction Set Computer (es. MIPS, ARM, RISC-V):
- un'istruzione per ciclo (a regime, in PipelineIdea della catena di montaggio; pipeline a 5 stadi IF, ID, EX, MEM, WB; tempo di ciclo, tempo per n istruzioni in una pipeline a k stadi e speedup con esempi svolti; registri di pipeline; scrittura e lettura dei registri nello stesso ciclo; limiti (stadi sbilanciati, hazard).Pipeline →);
- operazioni registro-registro, solo load e store accedono alla memoria (architettura load/store);
- poche modalità di indirizzamento semplici;
- formato fisso (32 bit) e pochi formati, decodifica semplice;
- molti registri (16–32 o più);
- unità di controllo cablata;
- il lavoro di ottimizzazione passa al compilatore (allocazione dei registri, riordino delle istruzioni).
Finestre di registri
Per rendere veloci le chiamate (soluzione hardware, es. SPARC): molti registri fisici divisi in finestre; ogni procedura attiva vede una finestra con registri per parametri, variabili locali e registri temporanei. La finestra di chi chiama e quella della procedura chiamata si sovrappongono: i registri temporanei del chiamante sono i registri parametro del chiamato, quindi i parametri passano senza copiarli. Le finestre sono organizzate in modo circolare: quando le chiamate annidate le esauriscono, le più vecchie vengono salvate in memoria.
Allocazione dei registri con colorazione
Soluzione software: il compilatore assegna le variabili ai registri fisici. Costruisce un grafo in cui ogni nodo è una variabile (o valore temporaneo) e un arco collega due variabili vive contemporaneamente. Assegnare registri = colorare il grafo con colori in modo che nodi adiacenti abbiano colori diversi. Le variabili che non si riescono a colorare vengono tenute in memoria (spill).
Esempio: e vive insieme, e vive insieme, e mai. Bastano 2 registri: R1, R2.
Confronto
| CISC | RISC | |
|---|---|---|
| istruzioni | molte, complesse, lunghezza variabile | poche, semplici, lunghezza fissa |
| accesso alla memoria | in molte istruzioni | solo load/store |
| cicli per istruzione | molti e variabili | circa 1 in pipeline |
| registri | pochi | molti |
| controllo | spesso microprogrammato | cablato |
| codice | più compatto | più lungo |
Oggi la distinzione è sfumata: i processori x86 traducono internamente le istruzioni CISC in micro-operazioni di tipo RISC eseguite in pipeline; ARM ha aggiunto istruzioni più ricche e un formato compatto a 16 bit (Thumb). Per retrocompatibilità nessuna architettura commerciale diffusa è "puramente" RISC o CISC.
MIPS in breve
Esempio storico di RISC usato nei libri di testo: 32 registri a 32 bit ($0 vale sempre 0 e non è scrivibile), istruzioni di 32 bit nei formati R, I, J (vedi Formato delle istruzioni e modalità di indirizzamentoModalità di indirizzamento (immediato, diretto, indiretto, a registro, indiretto a registro, con spiazzamento, relativo al PC, indicizzato e scalato, a pila) con indirizzo effettivo ed esempi; formati fissi e variabili; i formati R, I e J di MIPS e il formato a 32 bit di ARM con il calcolo dei campi.Formato delle istruzioni e modalità di indirizzamento →).
add $1, $2, $3 # $1 = $2 + $3
addi $2, $2, 4 # $2 = $2 + 4 (immediato)
lw $1, 12($2) # $1 = M[$2 + 12]
sw $1, 12($2) # M[$2 + 12] = $1Il caso di studio del corso è ARM: L'architettura ARMARM a 32 bit come caso di studio: registri r0-r15 con SP, LR e PC, registro di stato CPSR con flag NZCV, modi del processore, architettura load/store, istruzioni condizionate, secondo operando flessibile, Thumb; differenze principali con ARMv8 a 64 bit.L'architettura ARM →.
Errori tipici
- Pensare che RISC significhi "meno potente": esegue più istruzioni ma ciascuna in meno tempo.
- In una
swil primo registro è letto (il dato da scrivere), non scritto.
Versione ripasso
CISC
Per il divario semanticodistanza tra linguaggi ad alto livello e linguaggio macchina: molte istruzioni e modalità di indirizzamento (VAX, x86), programmi corti, più funzioni in microcodice (Unità di controlloCompiti dell'unità di controllo e micro-operazioni; segnali di controllo del datapath con tabella per le classi di istruzioni; controllo cablato (combinatorio o a stati finiti) e controllo microprogrammato (memoria di controllo, microistruzioni orizzontali e verticali); confronto.Unità di controllo →).
Perché RISC
I programmi compilati eseguono soprattutto assegnamenti (circa 40%) e condizionali; le chiamate di procedura costano di più; quasi tutte le procedure hanno meno di 6 parametri e operandi scalari locali. Conviene velocizzare le operazioni semplici e tenere gli operandi nei registri.
RISC (MIPS, ARM, RISC-V):
- un'istruzione per ciclo a regime (PipelineIdea della catena di montaggio; pipeline a 5 stadi IF, ID, EX, MEM, WB; tempo di ciclo, tempo per n istruzioni in una pipeline a k stadi e speedup con esempi svolti; registri di pipeline; scrittura e lettura dei registri nello stesso ciclo; limiti (stadi sbilanciati, hazard).Pipeline →);
- registro-registro, solo load e store accedono alla memoria;
- poche modalità di indirizzamento, formato fisso (32 bit);
- molti registri (16-32 o più), controllo cablato, ottimizzazione al compilatore.
Registri
- Finestre di registri (SPARC): la finestra del chiamante e quella del chiamato si sovrappongono, i parametri passano senza copiarli; organizzazione circolare, le più vecchie vanno in memoria.
- Colorazione di un grafo: nodo = variabile, arco = variabili vive insieme; registri = colori con nodi adiacenti diversi; le non colorabili in memoria (spill). - e - vive insieme, - mai: 2 registri ( R1, R2).
Confronto
CISC: istruzioni complesse a lunghezza variabile, memoria in molte istruzioni, pochi registri, microprogrammato, codice compatto. RISC: l'opposto. Oggi x86 traduce in micro-operazioni RISC; ARM ha Thumb a 16 bit.
MIPS
32 registri da 32 bit ($0 sempre 0), formati R, I, J (Formato delle istruzioni e modalità di indirizzamentoModalità di indirizzamento (immediato, diretto, indiretto, a registro, indiretto a registro, con spiazzamento, relativo al PC, indicizzato e scalato, a pila) con indirizzo effettivo ed esempi; formati fissi e variabili; i formati R, I e J di MIPS e il formato a 32 bit di ARM con il calcolo dei campi.Formato delle istruzioni e modalità di indirizzamento →): add $1,$2,$3; addi $2,$2,4; lw $1,12($2); sw $1,12($2). Caso di studio: L'architettura ARMARM a 32 bit come caso di studio: registri r0-r15 con SP, LR e PC, registro di stato CPSR con flag NZCV, modi del processore, architettura load/store, istruzioni condizionate, secondo operando flessibile, Thumb; differenze principali con ARMv8 a 64 bit.L'architettura ARM →.
Errori tipici: RISC non è "meno potente"; in sw il primo registro è letto.