Ok, la teoria del calcolo parallelo non é un argomento cosi' semplice, anzi ci sono dei signori corsi universitari che la riguardano.
Io non sono un esperto dell'argomento, ma in genere l'esempio base è questo: considera un programma del genere
for i=1 to n
do
a[i] = b[i] + c[i]
od
con a,b,c tre array di n elementi (con n molto grande).
Poichè ogni elemento dell'array a viene calcolato in modo indipendente dagli altri, questo codice rappresenta un caso massimamente parallelizzabile. In teoria se tu avessi n unità di calcolo, tempi di comunicazione tra le unità a parte, potresti risolvere il problema nel tempo che occorre per eseguire una sola volta la somma a[i] = b[i]+c[i], mentre con una sola unità di calcolo ti occorre un tempo n volte maggiore ( e se n é grande la differenza diventa enorme).
Ovviamente nessun programma é cosi' semplice, ma l'idea sarebbe quella di raggruppare la maggior parte del codice all'interno di un ciclo do e organizzare le strutture dati trattate dal programma in unità indipendenti tra loro. Il problema non si risolve in 2 secondi e dipende molto dal caso che vai ad affrontare.
Sui metodi di implementazione pratica c'e' molta libertà : puoi pensare a una sorgente per i dati condivisa da tutte le unità di calcolo, oppure i dati possono essere divisi su ogni nodo del cluster. Può esserci un nodo centrale che distribuisce il carico, oppure ogni nodo può smistare parte del lavoro sui suoi vicini (cosa succede infatti se il nodo centrale crasha?).
La diverse configurazioni possibili per le unità di calcolo dipendono anche del tipo di servizio che si vuole offrire: vuoi la potenza bruta o vuoi un sistema parallelo che continui a lavorare se uno dei nodi va in crash?
Tanto per complicare la cosa, le prestazioni del sistema parallelo vengono a dipendere, oltre che dalla potenza dei singoli processori e dalla performance delle connessioni di rete tra le unità di calcolo, anche dalla topologia della rete...
Per quanto riguarda java, RMI fornisce una buona comodita' poiche' si occupa in modo automatico di passare tra i nodi i dati che servono (in sostanza su un pc chiami dei metodi che risiedono su altri pc e gli argomenti di questi metodi vengono automaticamente serializzati e trasmessi via rete). Tuttavia questo processo automatico può non essere il massimo dell'ottimizzazione, e quindi nulla vieta di usare diversi protocolli per la trasmissione dei dati.
Testi precisi sul calcolo parallelo non te ne so suggerire, dovresti chiedere a qualcuno che l'abbia studiato a fondo e non come me che ho solo un'infarinatura superficiale, pero' ti posso suggerire 2 link :
OpenMosix, un software di calcolo parallelo disponibile per Linux. Tra la documentazione dovrestri trovare un buon punto di partenza
http://www.openmosix.org
Il Cineca, il centro di calcolo interuniversitario di Bologna che organizza scuole estive e corsi sul calcolo parallelo. Se mandi loro una mail di sicuro ti sanno dire da dove cominciare a cercare.
http://www.cineca.it
Non pensare comunque che il calcolo parallelo sia la panacea di tutti i mali. La percentuale di codice parallelizzabile di un algoritmo tende a diventare molto bassa all'aumentare della complessità e i problemi di comunicazione tra le unità di calcolo diventano rilevanti : si arriva a casi in cui raddoppiare il numero di unita' di calcolo aumenta di pochi punti percentuali le prestazioni globali. Ed é successo piu' volte che siano stati progettati processori e cluster per lo studio di un solo specifico problema...


Rispondi quotando