Visualizzazione dei risultati da 1 a 6 su 6
  1. #1
    Utente di HTML.it L'avatar di kuarl
    Registrato dal
    Oct 2001
    Messaggi
    1,093

    [java] calcolo distribuito in LAN

    vorrei fare un piccolo applicativo, un daemon ke lanciato su un computer prenda un thread molto dispendioso e lo esegue su tutti i computer connessi alla LAN, per esempio lavorare con i file video richiede un'elevata potenza di calcolo, mettiamo che il thread attivo ke voglio dividere sia premier ke sta facendo il rendering di un mio filmato, come faccio??

    datemi degli indizi

    byez

  2. #2
    Personalmente non so se la JVM ti lascia prendere un thread esterno del sistema operativo per usarlo come meglio credi. Se si tratta di un thread java invece puoi lavorarci sopra e spezzettarlo come vuoi.

    Io pensavo di riscrivere in forma distribuita il software di analisi dati che ho fatto per la tesi e userei RMI per trasferire il calcolo su diversi nodi, con un nodo centrale che tira le fila di tutto.

    Tieni però conto che un problema molto grande in tutti gli algoritmi distribuiti è la parallelizzazione dei dati : non tutte le strutture dati possono essere spezzettate ed elaborate separatamente da ogni unità di calcolo. Per un filmato video non ti so dire, per situazioni matematiche abbastanza spesso i dati che si analizzano sono cosi' interconnessi che una unita' di lavoro non puo' lavorare separatamente dalle altre (a meno di non perdere un bel po' di tempo a lavorare su come i dati sono organizzati) e il miglioramento in termini di prestazioni nell'usare piu' calcolatori diventa trascurabile.

  3. #3
    Utente di HTML.it L'avatar di kuarl
    Registrato dal
    Oct 2001
    Messaggi
    1,093
    capisco, quindi era effettivamente una megalomania quella ke mi ero prefisso di fare

    Ritornando al calcolo distribuito però la cosa mi interessa, dimmi dove posso trovare informazioni per farlo
    Poi, hai detto ke bisogna gestire il parallelismo giusto?? basterebbe dividere il lavoro in "pakketti" e inviarli ai nodi periferici, poi il nodo centrale bisognerebbe fornirlo di una specie di listener ke ogni qualvolta qualcuno elabora un pakketto ne riceva i risultati, prepari e mandi un secondo pakketto. Si potrebbe fare no?

    praticamente come si fa?? mettiamo ad esempio di voler ordinare un array di 1000000 elementi, dividiamo l'array in pezzi di 4 elementi, ogni nuovo array diventa per noi il nostro "pakketto", lo inviamo su un nodo periferico ke lo elabora e poi appena ha finito ritorna l'array ordinato al nodo principale ke alla fine ricomporrà l'intero array ordinato.

    Come si fa?? degli esempi please

    PS un grazie anticipato a ki mi risponde

  4. #4
    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...

  5. #5
    ehm, ho scritto un mezzo poema . Scusate...

  6. #6
    Per info su Rmi qua trovi praticamente tutto.

    http://developer.java.sun.com/develo...g/rmi/RMI.html

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.