Enormi progressi sono stati fatti nella costruzione di calcolatori elettronici a partire dalla realizzazione del primo esemplare, circa quaranta anni fa. Dal punto di vista dell'hardware (ovvero la struttura fisica della macchina, termine spesso usato in contrapposizione al software, ossia l'insieme dei programmi e più in generale dei linguaggi di programmazione) il progresso è stato essenzialmente di natura tecnologica, non concettuale: lo schema generale della macchina è ancora quello originario (proposto da Von Neumann) dei primi calcolatori; solo in questi ultimi anni, sotto la spinta delle nuove possibilità tecnologiche si cerca di realizzare macchine con architetture differenti, che a parità di prezzo possano essere centinaia di volte più veloci dei calcolatori attuali.

Quale è la necessità al momento attuale di costruire calcolatori sempre più veloci? A parte le risposte più ovvie - c'è un interesse militare in direzione dell'SDI (guerra spaziale), che meriterebbe un discorso molto più articolato, e un interesse commerciale (se non si fanno nuovi modelli il mercato non tira) - si può osservare che ci sono tante cose che vorremmo che un calcolatore facesse: parlare e capire l'Italiano in modo da eliminare le tastiere, eseguire i compiti che gli sono stati assegnati anche se questi gli sono stati definiti con una certa approssimazione (cioè in fondo avere "un po' di buon senso"), essere in grado di distinguere una foto di un ponte da quella di una diga...

Se consideriamo per esempio il problema del riciclaggio dei rifiuti, fino a quando non riusciremo ad avere nelle case sette diversi secchi della spazzatura per rifiuti diversi, è estremamente probabile che buona parte dei rifiuti verranno portati via dalle case mischiati gli uni con gli altri e non ci sarà nessuno disponibile ad andare a frugare nei mucchi della spazzatura per separare i rifiuiti organici dagli inorganici, la plastica dal vetro, i metalli dalla carta e così via; un lavoro di questo genere sarebbe l'ideale per un robot che potrebbe separare i vari rifiuti che gli arrivano portati su di un nastro trasportatore.

Sfortunatamente questo progetto non può essere realizzato al momento attuale (facendo astrazione dai costi) perchè non esiste nessun calcolatore (di dimensioni ragionevoli) che sia in grado in tempi reali di distinguere la composizione dei vari oggetti che si trovano nell'immondizia basandosi sui dati di una telecamera o sulle sensazioni tattili provenienti dai bracci meccanici. Al momento attuale gli algoritmi noti per risolvere il problema del riconoscimento e classificazione delle immagini sono estremamente farraginosi e in ogni caso i calcolatori attuali sono tremendamente lenti nel risolvere problemi complessi, se prendiamo come punto di riferimento il cervello di un mammifero. I costruttori di calcolatori hanno ben presente le deficienze dei calcolatori attuali: Il famoso progetto giapponese "calcolatori di quinta generazione" (finanziato dal ministero dell'industria e tecnologia giapponese) dovrebbe essere il tentativo più organico per arrivare alla costruzione di calcolatori molto più efficienti di quelli attuali con i quli l'uomo dovrebbe essere in grado di interagire in maniera estremamente più agevole.

Per capire che cosa bolle in pentola nel mondo dei calcolatori è innanzitutto necessario riassumere brevemente come funzionano i calcolatori attuali. A questo scopo facciamo un esempio concreto: un calcolatore tipico commerciale relativamente grosso è il Vax 8600 (costo circa un miliardo di lire); le sue dimensione fisiche sono circa uguali a quattro frigoriferi (del tipo per famiglia numerosa); a questo calcolatore possono essere attaccati un centinaio di terminali, più svariate linee telefoniche e unità nastri.

L'osservazione essenziale è che buona parte dello spazio all'interno del calcolatore è occupato dalla memoria, che è organizzata in maniera gerarchica: una memoria "lenta", ma grande (dischi), dell'ordine di un miliardo di caratteri, una memoria veloce più piccola (chips) di qualche milione di caratteri e una memoria velocissima ma molto piccola (anch'essa chips), la cosidetta cache di qualche migliaio di caratteri. Al contrario la parte dove vengono effettuati i calcoli veri e propri e che decide cosa e dove deve essere scritto o letto in memoria (la cosidetta CPU - central processing unit) è estremamente piccola: si tratta di una singola scheda di pochi decimetri quadri di superfice e di un centrimetro di spessore. In calcolatori lievemente più piccoli la CPU è concentrata su un singolo chip di qualche centimetro quadro di superfice.

La CPU è il cuore (o forse meglio il cervello) del calcolatore: i dati provenienti dalle memorie o dai vari canali di input-output col mondo esterno vengono convogliati verso la CPU, che dopo aver eseguito le operazioni opportune, rimanda nuovi dati in altre locazioni di memoria o al mondo esterno. In altri termini, sia le operazione aritmetiche logiche, sia le decisioni di scrittura e lettura dalla memoria vengono eseguite nella CPU. La velocità finale alla quale il calcolatore può eseguire i suoi compiti, dipende in maniera cruciale dalla velocità della CPU (sempre che sia possibile un accesso in memoria con una velocità adeguata).

Mentre il prezzo di CPU sempre più complicate è crollato clamorosamente in questi ultimi anni, dopo l'introduzione di chips a VLSI (very large scale integration) che possono contenere circa un milione di transistors, rimane estremamente difficile fare CPU molto più veloci di quelle attuali: per esempio la CPU di un personal computer come il Mcintosh ha un ciclo (o meglio clock, tempo necessario per eseguire un'istruzione elementare) di 120 miliardesimi di secondo, mentre il nuovissimo Cray 2, il più potente supercalcolatore in commercio (costo circa 40 miliardi), ha un ciclo di 4 miliardesimi di secondo. Diminuire di molto il tempo necessario per effettuare un ciclo è un'impresa molto difficile se si tiene conto che in un miliardesimo di secondo la luce fa un percorso di 30 centrimetri ed un segnale elettrico fa un percorso di 10 - 15 centrimetri circa.

La soluzione ideale sembra non quella di fare CPU più veloci, ma di usare un numero abbastanza elevato di CPU non tanto veloci, ma a basso costo: il successo dei personal computer va chiaramente in questa direzione in quanto compiti che tradizionalmente venivono affidati ad una singola unità centrale, son distribuiti su tanti piccoli calcolatori. Se ci serve un singolo calcolatore estremamente veloce, sembrerebbe una buona idea abbandonare l'architettura proposta da Von Neumann, che prevede una singola CPU per calcolatore ed invece mettere per esempio cento CPU dentro lo stesso calcolatore, visto specialmente che in media il costo della CPU è estremamente basso (dell'ordine di qualche percento del totale) rispetto alle altre componenti del calcolatore (memorie, dischi, alimentazione elettrica, canali di input-output ). In questo modo sarebbe possibile avere dei calcolatori un poco più costosi dei calcolatori attuali con una velocità estremamente più elevata. Il problema serio nasce col fatto che "con tanti galli a cantare, non si fa mai giorno". Ciascuna delle cento ipotetiche CPU deve poter accedere alla memoria (per leggervi o scriverci delle informazioni) in maniera efficiente ed è possibile che varie CPU vogliano leggere cose diverse sulla stessa area di memoria: questa eventualità crea un contrasto di interessi che si può risolvere solo col sistema: "uno per volta per carità", ossia facendo fare una fila alle varie CPU; se la fila per accedere a punti della memoria dove sono immazzinate informazioni cruciali per tutte le CPU diventa troppo lunga, le prestazioni di tutto il sistema si degradano facilmente.

Inoltre, se vogliamo che il nostro ipotetico calcolatore sia teso a risolvere un solo compito complicato, e non cento compiti disparati, è necessario che le varie CPU siano in comunicazione fra di loro in maniera tale che le operazioni aritmetiche-logiche che si svolgono su una CPU dipendano dalle operazioni effettuate sulle altre CPU. La difficoltà nel far ciò non risiede tanto nell'hardware (la comunicazione tra le varie CPU potrebbe avvenire o tramite la memoria in comune o tramite canali diretti), quanto nel software: è già difficile spiegare al calcolatore che cosa deve fare se esiste una sola testa pensante (ovvero una sola CPU) che deve risolvere il problema sequenzialmente, ovvero facendo un'operazione dopo l'altra in ordine prestabilito; le difficoltà diventano quasi insormontabili se si debbono dare le istruzioni ad un centinaio di robot semideficienti (le varie CPU) che si debbono sincronizzare l'uno con l'altro per fare un lavoro coordinato e che fanno esattamente quello che il programmatore gli ha detto di fare, senza metterci un briciolo di buon senso nell'eseguire gli ordini; in sistemi di questo genere è possibile arrivare ad una situazione di stallo di tutto il calcolatore: la prima CPU sta ferma ad aspettare che la seconda CPU gli dia l'autorizzazione a proseguire, la seconda sta a aspettare l'autorizzazione della terza e così via fino ad arrivare all'ultima che sta ad aspettare l'autorizzazione della prima.

Ovviamente il verificarsi di un tale blocco generalizzato dipende dal programmatore che non si era accorto di dare alla macchina istruzioni che avrebbero potuto portare ad una tale situazione: ma è anche evidente che il programmatore non può ragionevolmente prevedere, in caso di programmi complessi, tutte le situazioni possibili. Inventarsi un linguaggio di programmazione efficace per calcolatori a molte CPU è un compito estremamente difficile; anche se generalmente si è d'accordo che bisognerebbe fare qualcosa di radicalmente differente dall'esistente, non è affatto chiaro in quale direzione muoversi. La soluzione ideale sarebbe di poter usare il linguaggio naturale e di spiegare al calcolatore, come si farebbe ad un amico, che cosa deve fare; sfortunatamente per far questo il calcolatore dovrebbe aver una capacità di comprensione del linguaggio naturale che è ben lontano da avere.

Un tentativo possibile consiste nell'utilizzare un'hardware abbastanza sofisticato in modo da allievare parte di questi problemi software: varie macchine di questo tipo sono costruite o sono in costruzione: uno degli esempi più interessanti è il calcolatore RP3, prodotto sperimentale dell'IBM, il cui prototipo dovrebbe essere pronto l'anno prossimo; l'RP3 ha la stessa archittura dell'ultracomputer del Courant Institute della New York University (quest'ultimo non è mai stato costruito): 64 memorie e 64 CPU, connesse da una rete di commutazione (switchbord ) intelligente, che cerca di combinare per quanto possibili, messaggi provenienti da CPU diverse ed indirizzati alla stessa memoria. I prossimi anni ci diranno se tentativi di questo tipo ci danno risultati soddisfacenti o se bisogna tentare qualcosa di completamente nuovo.

Una possibilità alternativa starebbe nell'imitare la natura e costruire un calcolatore che abbia un architettura simile a quella del cervello umano: infatti il sistema nervoso dell'uomo è costituito da circa mille miliardi di neuroni che lavorano in parallelo ed ognuno di questi neuroni comunica in media con un migliaio di altri neuroni; al momento attuale le nostre conoscenze sul funzionamento del cervello sono talmente scarse che questa strada non è percorribile immediatamente: mentre il comportamento dei vari tipi di neuroni (ne esistono circa un migliaio di tipi diversi) è più o meno noto, in certi caso anche in grande dettaglio, non si sa quasi niente su come questi neuroni siano collegati l'uno con l'altro in maniera da formare unità funzionali di qualche migliaio di neuroni e come queste centinaia di migliaia di unità funzionali siano in contatto fra di loro. Nonostante la scarzezza delle informazioni, alcune caute esplorazioni sono cominciate e non è detto che questa direzione non sia alla lunga la più fruttuosa; a questo riguardo è interessante notare che se con le tecnologie d'oggi giorno (supponendo di conoscere nei massimi dettagli come siano connessi i vari neuroni) volessimo costruire circuiti elettronici dalle capacità funzionali paragonabili a quelle di un cervello di un mammifero, le apparecchiature finali occuperebbero di una superfice di un chilometro quadrato e il costo del progetto si aggirerebbe sul milione di miliardi di lire (lira più, lira meno).

Un'altro campo del tutto differente nel quale sarebbero benvenuti calcolatori estremamente veloci, sono i problemi di calcolo numerico intensivo, in cui la struttura delle equazione che debbono essere risolte permette esse stesse un elevato grado di parallelismo. Consideriamo per esempio il problema del moto di una proteina composta da un migliaio di atomi (problema estremamente interessante in quanto la sua soluzione ci permetterebbe di calcolare la conformazione spaziale - la cosidetta struttura terziaria - di una proteina a partire da principi primi); in questo caso possiamo concepire un struttura di calcolo parallelo in cui ogni CPU si occupi del moto di un singolo atomo; similmente nel caso delle previsioni del tempo su scala planetaria possiamo pensare di assegnare a ciascuna delle nostre ipotetiche 24 CPU il compito di calcolare le previsioni del tempo dentro un fuso orario; ovviamente le varie CPU devono scambiarsi delle informazioni in maniera di prevedere le stesse condizioni metereologiche sulle linee di separazione fra i vari fusi orari, ma questo fatto non crea problemi in quanto tutte le CPU possono in maniera sincrona chiede informazioni alle corrispettiva CPU che si occupano delle previsioni del tempo nel fuso orario contiguo (ad Est o a Ovest). In questi casi la natura stessa del problema permette di suddividere il compito globale in tanti compiti identici, da essere eseguiti in paralello, e lo scambio di informazioni fra le varie CPU può effettuato in maniera sincrona e prevedibile. Al limite potremmo immaginare una struttura in cui ci sia una sola CPU che controlla 24 memorie e 24 unità aritmetiche, le quali lavorano in parallelo.

Quest'ultima soluzione (in gergo chiamata calcolatore SIMD - single instruction multiple data - in contrapposizione alla soluzione precedentemente descritta nella prima parte dell'articolo: MIMD - multiple instructions multiple data) è estremamente più semplice da realizzare, anche se ha un interesse meno generale. Tuttavia le applicazioni di calcolatori veloci alla fisica (per esempio calcolo di strutture elettroniche, studio di materiali amorfi, calcolo delle proprietà delle particelle nella cromodinamica quantistica, studio della turbolenza sviluppata) sono talmente numerose, che più di un gruppo di fisici ha incominciato a costruire un calcolatore parallelo a struttura essenzialmente SIMD (una CPU con molte memorie e unità aritmetiche che lavorano in paralello).

In Italia un progetto del genere (progetto APE, finanziato dall'Istituto Nazionale di Fisica Nucleare) è in corso di realizzazione: un primo prototipo di un calcolatore parallello con quattro memorie e quattro unità aritmetiche è in funzione dallo scorso ottobre, un secondo prototipo con le stesse caratteristiche funzionali del primo è stato quasi terminato di costruire; per l'estate prossima dovrebbe essere pronta la versione finale, 16 unità in paralello. Le capacità di calcolo di questo calcolatore saranno paragonabili in molti casi a quelle del Cray II, a costi decine di volte inferiori: una velocità di calcolo di un miliardo di operazioni al secondo ed una memoria dinamica di un miliardo di charatteri (byte ). APE è il primo supercalcolatore di progettato interamente in Europa: sarebbe bello sperare che la sua realizzazione possa spingere le ditte Europee a essere meno dipendenti dagli Stati Uniti in questo settore.