Negli ultimi anni (dal 1984) un gruppo di fisici italiani, di cui faccio parte, ha speso il proprio tempo nella progettazione e nella costruzione di un calcolatore, APE, capace di effettuare fino a un miliardo di operazioni aritmetiche al secondo. Può sembrare strano che dei fisici, prevalentemente teorici, intraprendano una simile impresa (un mio amico ingegnere una volta mi disse: “Voi fisici siete strani: un ingegnere, se gli serve un calcolatore, non se lo costruisce, se lo compra.”). Tuttavia non siamo impazziti per un colpo di sole, ma c’erano dei motivi oggettivi che rendevano i tempi propizi per una tale impresa. Lo prova infatti il fatto che vari gruppi nel mondo, alla Columbia University, in Giappone, nei laboratori di ricerca IBM, si sono impegnati in progetti simili.
Esistono moltissime applicazioni dei 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) che richiedono un’enorme capacità di calcolo numerico. Infatti in tutti questi problemi è estremamente difficile fare progressi ulteriori utilizzando tecniche analitiche e la simulazione diretta sembra essere l’unica soluzione possibile per ottenere risultati quantitativi, da poter poi confrontare con l’esperimento.
Per capire fino in fondo l’importanza delle simulazioni numeriche, è necessario chiarire il quadro concettuale in cui si muove la ricerca in fisica. Attualmente le leggi della fisica, dai nuclei atomici alle galassie, sembrano essere del tutto assodate ed è opinione corrente che il futuro non dovrebbe riservarci sorprese (almeno la stragrande maggioranza degli scienziati non se le aspetta); al contrario alle scale piccolissime (molto più piccole di un nucleo atomico) o alle grandissime scale (l’universo intero) ci sono molte cose che non comprendiamo e sotto certi rispetti brancoliamo nella più totale ignoranza. In altri termini per le scale che interessano le normali attività umane, nell’intervallo che va dalla fisica nucleare alla chimica fino alle evoluzioni stellari, abbiamo una formulazione completa e soddisfacente delle leggi.
Tuttavia la conoscenza delle leggi di base non implica affatto una comprensione dei fenomeni; in altri termini nessuno dubita che gli elettroni interagiscano fra di loro respingendosi con una forza inversamente proporzionale al quadrato della distanza e che i loro movimenti siano regolati dalla meccanica quantistica. In questo indiscusso quadro concettuale però non è affatto evidente perché e percome certi materiali diventino superconduttori ad una temperatura relativamente elevata; infatti la cosiddetta superconduttività ad alta temperatura è stata scoperta solo recentemente e nonostante l’enorme massa di dati accumulata in questi ultimi anni, siamo ben lontani dal capire le origini di questo fenomeno, che restano ancora misteriose. La vera difficoltà non sta nella formulazione delle leggi fondamentali, ma nello scoprire le conseguenze di queste leggi e nel formulare (o su base puramente sperimentale, o come conseguenza delle leggi basilari) leggi fenomenologiche del tipo “le molle si allungano proporzionalmente alla forza applicata”. In questo processo, faticoso e non lineare, un approccio deduttivo formale (amato dai matematici) nella maggior parte dei casi non porta a nulla; è necessario procedere basandosi sull’intuizione e per indizi (come il cacciatore), formulando ipotesi di lavoro, la cui verifica viene rimandata, ed effettuando semplificazioni successive; alla fine si ottiene una descrizione nitida del fenomeno sulla quale si può costruire una teoria (la teoria della superconduttività, la teoria dei vetri di spin, ecc) utilizzando in quest’ambiente artificiale gli strumenti logici deduttivi.
Questo miscuglio di intuizione e di deduzione permette di fare predizioni sul comportamento di sistemi fisici, predizioni spesso verificate. In questo senso si legge spesso che la teoria del tal dei tali è stata confermata sperimentalmente; ma la parola teoria si riferisce quasi sempre non alle leggi di base, ormai al di là di ogni dubbio, ma proprio a questo procedimento per dedurre leggi fenomenologiche.
Attualmente assistiamo nella fisica all’affermarsi prepotente sulla scena di un nuovo strumento d’indagine: il calcolatore elettronico. Una volta il passaggio dalle leggi alle conseguenze delle leggi era effettuato mediante argomentazioni che potevano sia usare strumenti rigorosi matematici sia basarsi (e questo accadeva spesso) su una logica più intuitiva e sull’analogia. Nell’immaginario scientifico il fisico teorico aveva bisogno solo di carta e matita per fare le sue previsioni, in opposizione allo sperimentale che aveva necessità di costose apparecchiature. I calcolatori attuali hanno enormemente ampliato le capacità di calcolo (esistono calcolatori capaci di fare circa un miliardo di operazioni al secondo su numeri di 7 cifre). Le capacità di calcolo sono aumentate di più di un miliardo di volte e quindi imprese, una volta considerate impossibili, sono diventate del tutto banali. Per esempio, se si voleva calcolare teoricamente la temperatura di liquefazione di un gas (l’argon) supponendo di conoscere già la forma delle forze fra i vari atomi, bisognava fare approssimazioni che non erano del tutto giustificate e, solo sotto queste ipotesi, mediante semplici calcoli, si poteva ottenere una predizione, per la temperatura di liquefazione, che non era in ottimo accordo con i dati sperimentali (un errore tipico potrebbe essere il 10% sulla temperatura assoluta). L’unica strada per migliorare l’accordo fra le previsioni e l’esperimento consisteva nel rimuovere a poco a poco le approssimazioni; questo schema teorico, noto come la teoria delle perturbazioni, conduce a espressioni molto complicate, a calcoli molto noiosi che possono essere fatti a mano o, se necessario, col calcolatore.
Invece di fare approssimazioni sul moto delle particelle, il punto di vista completamente nuovo consiste nel calcolare esattamente mediante il calcolatore (ovvero di simulare) il moto di un certo numero di atomi di argon (per esempio 8000) dentro una scatola di dimensioni variabili e di osservare quello che succede: ovvero se l’argon si comporta come un liquido o come un gas. Il peso computazionale di una tale simulazione è enorme; bisogna calcolare le traiettorie di 8000 particelle e seguirle per un tempo lungo abbastanza per poter trascurare la dipendenza dalla configurazione iniziale. Se pensiamo che i matematici del secolo scorso si sono scervellati per studiare le traiettorie di pochi pianeti, ci rendiamo conto che un simile approccio non era nemmeno immaginabile in assenza del calcolatore.
Le simulazioni hanno uno stato intermedio fra teoria ed esperimento: non sono certo un’esperimento tradizionale, nel senso che non si usano atomi di argon per ottenere la temperatura di liquefazione, tuttavia il compito del teorico rassomiglia molto a quello di uno fisico sperimentale tradizionale: prepara il suo apparato sperimentale (il calcolatore), decide le condizioni in cui l’esperimento avviene (condizioni iniziali, numero di particelle, forma delle forze, ecc.), lancia la simulazione e aspetta i risultati, che alla fine guarda e analizza. Non a caso le stime ottenute mediante simulazioni numeriche sono affette da un errore statistico e da un errore sistematico, come d’altronde i risultati di vere misure. La vecchia dicotomia, teorico-sperimentale, è sostituita da una tripartizione del sapere: teoria pura (carta e matita per intenderci), simulazione e esperimento. La simulazione molto spesso fa da trait d’union fra la teoria e l’esperimento: lo sperimentale confronta i suoi dati con i risultati delle simulazioni e il teorico cerca di essere in grado di predire i risultati delle simulazioni.
Uno dei motivi dell’interesse suscitato dalle simulazioni consiste nel fatto che si possono simulare anche sistemi non esistenti in natura, ma più semplici dal punto di vista teorico. Questo permette alle simulazioni di diventare il laboratorio privilegiato per la verifica di nuove teorie (testing ground) che non potrebbero essere verificate direttamente nel mondo reale in quanto troppo complicato. Ovviamente lo scopo finale è di applicare queste idee in casi concreti, ma questo può avvenire solo dopo che la teoria si è sufficientemente irrobustita e ha preso fiducia in se stessa dal confronto con le simulazioni. Semplificando potremmo dire che le simulazioni giocano anche il ruolo di incubatrici per teorie nate settimine.
Data l’importanza crescente delle simulazioni numeriche, non è strano che i fisici teorici siano sempre più interessati ad avere a loro disposizione delle risorse di calcolo di potenza sempre più crescente. La tecnologia attuale è in grado di soddisfare queste esigenze, ma l’appetito viene mangiando, e la fame di tempo di calcolo dei teorici non sembra aver limite. E’ naturale quindi per un fisico teorico domandarsi se non si possano costruire dei calcolatori più veloci di quelli commerciali, essendo disposto a pagare l’aumento in velocità con una un perdita in versatilità.
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.
Per capire che cosa bolle in pentola è 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 dimensioni fisiche sono circa uguali a quattro frigoriferi (del tipo per famiglia numerosa); a questo calcolatore possono essere attaccati un centinaio di terminali, oltre a svariate linee telefoniche e unità nastri.
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 cosiddetta 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 cosiddetta CPU – central processing unit) è estremamente piccola: si tratta di una singola scheda di pochi decimetri quadri di superficie e di un centimetro di spessore. In calcolatori lievemente più piccoli la CPU è concentrata su un singolo chip di qualche centimetro quadro di superficie.
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 operazioni 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 Macintosh 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 centimetri ed un segnale elettrico fa un percorso di 10 – 15 centimetri 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 computers va chiaramente in questa direzione in quanto compiti che tradizionalmente venivano 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 dipende dal 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 la fila alle varie CPU; se la fila per accedere a punti della memoria dove sono immagazzinate 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 alleviare 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 archittettura 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 possibile, messaggi provenienti da CPU diverse ed indirizzati alla stessa memoria. Si tratta di una macchina estremamente interessante, ma in fondo troppo complicata per molte delle esigenze di calcolo della fisica.
In molti problemi di calcolo numerico intensivo, a cui i fisici sono interessati, la struttura delle equazioni che debbono essere risolte permette essa stessa 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 cosiddetta 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; tuttavia in questo caso abbiamo il problema che ciascun atomo deve avere l’informazione sulle posizioni di tutti gli altri atomi (o almeno degli atomi più vicini) e quindi tutte le varie CPU devono comunicare fra di loro.
La situazione cambia se passiamo alla fisica dei solidi: se studiamo le oscillazioni di un cristallo, in prima approssimazione ogni atomo interagisce solamente con i suoi vicini, quindi se assegnamo lo studio dell’evoluzione di un atomo ad una singola CPU, ogni CPU ha bisogno di comunicare con le CPU vicine (6 su un reticolo cubico). Più in generale se vogliamo simulare delle equazioni alle derivate parziali (un problema locale, senza azione a distanza) queste equazioni possono essere rimpiazzate con delle equazioni alle differenze finite; possiamo assegnare ad ogni CPU il problema di studiare l’evoluzione delle soluzioni delle equazioni in un punto (o in una zona dello spazio) e data la località delle equazioni la nostra CPU ha anche qui bisogno solo delle informazioni contenute nelle CPU vicine.
Un caso molto intuitivo in cui questa strategia può essere applicata è lo studio delle previsioni del tempo su scala planetaria. Qui 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 informazioni in maniera di prevedere le stesse condizioni meteorologiche 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 parallelo, 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: ciascuna unità aritmetica è capace solamente di fare operazioni numeriche, mentre tutta l’attività di livello più elevato, in particolare le decisioni logiche (il controllo degli if e dei do, ovvero quale istruzioni del programma devono essere eseguite) viene demandata all’unica unità centrale; in questo schema le singole unità aritmetiche eseguono contemporaneamente la stessa istruzione (per esempio una moltiplicazione od una somma), ovviamente con operandi differenti.
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 come abbiamo visto molti problemi fisici si possono facilmente risolvere su una macchina con una struttura SIMD, con una rete di comunicazione relativamente semplice. Dato che una macchina SIMD ha uno spettro di applicazioni relativamente ristretto dal punto di vista industriale, è scarso l’interesse delle grandi case costrittrici in questo tipo di architettura, che al contrario soddisfa pienamente le esigenze di molti fisici teorici.Questa situazione spiega come mai i calcolatori di tipo SIMD costituiscano una specie di nicchia ecologica, non occupabile da grosse imprese, in cui dei piccoli gruppi di ricerca, ben motivati, possono prosperare.
Chiarito il quadro di riferimento generale, possiamo incominciare a parlare concretamente di APE.
La scuola di Roma di fisica teorica delle alte energie è ben nota e dal 1980 in poi, un parte di questo gruppo si è occupata delle simulazioni numeriche delle interazioni forti: si tratta di simulare le proprietà di una teoria di campo quantistica relativistica che descrive le interazioni fra gluoni e quarks. Se discretizziamo una teoria quantistica introducendo un reticolo abbiamo nel caso più semplice un grado di libertà quantistico per ogni sito del reticolo; nel nostro caso, se teniamo conto dello spin e dei gradi di libertà interni dei gluoni e dei quarks (colore e sapore) abbiamo circa un centinaio di gradi di libertà per sito. In una simulazione tipica si prende in esame un reticolo cubico con un decimo di Fermi come passo reticolare e 2 Fermi di lato; dato che un protone ha un diametro di poco superiore ad un Fermi il passo reticolare deve essere abbastanza piccolo per risolvere la struttura interna del protone, mentre il lato del reticolo deve essere abbastanza grande da contenere un protone senza schiacciarlo; non è quindi possibile considerare un reticolo con molti meno punti senza introdurre degli errori sul risultato finale non facilmente controllabili. Ci troviamo quindi a dover considerare circa diecimila punti, con un centinaio di gradi di libertà per sito, per un totale di un milione di gradi di liberà; non deve stupire quindi che il calcolo degli autovalori più bassi di un’Hamiltoniana con un milione di gradi di libertà richieda delle quantità enormi di calcoli. Con un problema di questo tipo in mano, i calcolatori esistenti si saturano molto velocemente e si è naturalmente spinti a cercare qualcosa di nuovo.
Mi ricordo che dal 1982 al 1984 ci vedevamo spesso, Nicola Cabibbo, Franco Marzano ed io a discutere come poter costruire un calcolatore che potesse soddisfare le nostre esigenze. Solo nel 1984 ci siamo messi al lavoro, coinvolgendo nell’impresa altri fisici di Roma, Pisa, Bologna, Padova e CERN. L’avvenimento principale che ci ha spinto, dopo due anni di discussioni, a partire è stata l’uscita sul mercato delle unità floating point della Weitek: si tratta di chips, (in due versioni, moltiplicatore o addizionatore), di costo inferiore al milione, capaci di fare ciascuno 8 milioni di operazioni al secondo. La tentazione di prendere 64 moltiplicatori e 64 addizionatori (molto spesso nei programmi il numero delle moltiplicazioni è uguale al numero delle addizioni, conviene quindi fare una macchina bilanciata) e di costruire un calcolatore capare di fare un miliardo di operazioni al secondo diventava irresistibile.
Ovviamente non basta comprare dei chips, metterli in bell’ordine sul tavole, dir loro ad alta voce “calcolate” e pretendere che questi calcolino. In un’architettura SIMD bisogna costruire la CPU centrale, che controlla il flusso di istruzioni e di dati alle unità aritmetiche, N copie delle memorie e delle unità aritmetiche (N essendo il grado di parallelelismo della macchina) e una rete di comunicazione, sotto il controllo della CPU centrale, fra le unità aritmetiche e le memorie. Tutto questo deva essere collegato al mondo esterno (non basta che il calcolatore calcoli, è anche necessario sapere quali sono i risultati del calcolo) mediante apposite interfaccie. I problemi hardware, appena descritti, rappresentano forse solo la metà delle difficoltà: bisogna definire un linguaggio di programmazione adeguato all’architettura non convenzionale della macchina, scrivere sia un compilatore per questo linguaggio, sia i programmi di gestione delle comunicazioni fra il mondo estremo e il nostro calcolatore specializzato. Inoltre bisogna eliminare tutti gli errori di logica che si sono infilati nei programmi: infatti un compilatore può funzionare perfettamente su tutta una serie di programmi di test e sbagliare, per motivi apparentemente casuali, sul centesimo o sul millesimo programma che viene compilato. Una richiesta essenziale è che il compilatore sia in grado di produrre il codice eseguibile in maniera ottimizzata: sarebbe frustrante costruire un calcolatore, potenzialmente velocissimo, per poi scoprire che a causa della scarsa efficienza del software, la velocità effettiva dei programmi è di molto inferiore a quella teoricamente possibile.
Nella costruzione di APE, abbiamo cercato di attenerci, per quanto possibile, a schemi di massima semplicità. A questo scopo abbiamo scelto un parallelelismo non eccessivamente elevato: 16 memorie e 16 unità aritmetiche, ciascuna delle quali occupa una scheda; in questo modo le memorie e la CPU centrale possono essere ospitate in un singolo crate (un crate è essenzialmente uno scatolotto di dimensione variabile, nel nostro caso circa un cubo di una quarantina di centimetri di lato, in cui vengono messe delle schede), mentre un secondo crate ospita le 16 unità aritmetiche. Una rete di comunicazione molto semplice mette in comunicazione le memorie con le unità aritmetiche: per esempio le memorie e le unità aritmetiche possono essere ordinate sequenzialmente, con condizioni periodiche al contorno, come su di una circonferenza. A secondo degli ordini che arrivano dal controllore centrale ogni unità aritmetica può comunicare con la memoria corrispondente o con la memoria contigua, a destra o a sinistra.
Allo scopo di ottenere un calcolatore potente, nonostante lo scarso numero di unità aritmetiche, è stato necessario avere singole unità aritmetiche molto potenti: dato che le operazioni sui numeri complessi sono le più frequenti in molti casi, l’unità aritmetica è stata specializzata in operazioni sui complessi e ad ogni ciclo della macchina (otto milioni di cicli al secondo) viene effettuata una moltiplicazione ed una addizione complessa. Dato che per fare un’addizione ed una moltiplicazione complessa sono necessarie quattro addizioni e quattro moltiplicazioni fra numeri reali, l’unità aritmetica contiene quattro moltiplicatori e quattro addizionatori della Weitek, che lavorano naturalmente in parallelo. In conclusione la singola unità aritmetica è capace, quando lavora con numeri complessi di fare 64 milioni di operazioni reali al secondo, ed il totale di 16 unità arriva a fare un miliardo di operazioni al secondo.
Attualmente sono in funzione tre calcolatori di tipo APE, due a Roma con 16 e 4 unità e uno a Pisa con 4 unità; ovviamente i calcolatori con 4 unità sono quattro volte più lenti di quelle con 16 unità.Questi calcolatori sono stati utilizzati per la gran parte del tempo per simulazioni delle proprietà delle interazioni forti, e risultati, pubblicati sulle riviste specializzate, sono pienamente soddisfacenti. Il progetto è costato all’INFN (Istituto Nazionale di Fisica Nucleare) circa un miliardo, cifra relativamente piccola se si tiene conto che un supercalcolatore commerciale della classe del Cray II (anch’esso un miliardo di operazioni al secondo) può costare qualche decina di miliardi.
Al momento attuale lo stesso gruppo che ha costruito APE è impegnato nella progettazione e nella costruzione di APE100, un calcolatore che dovrebbe essere duecento volte più veloce di APE, ovvero capace di effettuare duecento miliardi di operazioni al secondo; il costo complessivo del progetto dovrebbe aggirarsi sugli 11 miliardi. (Il lettore a questo punto ha tutto il diritto di domandarsi perché il calcolatore non si chiami APE200. La spiegazione è semplice: il primo progetto che avevamo fatto prevedeva una velocità cento volte superiore ad APE; successivamente abbiamo fatto varie modifiche allo schema iniziale, ognuna delle quali cambiava la velocità della macchina e non potevamo ogni volta che cambiavamo qualcosa, cambiare anche il nome del progetto).
Il fattore duecento si ottiene come prodotto di un fattore 12, dovuto al miglioramento della tecnologia, e di un fattore 16,dovuto all’aumento delle dimensioni. La macchina sarebbe costituita da 4096 processori aritmetici, progettati interamente, ciascuno dei quali capace di effettuare 50 milioni di operazioni al secondo, distribuiti su un reticolo cubico di lato 16. Ciascuna scheda ospiterebbe 8 processori (un cubetto di lato due) e la memoria corrispondente; il calcolatore sarebbe quindi composto da 512 schede alloggiate in 32 crate. Se le cose vanno bene per l’inizio del 1991 dovremmo avere costruito il primo crate della macchina e da quel momento in poi la strada dovrebbe essere in discesa.
Da punto di vista scientifico, questa macchina, una volta costruita, dovrebbe essere in grado di dire un parola definitiva su molte proprietà delle interazioni forti ed essere utilizzata per lo studio di molti altri sistemi fisici. Sarebbe anche estremamente interessante far partire una piccola produzione di macchine dello stesso tipo, per esempio nella versioni in singolo crate da diffondere presso gli istituti di ricerca interessati; ma per questo sarebbe necessaria una collaborazione con industrie esterne, in quanto è necessaria una capacità organizzativa e commerciale che non si può trovare in un ente di ricerca. In fondo APE è il primo supercalcolatore di progettato interamente in Europa: sarebbe bello sperare che la sua realizzazione possa spingere le ditte europee ad investire in questa direzione ed a essere meno dipendenti dagli Stati Uniti in questo settore.