Supercomputer/Software: differenze tra le versioni

Contenuto cancellato Contenuto aggiunto
Hellisp (discussione | contributi)
Nessun oggetto della modifica
Hellisp (discussione | contributi)
Nessun oggetto della modifica
Riga 1:
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. Il software per il supercalcolo si può dividere in tre macrocategorie.
Per utilizzare i supercomputer i programmi spesso vanno adattati per fruttare al meglio le peculiarità delle macchine. I software per il calcolo distribuito utilizzano API come le MPI o PVM o soluzioni software open source come Beowulf o Openmosix per creare delle specie di supercomputer virtuali utilizzando computer ordinari collegati da reti locali ad alta velocità. Tecnologie come Zeroconf (Bonjour) consentono di realizzare supercomputer virtuali per compiti specifici. Per esempio il software Shake di Apple utilizza la tecnologia ZeroConf per individuare altri computer utilizzate lo stesso software nella rete locale e per suddividere i compiti di calcolo sui vari computer. Quasi tutti i programmi di grafica tridimensionale permettono funzionalità simili. Sebbene nessuna soluzione basata su computer ordinaria sia mai riuscita a diventare il più potente computer del pianeta questa distinzione si sta sempre più assoltigliando e in un prossimo futuro potrebbe scomparire. Attualmente il maggior problema aperto nel settore dei supercomputer è la realizzazione di linguaggi di programmazione semplici in grado di fruttare il parallelismo delle macchine.
 
== Linguaggi di programmazione ==
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'[[Supercomputer/Occam|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 ==
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 ([[Supercomputer/MPI|MPI]], [[Supercomputer/PVM|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 [[Supercomputer/Openmosix|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 ==
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 el 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.