La CPU.


Circuiti logici


Nella CPU le funzioni logiche e matematiche sono eseguite da circuiti elettronici che le implementano in codifica binaria (ovvero con 2 soli valori: 0 ed 1), secondo l'algebra di Boole.

Semplificando molto si puo' dire che l'elemento base della logica della CPU e' semplicemente un interruttore, che puo' essere acceso e spento con un segnale elettrico.

All'inizio come interruttori si sono usati rele', quindi tubi a vuoto, ed infine transistor ed integrati, ma il principio e' rimasto sempre lo stesso.

Le memorie sono realizzate con circuiti particolari, detti flip-flop, che, indipendentemente dalla tensione in ingresso, "ricordano" lo stato di acceso o spento cui sono stati settati.

Nella figura sotto (presa da un libro di Tanenbaum) vediamo lo schema di alcuni circuiti semplici realizzati con transistors: un invertitore, una porta NAND e una OR, questi circuiti logici elementari sono detti gates. Nella figura Vcc=5volt, e' interpretato come un 1, 0 Volt e' interpretato come 0.

figura a: porta NOT (invertitore):
Se "accendo" il transistor, dando una tensione Vin=1, ho che Vout=0;
se invece Vin=0 nel transistor non passa corrente e Vcc=Vout=1,
Abbiamo quindi che l'uscita Vout e' il contrario dell'ingresso Vin e questo circuito implementa la funzione NOT.

figura b: porta NAND:
Qui devo "accendere" entrambi i transistor per avere Vout=0 ; in caso contrario avro' Vout=Vcc=1
Questa e' la funzione logica NAND, che fornisce 0 (falso) se e solo se i 2 ingressi V1 e V2 sono veri (1)

figura c: porta NOR:
Se uno dei 2 transistor e' "acceso" (V1 = 1 oppure V2 = 1 , o entrambi) ho che Vout=Vcc=0 , altrimenti Vout=Vcc=1
Questa e' la funzione logica NOR, che fornisce 0 (falso) se uno o entrambi gli ingressi sono veri.

Picture from  Tanenbaum  books











Tutte le operazioni, logiche e matematiche, sono implementate, usando l'algebra di Boole, in termini di circuiti logici di questo tipo. Vediamo sotto i simboli che li rappresentano, e le tabelle che mostrano cosa si ottiene dalle operazioni logiche nei vari casi (tabelle di verita').

Picture from  Tanenbaum  books

Un or esclusivo (XOR) e' una funzione che e' vera se uno solo dei suoi ingressi e' vero, vediamo ora come un XOR e un AND possono essere usati per implementare un sommatore. La somma di due numeri di un bit sara' 0 se i 2 bit sono 0, varra' 1 se uno dei due numeri vale 1. Se entrambi sono 1 abbiamo zero come risultato ed un riporto alla cifra binaria successiva. Una somma di numeri con molti bit si implementa con una catena di circuiti come quello mostrato sotto.

Picture from  Tanenbaum  books

Le CPU moderne contengono decine e decine di milioni di gates, che implementano funzioni complesse, inoltre la CPU deve contenere circuiti elettronici per interfacciarsi col bus e gli altri dispositivi. In questa descrizione semplificata delle cose non abbiamo parlato del clock, che e' un segnale periodico, con frequenza fissa, generato da appositi circuiti sulla scheda madre, che permette di sincronizzare i circuiti della CPU, le memorie e tutta l'elettronica del computer. La velocita' del clock da' un'idea della velocita', e un po' delle prestazioni, della CPU.

A fine 2004 si e' arrivati a clock attorno ai 4 Ghz, e ad un cento milioni di gates nella CPU; la miniaturizzazione e' estrema, e nel 2004 si arriva a dimensioni di 90 nanometri per i gates. Il problema piu' grosso diviene quello dello smaltimento del calore generato, che puo' arrivare attorno ai 100 Watt.


Schemi teorici


I primi computer veri e propri, sviluppati a meta' del 1900, suscitarono l'interesse dei matematici, anche in relazione agli sviluppi della logica matematica di quel periodo.

Abbiamo quindi alcune schematizzazioni del funzionamento dei computer cui si fa riferimento ancor oggi: in particolare il modello di Touring ed il modello di Von Noiman. Von Noiman e' il primo che mette le istruzioni macchina in RAM, come i dati.

I computer moderni sono organizzati essenzialmente secondo il modello di Von Noiman, anche se, come vedremo piu' avanti, le cose sono diventate molto piu' complicate.

CPU : componenti e funzionamento


Le componenti principali della CPU sono: Il funzionamento della CPU segue essenzialmente il ciclo di Von Noiman, con i seguenti passi:
  1. 1) fetch dell' istruzione cui punta il PC program counter (PC), che viene recuperata dalla memoria e messa nell' instruction register (IR)
  2. 2) si aggiorna il PC
  3. 3) si decodifica l'istruzione (calcolo indirizzi etc. etc.)
  4. 4) si fa il fetch dati richiesti dall'istruzione che vengono portati dalla memoria ai registri
  5. 5) si esegue dell'istruzione
  6. 6) risultati sono portati dai registri in memoria
  7. 7) si torna al punto 1

Le CPU moderne sono piu' complicate di cosi' ed usano tutti i trucchi possibili per rendere il calcolo piu' veloce, vediamone in breve:


Prefetch

C'e' un buffer ( pre-fetch buffer) in cui le istruzioni vengono trasferite, la CPU le legge e decodifica in anticipo rispetto al momento in cui dovra' eseguirle


Branch Prediction

La CPU cerca di indovinare quale sara' la prossima istruzione, fra quelle nel pre-fetch buffer.


Pipelines

Le istruzioni sono scomposte in passi elementari (stage), i passi di diverse istruzioni sono eseguiti contemporaneamente da hardware diverso

E' una specie di catena di montaggio:

Schema di una pipeline
stage Tempo: T1 T2 T3 T4 T5 T6
lettura istruzione istr.1 istr.2 istr.3 istr.4 istr.5 istr.6
decodifica - istr.1 istr.2 istr.3 istr.4 istr.5
fetch operandi - - istr.1 istr.2 istr.3 istr.4
esecuzione - - - istr.1 istr.2 istr.3
risultati ai registri - - - - istr.1 istr.2

Con n stages si produce un'istruzione completa ogni ciclo di clock.

Tempo di latenza: tempo perche' la pipe si riempia:
i salti nel programma "svuotano" la pipeline spesso e la rendono dannosa.

Il P4A Northwood ha pipelines di 20 stages.



CPU Superscalari



Da quanto si vede appare evidente come sia difficile stimare a priori le performances di una data CPU, il clock non e' piu' indicativo, abbiamo ad esempio che, per calcoli su numeri reali (float), le CPU AMD Athlon vanno meglio di un 30% delle CPU Intel Pentium IV di pari clock. E' importante inoltre l'organizzazione delle memorie cache e la velocita' della RAM.

Nella scelta di una CPU occorre fare quindi riferimento a benchmark che rispecchino quelle che sono le proprie esigenze.


CPU: Architetture


Anche per le architetture delle CPU abbiamo visto, nel tempo, alternarsi diverse tendenze. Allo svilupparsi dell'elettronica si e' assistito ad un aumento della complessita' delle istruzioni macchina eseguite dalle CPU, (architettura CISC : "complex instruction set") si cercava, con una singola istruzione, di far il maggior lavoro possibile. Questa tendenza ha raggiunto l'apice con i Vax Digital, che , negli anni 90, avevano circa 300 diverse istruzioni macchina . Si e' poi trovato che catene istruzioni semplici, opportunamente organizzate in pipelines, potevano aver prestazioni migliori. Nasce quindi l'architettura RISC : (reduced instruction set), che e' stata quella adottate dalle workstation Unix degli anni 90.
Un'altra tendenza e' quella denominata: VLIW: very long instruction words, qui piu' istruzioni sono organizzate in un'unica lunga istruzione, le cui parti possono essere eseguite in parallelo. I processori della Trasmeta, e gli Itanium dell'Intel seguono questa filosofia.

La situazione reale non e' sempre riconducibile a queste schematizzazioni; i progettisti seguono un approccio pragmatico, indipendente dalla teoria, il mercato delle CPU e' oggi dominato da CPU Intel che adottano un approccio ibrido CISC-RISC : istruzioni CISC vengono spezzate in istruzioni semplici, e passate ad un core RISC, con piu' pipelines che lavorano in parallelo. Per alimentare le pipeline in modo continuo vengono utilizzate tecniche di pre-analisi del codice, che dovrebbero permettere di caricare e decodificare in anticipo le istruzioni che verranno eseguite in seguito.

Un'altra importante evoluzione del calcolo e' l'introduzione del parallelismo. I computer paralleli hanno molte CPU, che lavorano insieme. Il modo di lavorare dei computer paralleli e' classificato secondo la cosiddetta "tassonomia di Flinn":

Il parallelismo e' oggi relegato in un mercato di nicchia, e le macchine parallele sono costituite da reti di CPU commerciali, non piu' progettate apposta per la macchina.

Un discorso diverso va fatto per le macchine con piu' CPU, che condividono la memoria, ma eseguono programmi (o task) diversi. Questa architettura (SMP : simmetric multi processing) e' comune nei grossi server. Nel 2005 iniziano anche ad apparire CPU con "core" multipli, che implementano quindi una specie di SMP all'interno del processore stesso.

La maggior parte delle CPU per PC sono state, fino a pochi anni fa, a 32 bits, ovvero dotate di registri e parole di 32 bits. Queste CPU hanno delle limitazioni nella quantita' di memoria che possono utilizzare (circa 4 Gbyte), dovute al fatto che in 32 bit non si possono mettere indirizzi di memoria piu' grandi di tanto. Questa limitazione e' grave per i grossi server, che sono equipaggiati con grandi quantita' di memoria, in modo da minimizzare le operazioni di lettura e scrittura su disco, relativamente lente. Per questo il mercato dei grossi server aziendali era appannaggio di produttori che sviluppavano una loro linea dedicata di CPU a 64 bits, capaci di indirizzare quantita' enormi di memoria. Le cose stanno cambiando, anche i produttori di CPU per PC, come AMD ed Intel stanno passando a produrre CPU a 64 bits, pur mantenendo la compatibilita' con il vecchio software a 32 bits.


CPU presenti sul mercato oggi (2007)


In questo link una lista dettagliata delle CPU per PC, dell'Intel ed AMD.