Von Neumann
Memoria: spazio contenente parole di ugual dimensione, ogni parola può essere istruzione o dato ed è identificata da un indirizzo univoco. Programmi: registrati in memoria come eseguibili ovvero istruzioni in linguaggio macchina eseguibili dalla CPU. Esecuzione automatica dei programmi. La CPU legge dalla memoria di lavoro le istruzioni e le esegue operando su variabili, ogni variabile è caratterizzata da tipo e codifica.
La CPU è l’unico master del sistema intero. Limiti di questo tipo di architettura il collegamento punto a punto non permette modifiche al sistema estrema rigidità.
Architettura a bus
- Bus indirizzi: usato dalla CPU per inviare indirizzi alle periferiche.
- Bus dati: utilizzato sia da CPU che da periferiche per invio ricezione dati.
- Bus controllo: usato da tutti per inviare segnali di stato pronto o occupato o altro contiene inoltre il clock del sistema e ogni linea ha una specifica funzione. Anche in questi sistemi la CPU è sempre master. Per sincronizzare il tutto la CPU utilizza l’handshake.
Tipici segnali di controllo
- MFC (memory function completion): comando di completamento dell’operazione.
- WMFC (wait MFC): comando usato dalle periferiche per bloccare operazioni CPU in attesa del completamento operazione. La lettura di un dato può avvenire solo dopo un WMFC mentre la scrittura avviene nello stesso passo di questo comando.
Struttura CPU
Data path
Unità che eseguono le operazioni logiche e di calcolo.
Unità di controllo
Attiva e gestisce le periferiche interne ed esterne alla CPU.
Registri CPU
- PC (program counter): contiene l’indirizzo dell’istruzione che dovrà essere eseguita al passo successivo.
- IR (instruction register): contiene l’indirizzo dell’istruzione attualmente in esecuzione.
- MAR/MDR (memory address register & memory data register): registro indirizzamento e registro dati.
- R0…Rn: registri per stabilizzare l’istruzione visibili al programmatore.
- TEMP, V, Z: registri di servizio non visibili in assembler.
- Bus interno CPU.
Istruzioni operative per la CPU
- Tipo di operazioni da compiere.
- Indicazione di dove trovare i dati e dove porre il risultato.
- Modalità di indirizzamento.
Classi istruzioni CPU
- Aritmetico logiche: una CPU deve poter eseguire almeno somma e complemento a 2, e operazioni logiche fondamentali AND, OR, NOT. Meno istruzioni sa eseguire la CPU più lungo e lento sarà il programma.
- Istruzioni accesso a memoria:
- LOAD: carica da memoria a registro interno CPU.
- STORE: salva dati della CPU in memoria.
- Istruzioni controllo:
- Salti incondizionati: si salta senza condizioni all’indirizzo specificato dall’istruzione stessa.
- Salti condizionati: si trovano nella forma branch C L dove C è la condizione di salto e L indirizzo.
- Chiamate o ritorni procedura: la chiamata è nella forma call L mentre il rientro è solo un return. Infatti, l’indirizzo di rientro è salvato automaticamente alla chiamata quindi è implicito.
- Ingresso uscita per comunicare con le periferiche.
- Di servizio tipo NOP = no operation.
Struttura istruzione
Codice operativo, modalità di indirizzamento, indirizzi.
Modalità di indirizzamento
- Indirizzamento immediato: non è un vero e proprio indirizzamento, infatti si specifica direttamente il valore stesso invece del suo indirizzo nell’istruzione. Se il dato è di piccole dimensioni trova posto nella parte di istruzione con il codice operativo; se è lungo bisogna riservare una parola per il dato.
- Indirizzamento di registro: l’operando si trova in uno dei registri della CPU, che essendo pochi hanno pochi bit di indirizzamento e alta velocità di accesso.
- Indirizzamento a memoria primaria:
- Assoluto: nell’operazione si specifica un indirizzo fisso che non può più essere modificato tramite rilocazioni.
- Relativo a registro (indice e spiazzamento): l’indirizzo è somma del contenuto del registro base (indice) e di una costante (spiazzamento).
- Indiretto da registro: l’indirizzo a cui voglio accedere è interno alla CPU e si può auto incrementare o decrementare (utile per vettori).
- Indiretto da memoria: la parola di memoria indirizzata contiene l’indirizzo della parola cui voglio accedere.
- Indirizzamento relativo al PC: utilizza come registro indice il program counter il cui valore non può essere scritto dal programmatore, utile per modifiche al flusso programma.
- Indirizzamento a pila: il dato si trova in un’area detta stack pointer che punta sempre alla cima di una memoria organizzata a pila.
Ortogonalità
Ortogonalità significa possibilità di utilizzare molteplici indirizzamenti per ogni operazione. In un’istruzione dovrei specificare indirizzo dei due operandi e del risultato più codice operativo e indirizzamento, ma questo richiederebbe un numero enorme di bit.
Soluzioni al problema
- Si impone di lavorare solo con registri interni alla CPU che essendo pochi hanno pochi bit di indirizzamento e quindi occupano poco spazio.
- Si specificano solo due indirizzi degli operandi e quindi si aprono due ulteriori strade:
- Il risultato sovrascrive il valore di uno dei due operandi.
- Il risultato o un operando stanno in posizione fissa di cui si sottintende l’indirizzo (tipicamente l’accumulatore).
- Si specifica un indirizzo solo, il secondo operando sta nell’accumulatore e il risultato stesso sovrascrive l’operando nell’accumulatore.
- Esiste anche istruzione a zero operandi ma non è più usata.
Se nonostante questi accorgimenti l’istruzione eccede la lunghezza di una parola nella modalità di indirizzamento si pongono dei bit che indicano su quante parole si estende l’istruzione. Un’alta ortogonalità permette un’alta ottimizzazione le CPU che lo permettono sono dette CISC.
Problema della memoria
Oggi il collo di bottiglia in termini di prestazioni dei sistemi è la memoria, infatti il gap di velocità tra memoria e logica si fa sempre più ampio. La memoria inoltre non è illimitata ma si può dare l’illusione che lo sia grazie a degli accorgimenti.
Gerarchia di memoria
Si realizza una gerarchia di memoria, le memorie più veloci e di conseguenza più piccole sono le più vicine alla CPU. Il livello più alto è costituito dai registri della CPU che essendo costruiti con la stessa tecnologia hanno la stessa velocità. Subito dopo si trova la cache, poi la RAM. Un livello alto e vicino alla CPU contiene un sottoinsieme dei dati delle memorie più basse, quindi si rendono necessari dei trasferimenti di dati sempre comunque solo tra memorie adiacenti.
Principio di Località
La convenienza di questo processo di trasferimenti è garantita dal principio di località.
- Località spaziale: se ho effettuato un accesso a un dato è molto probabile che presto dovrò accedere a quelli vicini.
- Località temporale: se ho effettuato un accesso a un dato è molto probabile che presto lo rifarò entro breve. Esempio: i cicli hanno alta località temporale, i vettori spaziale.
Il blocco è l’unità minima di trasferimento informazioni tra cache e CPU. Ogni blocco ha una sua validità e un bit che indica se il blocco è valido (1) o no (0). La cache è indipendente dalla CPU ed è gestita dal controllore cache che indirizza il flusso di blocchi verso CPU o memorie inferiori. Quando la CPU vuole un dato deve accedere sempre alla cache.
Lettura
La CPU manda indirizzo a cache, se trova il dato avviene il trasferimento, se il dato non è disponibile la CPU sospende l’esecuzione e la cache copia il dato dalla memoria che poi trasferisce a CPU. Se devo scrivere devo far sì che tra cache e memoria ci sia sempre coerenza, ovvero la CPU deve vedere la cache allo stesso modo della memoria centrale. Quando il dato è trovato ho uno hit.
- Hit rate: è la percentuale di successi.
- Hit time: è il tempo per trasferire il dato + il tempo per controllare che sia andata bene l’operazione/fallimento richiesta. Se non trovo l’informazione ho un miss la cache deve salvare i dati in RAM del blocco in cui la CPU richiede il dato, copiare il nuovo dato e trasferire poi in CPU.
- Miss rate: 1-hit rate.
- Miss penalty: tempo per portare un blocco in cache da RAM + tempo per portarlo da cache a CPU.
La CPU dà alla cache degli indirizzi della memoria fisica, la cache deve quindi:
- Indirizzare, ovvero scegliere il blocco in cui copiare il dato.
- Sostituire il dato.
- Scrivere il dato. I blocchi cache sono tipicamente di 4 parole per poter supportare la località spaziale. La RAM deve avere lo stesso numero di parole per blocco. Ogni blocco RAM può stare solo in una precisa posizione della cache.
I blocchi sono indirizzati in modo diretto, servono log2 N bit dove N è il numero di blocchi. Pericolo di conflitto se tento di caricare due blocchi nello stesso spazio in cache. La cache ha meno bit di indirizzamento della RAM, quindi per capire che blocco di RAM ho effettivamente caricato in cache devo utilizzare il tag formato dai bit più significativi del blocco che era prima in RAM. Bit tag = log2 NRam - log2 Ncache.
Ogni blocco contiene quindi:
- Bit di validità: se è a uno i dati sono validi, altrimenti non lo sono.
- Campo etichetta: dove si possono registrare i bit di tag.
- Campo dati: quando la CPU manda indirizzo, la parte di indirizzo che contiene l’indice viene confrontata con l’etichetta del blocco selezionato. I bit più significativi sono confrontati col tag. Si controlla il bit di validità.
Placement: sostituzione scrittura si accede al blocco cache tramite i log2 N bit che identificano il blocco, si scrivono nel tag i bit più significativi e i dati nella parte dato si pone a uno il bit di validità. Importanti le dimensioni del blocco, che più è grande più migliora la località spaziale, ma a parità di memoria aumenta la probabilità di dover effettuare una sostituzione con la RAM, quindi aumenta il tempo di miss. Valori tipici da 4 a 32 parole.
Il Direct mapped viola il principio di località temporale, infatti non tiene conto del tempo che un blocco ha trascorso in cache.
Lettura cache
L’unità di controllo chiede il dato alla CPU. Se ho uno hit il dato viene mandato alla CPU. Se ho un miss la CPU si blocca, il controllore cache inizia la lettura RAM e copia il dato che viene infine trasferito alla CPU.
Dettaglio miss
Il miss viene identificato in lettura (PC già incrementato), il PC dell’istruzione che ha generato il miss viene inviato alla CPU (quindi PC decrementato), infine si leggono i dati, si copiano in cache e poi in CPU.
Scrittura cache
Se la CPU quando scrive, scrivesse solo in cache si avrebbe incoerenza tra cache e RAM. Per evitare questo si può scrivere in parallelo (write through) sia in cache che in RAM, ma questo comporta che la scrittura avviene alle velocità della RAM, molto lenta. Inoltre, se faccio più modifiche alla stessa parola ogni volta avviene anche la scrittura in RAM. Per evitare questo problema si usa un write buffer, ovvero una memoria dove si scrivono i dati in parallelo alla cache e a velocità CPU, poi il buffer provvede a scriverli in RAM a velocità RAM. Ho quindi disaccoppiamento tra RAM e cache. Il buffer è un registro FIFO, ogni posizione del buffer contiene indirizzo e dato, quando il dato viene fatto scorrere si ha lo svuotamento del buffer.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
-
Riassunto Calcolatori
-
Riassunto Architettura dei calcolatori elettronici
-
Riassunto esame Calcolatori Elettronici, Prof. Colombo Carlo, libro consigliato Calcolatori elettronici - Architett…
-
Riassunto esame Calcolatori Elettronici, Prof. Colombo Carlo, libro consigliato Architettura e organizzazione dei c…