calcolatóri paralleli Locuzione riferita a calcolatori costituiti da un insieme di processori le cui unità di calcolo sono in grado di elaborare contemporaneamente uno stesso calcolo, consentendo la risoluzione di interrogazioni particolarmente impegnative.
Abstract di approfondimento da Computer. Calcolo parallelo di Nicola Cabibbo (Enciclopedia della Scienza e della Tecnica)
La conoscenza delle leggi che governano un dato fenomeno permette in linea di principio di prevederne lo sviluppo nel tempo, ma con i normali strumenti offerti dalla matematica ciò risulta spesso difficile se non impossibile. Vediamo qualche esempio tratto dalla fisica: il moto dei pianeti nel Sistema solare o quello dei quarks all’interno di un protone, le vibrazioni della carrozzeria di una automobile, il comportamento di un fluido turbolento, le onde radio emesse da un telefonino in presenza di fabbricati o altri ostacoli. Le leggi che governano questi fenomeni si traducono in equazioni matematiche che non sono facilmente risolvibili. Problemi altrettanto difficili nascono anche da altri settori, come la biologia: fino a oggi non siamo in grado per esempio di dedurre la forma di una proteina e la sua funzione nella cellula dalla sequenza di amminoacidi che la compongono, e ciò rappresenta un problema di grande importanza pratica oltre che di rilevanza puramente scientifica.
Laddove l’analisi matematica non riesce ad arrivare si ricorre alla simulazione tramite calcolatore. Un sistema solare con molti pianeti (il caso con un singolo pianeta è risolvibile in modo esatto) è rappresentato mediante una serie di numeri che fissano lo stato (posizione, velocità ecc.) di ciascun pianeta; al calcolatore è affidato il compito di determinare come queste grandezze variano al passare del tempo. Occorrerà un programma che, partendo dai valori iniziali, calcoli tali grandezze dopo un breve intervallo di tempo (per es., un minuto) e che, una volta eseguito ripetutamente, consente di calcolare lo stato del sistema dopo un minuto, due minuti, un’ora, un anno e così via. Questo semplice esempio mette in evidenza i due elementi essenziali di una simulazione: un insieme di dati numerici, che rappresentano lo stato del sistema da simulare, e una regola matematica, tradotta in un programma di calcolo, che permette di riprodurne l’evoluzione passo dopo passo.
All’aumentare della complessità del sistema da simulare cresce la mole dei dati numerici da elaborare e il numero delle operazioni aritmetiche da effettuare. La simulazione di un sistema planetario richiede un centinaio di dati e qualche migliaio di operazioni aritmetiche per ciascun passo (step), ed è quindi alla portata di un normale personal computer (PC). Una simulazione ragionevole di un fluido turbolento richiederebbe alcuni miliardi di dati numerici e un centinaio di miliardi di operazioni aritmetiche per ogni passo di evoluzione, capacità che sono al limite di quanto si può ottenere con i migliori supercalcolatori attualmente esistenti.
Esiste una classe di problemi di simulazione, che possiamo definire ‘grandi sfide’, la cui risoluzione richiede una potenza di calcolo virtualmente infinita. I migliori supercalcolatori oggi disponibili permettono di ottenere risultati impensabili fino a qualche anno fa, mentre un miglioramento della potenza di calcolo di un fattore pari a dieci, cento o mille volte porterebbe a importanti progressi nell’accuratezza e affidabilità dei risultati.
Oggi la differenza tra calcolatori di uso comune e supercalcolatori non risiede più nella tecnologia, ma nell’architettura. Per raggiungere le massime prestazioni si ricorre infatti al parallelismo. L’idea di base è molto semplice: per moltiplicare le prestazioni dei già velocissimi microprocessori occorre moltiplicarne il numero, di modo che un calcolo particolarmente impegnativo non venga affidato a un singolo processore, ma a un insieme di processori che collaborino alla sua soluzione. Le unità di calcolo in un calcolatore parallelo lavorano pertanto simultaneamente e, nei casi più favorevoli, le prestazioni sono proporzionali proprio al numero delle unità.
Occorre ricordare che la simulazione su calcolatore non rappresenta una soluzione esatta del problema fisico, ma una sua soluzione approssimata. La quantità dei calcoli necessari cresce con la complessità del sistema da simulare. All’aumentare della potenza di calcolo disponibile si sposta in avanti la frontiera tra ciò che è simulabile e ciò che non lo è. Basti pensare alla possibilità che oggi viene offerta di ricercare una data sequenza di basi nel genoma umano. Dato che esso comprende miliardi di basi, tali ricerche richiedono una grande mole di calcolo e possono essere radicalmente accelerate suddividendo il compito tra molti processori. Tra le grandi sfide del supercalcolo ci sono molti problemi vitali per il futuro dell’umanità: uno tra tutti, la previsione degli effetti delle attività umane sul nostro pianeta tramite un’accurata simulazione dei fenomeni climatici.
Internet stesso può essere considerato un grande calcolatore parallelo. Sono in corso interessanti esperimenti che utilizzano calcolatori collegati alla rete per risolvere problemi di interesse scientifico, come il GIMPS (Great internet mersenne prime search) per la ricerca di numeri primi con numero elevatissimo di cifre. A tale progetto collaborano migliaia di utenti di Internet, che mettono a disposizione i tempi di inattività dei loro calcolatori. La potenza di calcolo dedicata a questa ricerca è di alcuni Tflop. Ancora maggiore (oltre 100 Tflop) è la potenza di calcolo messa in campo dal progetto SETI@home (http://setiathome.berkeley.edu/), che analizza i dati ottenuti dal radiotelescopio di Arecibo per la ricerca di segnali provenienti da intelligenze extraterrestri e conta milioni di aderenti, sia pure saltuari. Internet viene utilizzato per progetti che spaziano dalla matematica alla biologia, dalla simulazione del clima alla progettazione di acceleratori di particelle. In ciascuno di questi casi, un calcolatore centrale suddivide il problema da risolvere in un gran numero di compiti separati, li distribuisce alle macchine dei partecipanti, e quindi raccoglie e analizza le risposte. Per esempio, per verificare se un dato numero a molte cifre è un numero primo, bisogna dimostrare che esso non può essere diviso esattamente per nessun altro numero. Anche se in realtà si usano metodi più raffinati, potremmo immaginare di suddividere i possibili divisori in molti gruppi e affidare a ciascun processore il compito di esaminare la divisibilità per i numeri appartenenti a uno dei gruppi. Per questo tipo di calcolo parallelo si usa l’espressione calcolo parallelo distribuito.
Il primo progetto che utilizza calcolatori messi a disposizione da volontari collegati in Internet, il già citato GIMPS, è attivo dal 1996. Nel 2007 si contano più di un centinaio di progetti di questo tipo, che spaziano dalla matematica alla finanza, dall’arte ai giochi, dalla crittografia alla biologia. Alcuni problemi cui vanno soggetti questi progetti sono il possibile malfunzionamento delle macchine remote, gli errori di trasmissione, e talvolta comportamenti disonesti, spesso dettati da una tendenza al protagonismo, da parte dei loro autori, dato che ciascun progetto pubblica sulla rete una classifica dei partecipanti più attivi. Per ovviare a tali inconvenienti è necessaria una certa ridondanza, inviare cioè ogni singolo compito di calcolo a due o più macchine remote e paragonare i risultati.
Per utilizzare il parallelismo di Internet occorre anzitutto che il progetto possa stimolare l’interesse dei partecipanti. Se questo riesce si possono ottenere prestazioni elevatissime, paragonabili a quelle dei più grandi calcolatori oggi esistenti, ma la necessità di cooptare migliaia di volontari esclude la possibilità di trattare problemi di interesse industriale o militare, ovvero che abbiano carattere di urgenza, come per esempio le previsioni del tempo. Questa limitazione può essere superata se un’azienda o un centro di ricerche utilizza con le stesse modalità i periodi di inattività dei calcolatori a disposizione dei propri dipendenti. I primi tentativi in questo senso risalgono all’inizio degli anni Ottanta (Xerox PARC, 1982). Si tratta di risorse non indifferenti, dato che gli attuali PC sono molto potenti e vengono normalmente usati solamente poche ore al giorno.
Negli ultimi anni del Novecento è emersa, all’interno di grandi laboratori di ricerca – come Argonne presso la University of Chicago o il CERN di Ginevra – la necessità di protocolli standard per la messa in comune di risorse di calcolo presenti in rete. A differenza di progetti come il GIMPS, in cui un gruppo di utenti di Internet mette risorse di calcolo a disposizione di un singolo progetto centralizzato, questo nuovo progetto – detto Grid (cioè, griglia) –, mira a un uso decentrato in cui ogni utente può utilizzare le risorse disponibili per l’esecuzione di calcoli che superano le capacità della sua stazione di lavoro. Nel campo della fisica delle particelle elementari si stanno mettendo a punto sistemi Grid per l’analisi delle imponenti masse di dati sperimentali che verranno prodotti dall’anello di collisione LHC (Large hadron collider) del CERN. In Italia il progetto Grid è curato dall’Istituto Nazionale di Fisica Nucleare (INFN).
Il Grid è stato accolto con grandissimo interesse al di fuori del mondo della ricerca e le nuove tecnologie sviluppate da questo progetto sono state adottate da importanti aziende per l’uso efficace delle loro reti interne. Diverse società offrono commercialmente il software e le conoscenze necessarie alla messa in campo di sistemi Grid.
Un aspetto molto importante dell’architettura di un calcolatore parallelo riguarda il tipo di programmazione cui esso è destinato. Il tipo di programmazione parallela concettualmente più semplice, che è anche quello più diffuso, è detto MIMD (Multiple instruction multiple data): ciascuna unità di calcolo esegue un suo programma, ma può richiedere dati ad altre unità di calcolo e a sua volta trasmettere i dati richiesti da altre unità. Le unità di calcolo comunicano tra loro tramite messaggi che possono rappresentare una richiesta o una trasmissione di dati, oppure contenere informazioni sull’avvenuto completamento di una fase del calcolo. Questo tipo di programmazione è l’unico possibile quando il calcolo può essere diviso in parti da eseguire in parallelo, ma queste sono diverse tra loro per contenuto o per durata. I programmi con scambio di messaggi fanno uso di speciali istruzioni presenti nei principali linguaggi di programmazione e possono essere eseguiti con minimi adattamenti in calcolatori di struttura differente.
La programmazione MIMD è universalmente applicabile, ma soffre di inefficienze quando lo scambio di dati tra le unità di calcolo è molto intenso, creando veri e propri ingorghi di traffico sulle linee di comunicazione: i messaggi inviati da ciascuna unità di calcolo devono attendere la disponibilità delle linee di comunicazione già utilizzate da altre unità. Queste contese per l’uso delle linee di comunicazione creano allora ritardi e inefficienze nell’esecuzione del programma.
Un’alternativa allo scambio di messaggi è offerta dalla programmazione SIMD (Single instruction multiple data), in cui tutti i processori eseguono lo stesso programma di calcolo in modo sincronizzato tra loro, istruzione per istruzione, sia per quanto riguarda i passi del calcolo vero e proprio che per i trasferimenti dati. Questo metodo di programmazione esclude la possibilità di contese per l’uso delle linee di comunicazione e ne permette quindi il pieno utilizzo. Il sincronismo tra i vari processori deve essere previsto a livello hardware, quindi si può parlare di calcolatori paralleli SIMD in alternativa a calcolatori paralleli MIMD.
L’architettura MIMD è la più diffusa perché, anche se non sempre la più efficiente, è di uso universale e può essere realizzata con gli stessi processori utilizzati in comuni PC o stazioni di lavoro. Tutte le macchine cluster e la gran parte dei calcolatori paralleli disponibili sul mercato adottano l’architettura MIMD. L’architettura SIMD viene preferita per macchine che devono raggiungere le massime prestazioni. Nelle prime generazioni di macchine SIMD, le unità di calcolo lavoravano in perfetto sincronismo, una richiesta difficile da soddisfare nel caso di macchine con un grandissimo numero di unità o con i processori molto veloci resi possibili dalle moderne tecnologie. Nelle macchine SIMD più recenti, per esempio APE-Next, si è preferito un meccanismo di sincronizzazione meno stringente, in cui i differenti processori possono procedere a velocità leggermente diverse, ma si risincronizzano al momento della trasmissione di dati. Per le macchine della serie Blue Gene, la IBM ha adottato un sistema di sincronizzazione molto simile, prevedendo la possibilità di uso sia in modalità SIMD che in modalità MIMD.