NVIDIA Tesla & Calcolo Parallelo

teamracing_259
Vi segnalo questo articolo interessante:
http://www.hwupgrade.it/articoli/skvideo/1989/nvidia-tesla-t10-gpu-computing-di-seconda-generazione_index.html
sperando di suscitare interesse per un argomento quale il calcolo parallelo http://it.wikipedia.org/wiki/Calcolo_parallelo che mi sta ultimamente interessando.
Sarebbe bello se poteste contribuire fornendo ulteriori elementi per conoscere al meglio questo argomento fornendo magari anche degli esempi della sua applicazione.

Risposte
bryce1
Bene, come da richiesta metto a disposizione un poco del mio lavoro con l'MPI e il calcolo parallelo. Sarebbe meglio dire che ho estratto tutto quello relativo all'MPI e al calcolo parallelo, risparmiandovi il resto che divaga nel calcolo differenziale e nel progetto di tesi vero e proprio.
Il materiale lo trovate qui: http://bryce.netsons.org/mpi/

"teamracing_259", spero che questo ti chiarisca un poco le idee le idee. Tieni comunque presente che sparso qua e là c'é qualche errore minore rimasto oramai da tempo e mai corretto. Comunque non sono errori sostanziali: il calcolo parallelo con l'MPI funziona egregiamente! In caso di dubbio, comunque, non aspettare a scrivere.

Per tutto quello che posso... resto a disposizione.
Nicola "bryce"

teamracing_259
grazie per vostri "corposi" interventi :wink:
credo che sarebbe interessante vedere qualche parte della tua tesi bryce... :idea:

david_e1
Gia' ne so' qualche cosa di debugging per programmi paralleli avendo realizzato, con un mio compagno, una libreria (molto accademica ovviamente) per la risoluzione di problemi ellittici in parallelo con SEM-NI... :-D

Comunque ha pienamente ragione bryce sulla pianificazione di programmi veramente paralleli: e' necessario uno sforzo decisamente maggiore in fase di progettazione in modo da evitare problemi.

Aggiungo, poi, che esistono anche delle vie piu' semplici per scrivere codici paralleli: ad esempio il compilatore dell'Intel e' in grado di parallelizzare automaticamente il codice, comunque si tratta sempre di parallelizzazione su macchine multi-core e a livello di istruzioni elementari, ben altra cosa che scrivere un codice in grado di sfruttare cluster di calcolo molto estesi ed eterogenei, facendo una parallelizzazione molto piu' radicale, anche a livello di algoritmi...

bryce1
Ahia, qui mi sento colto sul fatto. Purtroppo (o per fortuna) al tempo della laurea in ingegneria ho fatto una tesi relativa proprio al calcolo parallelo toccandolo con mano e lavorandoci sopra. Detto questo mi sento moralmente in dovere di farvelo sapere e di rendermi dispobile a tutte le domande che abbiate.

Confermo tutto quello che dice "David_e" circa l'MPI: è un bellissimo stumento software per testare e "giocare" con il calcolo parallelo. Ricordo comunque che certe cose si possono sperimentare con il Java, ma con il C++ e l'MPI si va a livelli veri di calcolo parallelo scalabile a più processori. Proprio bello.
Le tematiche principali del parallelismo sono sostanzialmente:
1) la differenza fra programmazione seriale (standard) e parallela
2) tipi di parallelismo realizzabili (SIMD, MISD, MIMD)
3) il sistema di comunicazione fra processi (passaggio dati 1 a 1, broadcast, etc...)
4) la gestione della memoria (condivisa o distribuita)
5) le *sorprese* legate ai processi paralleli che si intoppano (deadlock) e il relativo debugging (critico)... da cui si impara a programmare senza MAI sbagliare
6) la bellezza di veder in azione il tracciamento grafico del frattale di Mandelbrot fatto da un computer parallelo: un'esperienza unica!

Vorrei che non sottovalutaste il punto 5, cioé quello relativo al debugging di errori. Una cosa che è importante sapere (e terribilmente vera) è questa:
a) quando si programma in modo seriale (programmazione normale) si ha un solo programma con un solo flusso di dati e l'errore si può trovare senza troppi problemi;
b) quando si programma in PARALLELO si hanno più programmi che si scambiano dati e se uno di questi si ferma... si ferma tutto! Adesso tocca a voi scoprire quale dei vostri processi è andato in crisi... e perché. Buon debugging!

Ok, forse vi ho disilluso, ma a buon ragione. Non voglio che pensiate che il calcolo parallelo sia una passeggiata. Bisogna stare attenti ad un certo numero di cose quali:
1) pensare BENE a cosa si vuole e a come scriverlo nel programma: tutto deve essere pianificato fin nei dettagli e già dall'inizio
2) studiare esattamente i vari protocolli di passaggio dati fra un processo e l'altro (se uno invia dati... ce ne deve essere un'altro pronto a riceverli)
3) controllare di nuovo il programma scritto ed essere convinti che sia giusto e senza errori
4) eseguire il programma in parallelo... sperando in nessuna sorpresa.

In fin dei conti è una bella esperienza che merita e che, se ben programmata, porterà a dei risultati. Se vi piace... avventurativici volentieri ma siete avvisati dei potenziali pericoli lungo il vostro cammino. Il premio... alla fine c'é e ripaga 1000 volte gli sforzi fatti.

Se avete interesse proverò a mettere a disposizione la mia tesi di laurea che contiene qualche capitolo interessante per capire (ed affezionarsi) al calcolo parallelo nei dettagli. Fatemelo sapere magari.

Un saluto,
Nicola "Bryce"

david_e1
Sull'uso di GPU per il calcolo parallelo non sono molto informato: ho letto solo qualche articolo sparso...

Sulla programmazione parallela qualche cosa di più ho provato anche a sperimentare... io principalmente distinguerei (facendo un quadro un po' semplicistico) due tipi di programmazione parallela:

- Basata sui Thread: macchina SMP, il sistema operativo gestisce i vari thread mentre la coerenza fra i dati è garantita da una serie di controlli sugli accessi in lettura/scrittura dei dati nelle varie strutture dati.
- Basata su MPI: macchine a memoria non condivisa, è necessario specificare manualmente quando e come i dati vengono trasmessi da quale a quale macchina etc.... particolarmente usato per il calcolo su macchine massivamente parallele o cluster tipo Beowulf. Questo tipo di tecnologia è impiegata nel calcolo ad altissime prestazioni a scopo scientifico e ha il vantaggio di non richiedere l'uso di sistemi operativi speciali, ma di solito si usa Linux (che è il sistema operativo in assoluto più performante per questo tipo di lavori e infatti primeggia nella classifica dei top 500).

Credo che MPI sia molto relegata ad un uso specialistico, mentre la multi-thread è molto più utilizzata nella realizzazione di programmi "normali": dai server come Apache ai videogiochi. Ho programmato molto poco coi thread, ma in compenso ho programmato abbastanza usando MPI-2: usando MPI è molto facile realizzare programmi adatti a essere eseguiti in parallelo su più computer, mentre con i thread se si vuole andare su più macchine la faccenda diventa più complicata.

Ecco alcuni esempi per iniziare con MPI:

http://people.scs.fsu.edu/~burkardt/cpp ... i/mpi.html

bastano minime conoscenze di C++... per quanto riguarda la realizzazione di un cluster poi è molto semplice usando, ad esempio, mpich2 che è l'implementazione di MPI-2 dei laboratori Argonne (quelli del Blue-Gene per intenderci...) e ssh2...

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.