CPU Design: La potenza è niente senza controllo

I set di istruzioni vengono odiati, temuti o riveriti perché fanno pensare alla programmazione assembly, ossia un tipo di programmazione altamente stressante, soprattutto se sai che quello che stai facendo lo potresti fare più facilmente con un linguaggio ad alto livello. Le ALU vengono odiate, temute o riverite perché prese così risultano essere un concetto misterioso, e tutto quello che non viene capito tende a spaventare. Ma in realtà, il brutto del progetto di un processore non è né nella definizione del set di istruzioni, né nella realizzazione della ALU: sta nel progetto del circuito che li utilizzerà. Iniziamo oggi ad affrontare questo problema, e al solito cercheremo di presentare qualcosa che funzioni pur non essendo particolarmente efficiente. Dell’efficienza torneremo ad occuparci in seguito, quando parleremo del pipelining.

MAI NIENTE DI FACILE

A nessuno (o quasi) piace complicarsi la vita e agli ingegneri ancora meno che a chiunque altro. Pare un controsenso, visto che già l’andare a studiare ingegneria è un complicarsi la vita, ma in realtà, per ogni problema che si trova ad affrontare, l’ingegnere cerca di venirne fuori con la soluzione più semplice possibile. I motivi sono tanti. Una soluzione complicata significa probabilmente un dispositivo più costoso, che consuma di più, più difficile da progettare, modificare o riparare. Una soluzione facile invece costa poco, è facile da fare, non ti stressa e se salta fuori un problema quasi sicuramente sei in grado di aggiustarlo tra il caffè e la merendina durante la pausa.

Il problema è che non c’è mai niente di facile. Anche le cose all’apparenza più semplici, se ci pensate, nascondono molteplici livelli di complessità. Un esempio? Prendete una cosa facile facile come “accendere la luce”. Che ci vuole, no? Allunghi il dito e premi l’interruttore. Ma pensate a cosa deve fare il cervello per accendere la luce. Deve innanzitutto ricevere l’ordine, poi deve controllare la posizione corrente del braccio e di tutte le articolazioni tra la spalla e il dito, poi deve calcolare il movimento da far eseguire a tutte le suddette articolazioni, poi deve memorizzare la loro nuova posizione così da poter eseguire il movimento successivo, quale che sia. In certi casi, i risultati dell’operazione verranno lasciati nella memoria a breve termine, e magari più in là dimenticate (pensate ad un’azione come “poggiare le chiavi dopo essere rientrati in casa”); altre invece verranno copiate dalla memoria a breve a quella a lungo termine (in genere cose del tipo “accendere il fuoco sotto la caffettiera” prevedono che ti ricordi che il fornello è acceso, pena seri disastri). In generale, ogni cosa che fate, per quanto elementare, comunque richiede un certo numero di sotto-passaggi da eseguire in sequenza prima che l’operazione in questione possa dirsi completata.

Potrebbe sembrare strano, ma un microprocessore lavora nella stessa identica maniera. Non esiste una cosa semplice come “fai un’addizione”: affinché l’operazione possa dirsi completata, il processore dovrà fare più di una cosa. Cosa? Be’, innanzitutto dovrà ricevere l’ordine, poi dovrà caricare i valori correnti degli operandi, eseguire l’operazione, eventualmente salvare gli operandi nella memoria a lungo termine (leggi: la RAM) ed aggiornare gli operandi nella memoria a breve (leggi: i registri). La sequenza di operazioni è grossomodo quella della Figura 1.

 

Figura 1: Ciclo di esecuzione.

Figura 1: Ciclo di esecuzione.

 

È qui che si comincia a capire perché l’Intel non ha poi tutti questi concorrenti. Alla fine, come abbiamo visto, progettare un set di istruzioni è stato abbastanza semplice: si deve decidere cosa si vuole fare e cosa ogni istruzione vogliamo che faccia. La ALU è semplicemente una serie di circuiti in parallelo, uno per ogni operazione che vogliamo che il nostro processore sia in grado di eseguire. Parleremo tra un attimo dei registri, ma alla fine dei conti quelli sono solo una serie di flip-flop. Il vero inghippo è mettere insieme i pezzi. Ogni colpo di clock non deve semplicemente “accendere” il circuito giusto della ALU, ma deve provocare una cascata di eventi che porterà al completamento dell’istruzione. A seconda del processore e, soprattutto, di quanto lo si vuole performante, questi eventi possono essere più dei cinque che abbiamo elencato, ma meno di questi non ce ne possono essere. Oggi vi faremo vedere come progettare un circuito che implementi questi cinque passi. Non sarà un processore particolarmente veloce, ma sarà funzionante. Dell’ottimizzazione ci occuperemo più in là.
[...]

ATTENZIONE: quello che hai appena letto è solo un estratto, l'Articolo Tecnico completo è composto da ben 3876 parole ed è riservato agli ABBONATI. Con l'Abbonamento avrai anche accesso a tutti gli altri Articoli Tecnici che potrai leggere in formato PDF per un anno. ABBONATI ORA, è semplice e sicuro.

Scarica subito una copia gratis

Scrivi un commento

Seguici anche sul tuo Social Network preferito!

Send this to a friend