# Personal computer/Architettura/CPU

Personal computer
* Storia dei calcolatoriPersonal computer/Storia
* Architettura del calcolatorePersonal computer/Architettura
** CPUPersonal computer/Architettura/CPU
** MemoriaPersonal computer/Architettura/Memoria
** Input/OutputPersonal computer/Architettura/IO
* Linguaggio MacchinaPersonal computer/Linguaggio Macchina
** DLXPersonal computer/Linguaggio Macchina/DLX
*** Operazioni DLXPersonal computer/Linguaggio Macchina/DLX/Operazioni
*** DLX sequenzialePersonal computer/Linguaggio Macchina/DLX/DLX_sequenziale
*** DLX in pipelinePersonal computer/Linguaggio Macchina/DLX/DLX_pipeline
** 8086-8088Personal computer/Linguaggio Macchina/8086
* Mapping di Memorie ed InterfaccePersonal computer/Mapping
** Integrati NotevoliPersonal computer/Mapping#Caratteristiche_e_funzionamento_degli_integrati_notevoli
*** DriverPersonal computer/Mapping/Driver
*** CPUPersonal computer/Mapping/CPU
*** Memoria PrincipalePersonal computer/Mapping/Memorie
*** Interfacce I/OPersonal computer/Mapping/Interfacce
** Gestione delle interfacce tramite programmaPersonal computer/Mapping#Gestione_delle_interfacce_tramite_programma
* Standard alla base di un personal computerPersonal computer/Standard
* Appendici e RiassuntoPersonal computer/Appendici
Modifica il sommario

## CPU

Rappresentando la CPU con un diagramma compatto la si può dividere in due semplici stati, quello di: IF e quello di EX, dato che l'unico compito che la CPU deve svolgere è eseguire le istruzioni. I due stati sono quindi Instruction Fetch ed EXecute. Quando la CPU si trova nello stato IF legge dalla memoria l'istruzione che eseguirà al prossimo ciclo di clock nello stato di EX. L'esecuzione di un programma, ovvero una sequenza di istruzioni, richiede che esista un registro speciale con funzione di puntatore alla prossima istruzione da eseguire. Tale registro è il Program Counter (PC). Nello stato di Fetch la CPU legge nella cella di memoria indirizzata dal PC l'istruzione da eseguire e prima di passare allo stato di Execute aggiorna il PC con l'indirizzo della prossima istruzione da eseguire. Il PC può essere aggiornato anche quando la CPU si trova nello stato di Execute, è il caso delle istruzioni di trasferimento del flusso, ovvero di istruzioni che modificano il normale comportamento sequenziale della macchina per effettuare salti tra istruzioni non contigue (in linguaggi di programmazione più alti, quali il C, corrispondono concettualmente alle istruzioni di controllo condizionato).
La CPU è inoltre diviso in due unità fondamentali:
* unità di calcolo
* unità di controllo

### Unità di controllo

L'unità di controllo è una rete sequenziale sincrona comandata dai comandi di ready ed interrupt che ha il compito di comandare, in base alle istruzioni in ingresso dalla memoria, l'unità di calcolo, specificando una determinata micro-operazione, ovvero un'operazione eseguita all'interno dell'unità di calcolo in un ciclo di clock, quale ad esempio il trasferimento di un dato da un registro ad un altro o una elaborazione della ALU.

### Unità di calcolo

L'unità di calcolo, o anche Datapath contiene tutte le unità di elaborazione ed i registri necessari per l'esecuzione delle istruzioni della CPU, ogni operazione è una sequenza di operazioni elementari, le micro-operazioni.
L'unità di calcolo differisce molto tra diverse architetture ma gli elementi fondamentali sono:
* Instruction Register IR, è il registro che contiene l'istruzione in corso di esecuzione, viene caricato nella fase di fetch e determina le azioni svolte durante la fase di esecuzione
* Program Counter PC, il registro che tiene traccia dell'esecuzione del programma
* Memory Address Register MAR è il registro che contiene l'indirizzo della locazione di memoria da leggere o scrivere. L'uscita di questo registro è sul Bus degli Indirizzi
* Memory Data Register MDR è il registro attraverso la quale viene scambianta l'informazione tra la memoria e la CPU, la sua uscita è sul Bus Dati
* Registri General Purpose di uso generale, sono impiegati per memorizzare dati su cui opera la ALU, sono quindi utilizzati sia di appoggio dati che per gestire l'indirizzamento. Nelle CPU più datate questi registri erano più specializzati, vi era in particolare il registro accumulatore che doveva essere necessariamente utilizzato in certe operazioni aritmetico logiche.

### Quantifiche Prestazionali dei sistemi

Come abbiamo già visto esistono vari tipi di sistemi, ognuno con architetture specifiche e metodi di produzione diversi e ognuno con prestazioni differenti. Per poter fare confronti si deve cercare di creare una scala di misurazione. Su quest'argomento si dibatte costantemente. Ecco le principali unità di misurazione, ricordando sempre che i valori devono essere calcolati utilizzando dei benchmark comuni, ovvero dei benchmark sviluppati con un linguaggio di alto livello per poi essere compilati indipendentemente per processori diversi. Questo implica un diverso numero di istruzioni semplici.

#### CPU-time

Questo tipo di misurazione si basa sul mero tempo necessario per eseguire un programma.
    $CPU_{time}=N_{istruzioni}\cdot CPI_{medio}\cdot T_{ck}$
con
* $N_{istruzioni}$ pari al numero di istruzioni che compongono il programma in quella particolare architettura.
* $CPI_{medio}$ pari al numero di cicli di clock mediamente necessari per ogni istruzione semplice.
* $T_{ck}$ pari al tempo fisico di durata di un singolo ciclo di clock.
Il concetto di $CPI_{medio}$ è piuttosto complesso. Infatti osservando che una certa istruzione può non essere eseguita nello stesso tempo di un'altra istruzione, si deve proprio calcolare il tempo medio di esecuzione dell'istruzione. In particolare se ne calcolerà la media ponderale sulle n istruzioni necessarie per l'esecuzione del programma.
    $CPI_{medio}=\sum _{i=1}^{n}(CPI_{i}\cdot {\frac {N_{i}}{N_{tot}}})$
Il valore di CPI medio, teoricamente, dovrebbe sempre essere maggiore di 1, ma non è proprio così, in quanto oltre all'esecuzione consecutiva, in un processore si hanno anche, soprattutto nelle ultime generazioni di processori, alti livelli di parallelismo. Questo significa che più istruzioni possono essere eseguite contemporaneamente. Perciò spesso si hanno $CPI_{medie}$ pari a 0.5.

#### MIPS

Questo tipo di unità di misura piace molto ai giornalisti, ma non ha grande rilevanza scientifica. Infatti rappresenta i milioni di istruzioni al secondo, calcolate rispetto ad un generico $CPI_{medio}$ basato su un benchmark. Quindi
    $MIPS={\frac {f_{ck}}{CPI_{medio}}}$
Questo sarebbe un buon risultato se non fosse che a parità di benchmark e MIPS possono risultare CPU-time e N diversi, per la stessa architettura.
Per questi motivi l'acronimo MIPS è stato negli anni scherzosamente ridefinito come Meaningless Indication Provided by Salesman, ovvero Indicazione con scarso significato fornita dai venditori.

#### Speed-Up

Questa scala permette di osservare se a parità di benchmark un sistema è più veloce di un altro. Il problema sta nel fatto che il calcolo è talmente approssimativo che in realtà un valore basso di speedup non rappresenta una certezza da un punto di vista di velocità di esecuzione. Infatti si ha
che al variare di alcuni aspetti del benchmark e dell'uso di certe istruzioni può completamente ribaltare ogni risultato ottenuto con un tale tipo di calcolo.