L'architettuda dei calcolatori.


Lo schema di esecuzione che si è andato delineando nelle due precedenti puntate, a dire il vero, è caratteristico delle macchine del tipo Complex Instruction Set Code, che come dice il nome stesso possiedono un set di istruzioni nutrito e sofisticato. Queste macchine agevolano il compito del programmatore, che può contare su istruzioni avanzate, ma rendono arduo il compito al loro progettista che deve realizzare un circuito più complesso ed un FIRMWARE più sofisticato, scritto in un linguaggio detto RTL .
Il grande svantaggio di tali architetture è che per l'unità di governo non è possibile cominciare a decodificare l'istruzione successiva prima che l'ALU abbia terminato l'esecuzione di quella attuale, rallentando così l'intera elaborazione.
Sul mercato sono apparse architetture di tipo Reduced Instruction Set Code, ovvero fornite solo delle istruzioni elementari e per giunta il loro numero è molto ristretto. Le istruzioni sono molto simili a quelle che costiuiscono i microprogrammi nelle macchine CISC e consentono di operare solo sui dati presenti nei registri del microprocessore, pertanto è necessario trasferire i dati da elaborare da e verso la memoria attraverso specifiche istruzioni, generalmente indicate con il codice mnemonico che ricorda le parole: LOAD e STORE. Per questo motivo i microprocessori RISC sono anche detti Load & Store Unit. Come avrete certamente intuito è compito del programmatore realizzare all'occorrenza dei microprogrammi per simulare le istruzioni complesse di solito disponibili nelle macchine CISC, così a parità di elaborazione il programma per macchine RISC è più lungo dell'equivalente per macchine CISC.
Il lavoro del progettista hardware invece è semplificato notevolmente, così come la struttura del microprocessore, consentendo di aggiungere più ALU in parallelo o altri tipi di unità nello stesso numero di componenti ed a pari energia dissipata, rispetto ad un processore CISC.

Le istruzioni di tipo RISC sono caratterizzate dall'avere tutte la stessa lunghezza, in questo modo l'unità di governo non solo non perde più tempo a rintracciare la lunghezza dell'istruzione attuale, ma può valutare istantaneamente l'indirizzo della prossima istruzione e prelevarla: così se questa istruzione coinvolge dati diversi, un'unità elaborativa libera può eseguirla in parallelo.
Le più potenti macchine CISC pure, difficilmente riescono ad eseguire una sola istruzione per ciclo di clock, viceversa le RISC pure, riescono tranquillamente ad eseguirne più di una, purchè il codice sia ottimizzato, ovvero la sequenza delle istruzioni generate dal compilatore/assemblatore sia stata organizzata in modo da sfruttare il parallelismo interno.
Il bilancio costi/benefici oggi è nettamente a favore dei processori RISC, così sono apparsi degli "ibridi" che potremmo definire CRISC, i quali tentano di coniugare i vantaggi di entrambe le tecnologie: le istruzioni più utilizzate sono implementate in modalità RISC, mentre quelle meno utilizzate ma "indispensabili" per alcuni compiti, sono implementate in modalità CISC.

I progettisti si sono ingegnati a lungo per risolvere il problema della lentezza delle macchine CISC, soprattutto per quanto riguarda i complessi calcoli matematici, fortemente dipendenti dal formato Floating Point (virgola mobile), attraverso il quale i numeri reali vengono rappresentati all'interno della memoria del calcolatore. Inizialmente questo sistema di rappresentazione, poco consono alla logica binaria delle CPU, era gestito con l'ausilio di microprogrammi specifici aggiunti alle routine del sistema operativo della macchina. Sfortunatamente questa scelta penalizzava molto le prestazioni, così furono realizzati dei particolari processori detti Floating Point Unit, meglio conosciuti con l'acronimo FPU, il cui scopo era quello di riprodurre in hardware tali microprogrammi, sgravando la CPU dall'oneroso compito.
Queste unità di calcolo vennero subito battezzate come coprocessori matematici, e risiedevano su un chip apposito, che andava ad affiancare la CPU sulle piastre madri, ed erano connesse all'unità centrale attraverso un bus dedicato.
Il passo successivo è stato quello di integrare le FPU direttamente nella CPU, migliorando così le prestazioni. Ovviamente il salto qualitativo fu compiuto dai produttori di architetture RISC e poi imitato anche per le CISC.
Oggi la FPU è così bene integrata nell'unità centrale, che le sue istruzioni fanno parte del set del microprocessore e spesso sono eseguite in parallelo, senza penalizzare l'esecuzione delle istruzioni riguardanti i numeri interi, proprio perché coinvolgono dati e registri differenti.

Il passo successivo per migliorare le prestazioni delle macchine basate su tecnologia RISC è stato l'ideazione della Pipeline, ma ben presto, visti i risultati positivi venne adattata anche nelle architetture CISC. La pipeline riprende il paradigma MISD .
La scelta di tale termine è quanto mai infelice per una sua traduzione in italiano: pipeline si tradurrebbe con "tubatura", mentre l'idea alla sua base è quella della catena di montaggio. Si suddivide, incrementando inevitabilmente la complessità del circuito, l'elaborazione dell'istruzione in stadi, generalmente pre-fetch, fetch ed execute. La fase di pre-fetch consiste nell'inoltrare la richiesta alla memoria di fornire la prossima istruzione da eseguire. La fase di fetch consiste nel riconoscimento dell'istruzione precedemente ricevuta dalla memoria e nel predisporre sia la successiva richiesta di pre-fetch, che l'elaborazione dell'istruzione appena decodificata. La fase di execute è la classica fase di elaborazione dei dati.
Tutte le fasi, una volta entrata a regime la pipeline, vengono completate nello stesso ciclo di clock, anche se riguardano 3 distinte istruzioni macchina, dando così l'illusione che per ogni ciclo di clock si sia elaborata un'istruzione. Ovviamente il processo può andare in stallo in situazioni particolari, perdendo in un sol colpo i vantaggi di tale architettura, ma questo è dovuto principalemte ad errori di programmazione e più precisamente in una non perfetta ottimizzazione del codice: ecco perché a volte semplicemente invertendo l'ordine di alcune istruzioni si ottengono velocità tanto diverse.
Alcune aziende come la INTEL per il loro prodotto di punta hanno realizzato un'apposita unità elaborativa all'interno della CPU, che ha il compito di riorganizzare al volo la sequenza delle istruzioni in modo da limitare gli stalli della pipeline. A mio avviso questa scelta è alquanto discutibile, dato che il compilatore ha una "visione" migliore di ciò che il programmatore desidera fare, rispetto all'unità interna al processore che deve basare le sue decisioni su una ristretta sequenza di istruzioni macchina!

A differenza da quanto emerge dalla "guerra al rialzo dei MegaHertz", poichè non è facile aumentare la frequenza di funzionamento dei dispositivi elettronici, la soluzione migliore è quella di aumentare l'efficienza del processore, magari incrementando il grado di parallelismo interno, sono nate così le architetture SuperScalari, costituite da più pipeline intere ed anche floating point, che girano in parallelo o per lo meno si cerca di farle girare il più possibile in parallelo.
In altre parole, all'interno del processore è eseguito più di un flusso elaborativo, per esempio il 68060 della Motorola dispone di due pipeline intere (complete) ed una floating point, che possono lavorare contemporaneamente se il codice è stato generato in modo opportuno, portando alla conclusione di ben tre istruzioni differenti per ogni ciclo di macchina. Viceversa il Pentium della Intel , che è basato su una doppia pipeline 80486, di cui una sola può eseguire tutte le istruzioni x86, e da una floating point che può essere mappata al posto della pipeline incompleta, nelle migliori ipotesi di ottimizzazione può eseguire due istruzioni intere o una intera ed una floating point per ogni ciclo di clock: si spera che le cose siano migliorate nelle ultimissime evoluzioni di questo processore.

La perenne ricerca delle prestazioni ha portato sia i costruttori di macchine RISC e sia quelli di macchine CISC a integrare nelle CPU anche unità di tipo SIMD per i compiti di calcolo più impegnativi, come i calcoli vettoriali o differenziali, fondamentali per applicazioni di grafica soprattutto nel campo delle applicazioni 3D. Basti pensare al set di istruzioni MMX evolutesi lentamente in SSE, che sono state aggiunte dalla Intel alla 2ª generazione di Pentium, trasformandola "magicamente" nella 3ª generazione, o al motore enanched3DNow! della AMD per i suoi Athlon (K7), o alla tecnologia Altivec di Motorola , che ha debuttato nell'ultimissima generazione di PPC battezzata G4.

Ovviamente in questa corsa all'integrazione sono avvantaggiati i produttori di macchine RISC, che partono da un modello più semplice ed efficiente, mentre quasi tutte le tecnologie CISC sembrano avviate lungo un binario morto, l'unico modo per aumentarne l'efficienza, non potendo aumentare facilmente il parallelismo interno, è quello di aumentarne la frequenza di funzionamento.
Sfortunatamente, ciò impone grossi limiti come l'eccessiva produzione di calore alle alte frequenze o l'impossibilità di effettuare trasmissione ad alta velocità su percorsi dell'ordine dei centimentri senza incappare nei disturbi prodotti dalle onde radio e/o fenomeni parassiti. Il tutto costringe a miniaturizzare ed integrare nello stesso chip più funzioni, peggiorando così la dissipazione del calore: ormai si parla di raffreddamento a liquido per i processori ad alte prestazioni della classe x86!
Inoltre si rendono necessari grossi investimenti per migliorare il processo produttivo. Già oggi è miracoloso spingersi a livelli di 0.18 micron, che solo le aziende più avanzate sono in grado di sfruttare, ma ben presto ci si scontrerà con i limiti invalicabili dettati dalla stessa struttura della materia, pertanto piuttosto che puntare sulla miniaturizzazione ed incremento delle frequenze bisognerà escogitare, ed alla svelta, nuovi schemi di funzionamento per rendere più efficienti quei processori.
Sarà forse per questo che la Intel , in collaborazione con la Hewlett Packard , ha avviato già da alcuni anni gli studi di una nuova CPU il cui nome in codice è IA64, meglio nota con il nome di Merced.
Nonostante gli strilli di trombe e gli annunci altisonanti, l'uscita di questo "prodigio" slitta di anno in anno ed ormai rischia di uscire già obsoleta: la stessa HP sconsiglia di acquistare la prima generazione della IA64, perché poco efficente e costosa.

Ma una nuova concezione sta per ravvivare lo stanco mercato dei microprocessori. Il frutto dell'auspicata rivoluzione sono i processori detti Media Processor, destinati a svolgere i complessi calcoli di codifica e decodifica degli stream Audio/Video.
Questi processori sono visti dal resto della macchina come un'unica entità, praticamente come accade con le attuali CPU, tuttavia al loro interno sono strutturati come un completo sistema composto da diverse unità elaborative specializzate, che spaziano dalle classiche ALU ed FPU alle Vector Unit (unità specializzate nel calcolo vettoriale), insieme a vari DSP e microcontrollori, a seconda dell'utilizzo al quale sono destinate. Al loro interno vi è un velocissimo bus a 128/256bit che collega tutte le unità.
I principi di funzionamento sono completamente differenti da una classica CPU: dopo la decodifica dell'istruzione, l'unità di governo, consultando i suoi registri, trova un'adeguata unità libera, le invia i dati da elaborare e successivamente ne preleva i risultati.
La struttura è un po' più complessa di quella delle macchine RISC, ma a parità di potenza elaborativa raggiungibile, se il software è ben strutturato, sia le macchine RISC che quelle CISC ne escono ampiamente sconfitte.
Oggi sono già in uso alcuni Media Processor, ma per il momento sono relegati al ruolo di comparse ed utilizzati come una sorta di supercoprocessore grafico. Il primo prodotto che li utilizzerà come processore primario sarà la nuova console della Sony che è l'evoluzione della fortunatissima PlayStation, la PlayStation 2, il cui sistema graviterà attorno ad un Media Processor battezzato Emotion Engine, prodotto dalla Toshiba e basato sul core della serie RX000 della MIPS . Le attuali CPU sono basate su 4 o 5 unità elaborative che difficilmente lavorano in parallelo, mentre i valori medi dei Media Processor sono di circa una trentina di unità. In pratica è come avere 5 o 6 CPU che girano in parallelo, condividendo però le risorse più preziose e costose come i registri e le cache.

I media processor, in generale, sono basati sulla nuova tecnologia Very Long Instruction Word, che da ora in poi indicheremo con la sigla VLIW. Poichè sono un'evoluzione dell'architettura RISC, i Media Processor hanno un ristretto numero di istruzioni, quindi è necessario un esiguo numero di bit per identificarle tutte, mentre le attuali ampiezze dei bus (32/64bit) spingono a leggere ampie sequenze di bit per non penalizzare le prestazioni. Ciò porta ad un sottoutilizzo della banda disponibile. Così qualcuno ha pensato di impachettare nella stessa sequenza più di un'istruzione, generando quindi un'istruzione virtuale, che sfrutta fino in fondo la banda resa disponibile dagli attuali bus. L'unità di governo, una volta ottenuta l'istruzione virtuale, la scompone nelle istruzioni elementari e le invia alle unità di calcolo libere.
In casa Motorola questa tecnica è usata dai processori della famiglia ColdFire, che attraverso un set VLIW riescono ad eseguire buona parte del set originario della famiglia 680X0 con prestazioni nettamente superiori e costi inferiori. Ma i loro agguerriti concorrenti, nonché figli della stessa tecnologia, sono i prossimi venturi IA64, la CPU camaleonte della Transmeta , ed il nuovo MAJC della SUN , che oltre ad essere un potente JavaChip, ovvero un microprocessore in grado di eseguire in modo nativo i programmi scritti usando i bytecode, cioè una sorta di linguaggio macchina universale di solito emulato via software dalla Java Virtual Machine, è anche in grado di decodificare alcuni stream audio/video contemporaneamente.

E con questo si conclude la trattazione sui microprocessori. Speriamo abbiate gradito il nostro escursus su questo complesso ma fantastico mondo.
Vi ringraziamo per averci seguito in queste puntate ed attendiamo i vostri commenti e le vostre opinioni via e-mail.


Francesco De Napoli