Indice del libro

Essendo i supercomputer dotati di hardware peculiare ed essendo indirizzati verso lo svolgimento di alcune tipologie specifiche di compiti gli usuali programmi per computer non sono adatti per queste macchine. Le particolari soluzioni architetturali sviluppate nei supercomputer per essere fruttate a pieno richiedono l'utilizzo di appositi linguaggi e di opportune primitive software. È da notare che le prestazioni dei programmi eseguiti in parallelo dipendono pesantemente dalla porzione di codice effettivamente parallelizzabile. Una quantità eccessiva di codice non parallelizzabile penalizza pesantemente le prestazioni come dimostra la legge di Amdahl. Il software per il supercalcolo si può dividere in tre macrocategorie.

Linguaggi di programmazione modifica

Tutti i supercomputer moderni sono basati su un parallelismo massivo e quindi i normali linguaggi di programmazione sviluppati per le macchine sequenziali come i comuni personal computer non sono sufficienti. Questi linguaggi a volte sono classici linguaggi di programmazione con in più alcune librerie e alcuni costruttori appositamente sviluppati per il supercalcolo. Per esempio il linguaggio C è disponibile praticamente per ogni supercomputer. A volte i linguaggi sono sviluppati appositamente per i supercomputer, il più famoso di questi linguaggi è l'Occam. Sebbene esistano diversi linguaggi di programmazione paralleli nessuno di questi permette una programmazione rapida e semplice dei supercomputer. Infatti una delle aree di ricerca più attiva del supercalcolo mira a realizzare linguaggi di programmazione semplici da utilizzare ma che siano di utilizzare in maniera nativa il calcolo parallelo.

Primitive di sistema modifica

Essendo tutti i supercomputer moderni basati su macchine massivamente parallele si rende necessario implementare metodi efficienti di comunicazione tra i processi paralleli e procedure in carico di bilanciare il carico tra i vari processori evitando di sovraccaricare alcuni processori lasciando scarichi altri processori. Queste primitive possono essere implementate tramite librerie estere (MPI, PVM), o tramite chiamate innestate nel sistema operativo. Quasi tutti i sistemi Unix commerciali implementano primitive di questo tipo (sebbene alcune implementazioni siano deficitarie). Esistono implementazioni open source come il progetto openMosix che modificano il kernel del sistema operativo Linux per fargli supportare il calcolo parallelo. Anche alcuni sistemi operativi per personal computer come il Mac OS X implementano primitive per il supercalcolo tramite il progetto Xgrid. Il futuro Windows Vista dovrebbe averne un supporto parziale sebbene al momento non è chiaro quanto siano sviluppate e solide le primitive.

Programmi modifica

I programmi per supercomputer vanno appositamente progettati cercando di rendere gli algoritmi di calcolo il più paralleli possibile. La parallelizzabilità di un algoritmo dipende strettamente dal problema trattato. Un problema facilmente parallelizzabile è un problema che può essere scomposto in tanti sottoproblemi più semplici che non siano collegati o che siano collegati in modo lasco. Difatti in un supercomputer uno dei problemi maggiori è fornire una comunicazione efficiente tra le varie unità difatti il tempo di accesso ad un dato che non si trovi nella memoria locale del processore può essere molto elevato e comunque un numero elevato di comunicazioni tra processori può saturare la banda di comunicazione peggiorando drammaticamente le prestazioni. Quindi è imperativo realizzare programmi che siano il più indipendenti possibile. Un esempio classico di problema facilmente parallelizzabile è la realizzazione di animazioni fotorealistiche con il computer. Una volta impostata l'animazione un computer principale trasmette ai nodi di calcolo i fotogrammi da elaborare. Durante l'elaborazione i nodi non devono comunicare tra loro e la comunicazione con il nodo principale si ha solamente durante la fase di caricamente dei dati e di salvataggio dei fotogrammi. Nel campo scientifico i calcoli di fluidodinamica o di previsione del tempo sono ben parallellizzabili. Invece programmi che per esempio richiedo frequenti accessi ad ampie matrici sparse sono difficilmente parallelizzabili dato che ogni nodo cercherà di accedere alla memoria comune con elevata frequenza saturando rapidamente i canali di comunicazione.