Domanda

Sto sviluppando un'applicazione scientifica utilizzata per eseguire simulazioni fisiche. Gli algoritmi utilizzati sono O (n3), quindi per un ampio set di dati ci vuole molto tempo per l'elaborazione. L'applicazione esegue una simulazione in circa 17 minuti e devo eseguire circa 25.000 simulazioni. Questo è circa un anno di tempo di elaborazione.

La buona notizia è che le simulazioni sono completamente indipendenti l'una dall'altra, quindi posso facilmente cambiare il programma per distribuire il lavoro su più computer.

Ci sono diverse soluzioni che posso vedere per implementare questo:

  • Ottieni un computer multi-core e distribuisci il lavoro tra tutti i core. Non abbastanza per quello che devo fare.
  • Scrivi un'applicazione che si connette a più "elaborazione" server e distribuire il carico tra loro.
  • Ottieni un cluster di computer Linux a basso costo e fai in modo che il programma tratti tutto come un'unica entità.

L'opzione numero 2 è relativamente facile da implementare, quindi non cerco così tanto suggerimenti su come implementarlo (può essere fatto semplicemente scrivendo un programma che attende su una determinata porta i parametri, elabora i valori e restituisce il risultato come file serializzato). Sarebbe un buon esempio di Grid Computing .

Tuttavia, mi chiedo le possibilità dell'ultima opzione, un cluster tradizionale. Quanto è difficile eseguire un programma Java in una griglia Linux? Tutti i computer separati saranno trattati come un singolo computer con più core, facilitando così l'adattamento del programma? Esistono buoni suggerimenti per le risorse che mi consentirebbero di iniziare? O lo sto rendendo troppo complicato e sto meglio con l'opzione numero 2?

EDIT: come ulteriori informazioni, sono interessato a come implementare qualcosa come descritto in questo articolo di Wired Magazine: Scientific ha sostituito un supercomputer con un cluster linux di Playstation 3 . Sicuramente il numero due sembra la strada da percorrere ... ma il fattore di freschezza.

EDIT 2: il calcolo è molto legato alla CPU. Fondamentalmente ci sono molte operazioni su matrici di grandi dimensioni, come inversa e moltiplicazione. Ho provato a cercare algoritmi migliori per queste operazioni ma finora ho scoperto che le operazioni di cui ho bisogno sono 0 (n3) (nelle librerie normalmente disponibili). Il set di dati è di grandi dimensioni (per tali operazioni), ma viene creato sul client in base ai parametri di input.


Ora vedo che ho avuto un malinteso su come funzionava un cluster di computer sotto Linux. Supponevo che avrebbe funzionato in modo tale da sembrare che avessi tutti i processori in tutti i computer disponibili, proprio come se avessi un computer con più core, ma non sembra che sia così. Sembra che tutti questi supercomputer funzionino avendo nodi che eseguono attività distribuite da qualche entità centrale e che ci sono diverse librerie e pacchetti software che consentono di eseguire facilmente questa distribuzione.

Quindi la domanda diventa davvero, dato che non esiste il numero 3, in: Qual è il modo migliore per creare un'applicazione java in cluster?

È stato utile?

Soluzione

Consiglio vivamente il Java Parallel Processing Framework soprattutto perché i tuoi calcoli sono già indipendenti. Ho fatto un buon lavoro con questo studente e funziona molto bene. Il lavoro di implementazione è già fatto per te, quindi penso che questo sia un buon modo per raggiungere l'obiettivo in "numero 2."

http://www.jppf.org/

Altri suggerimenti

Il numero 3 non è difficile da fare. Richiede lo sviluppo di due distinte applicazioni, il client e il supervisore. Il client è praticamente quello che hai già, un'applicazione che esegue una simulazione. Tuttavia, deve essere modificato in modo che si connetta al supervisore tramite TCP / IP o qualsiasi altra cosa e richieda una serie di parametri di simulazione. Quindi esegue la simulazione e invia i risultati al supervisore. Il supervisore ascolta le richieste dai client e per ogni richiesta, ottiene una simulazione non allocata da un database e aggiorna il database per indicare che l'elemento è allocato ma non finito. Al termine della simulazione, il supervisore aggiorna il database con il risultato. Se il supervisore memorizza i dati in un database effettivo (MySql, ecc.), È possibile interrogare facilmente il database per lo stato corrente delle simulazioni. Ciò dovrebbe ridursi fino al punto in cui il tempo impiegato per fornire i dati di simulazione a tutti i client è uguale al tempo necessario per eseguire la simulazione.

Il modo più semplice per distribuire il calcolo su un cluster Linux è usare MPI. Ti suggerirei di scaricare e guardare MPICH2. È gratis. la loro home page è qui

Se le tue simulazioni sono completamente indipendenti, non hai bisogno della maggior parte delle funzionalità di MPI. Potrebbe essere necessario scrivere alcune righe di C per interfacciarsi con MPI e dare il via all'esecuzione dello script o del programma Java.

Dovresti dare un'occhiata alla Hazelcast , la soluzione di clustering peer2peer (nessun server centralizzato) più semplice per Java. Prova Hazelcast Distributed ExecutorService per eseguire il tuo codice sul cluster.

Saluti,

-talip

L'hai già suggerito, ma lo ho squalificato: Multi core. Potresti scegliere il multi core, se avessi abbastanza core. Un argomento caldo dell'atm è il calcolo GPGPU. Esp. CUDA di NVIDIA è un approccio molto prioritario se si hanno molti compiti indipendenti che devono fare lo stesso calcolo. Una GTX 280 fornisce 280 core, che possono calcolare fino a 1120 - 15360 thread contemporaneamente. Una coppia potrebbe risolvere il tuo problema. Se è davvero implementabile dipende dal tuo algoritmo (flusso di dati vs. flusso di controllo), perché tutti i processori scalari funzionano in modo SIMD.

Svantaggio: sarebbe C / C ++, non java

Quanto sono ottimizzati i tuoi algoritmi? Stai utilizzando le librerie BLAS native? È possibile ottenere un ordine di aumento delle prestazioni in ordine di grandezza passando da librerie ingenue a librerie ottimizzate. Alcuni, come ATLAS, diffonderanno automaticamente i calcoli su più CPU su un sistema, in modo da coprire automaticamente il punto 1.

I cluster AFAIK di solito non sono trattati come un'unica entità. Di solito sono trattati come nodi separati e programmati con elementi come MPI e SCALAPACK per distribuire gli elementi delle matrici su più nodi. Questo non ti aiuta molto se il tuo set di dati si adatta comunque alla memoria su un nodo.

Hai guardato Terracotta ?

Per la distribuzione del lavoro ti consigliamo di utilizzare il Master / Worker framework .

Dieci anni fa, la società per cui ho lavorato ha esaminato una soluzione di virtualizzazione simile e Sun, Digital e HP l'hanno supportata all'epoca, ma solo con supercomputer all'avanguardia con hotswap hardware e simili. Da allora ho sentito che Linux supporta il tipo di virtualizzazione che stai cercando per la soluzione n. 3, ma non l'ho mai usato da solo.

Primitive e prestazioni Java

Tuttavia, se si eseguono calcoli con matrici, è consigliabile eseguirli nel codice nativo, non in Java (supponendo che si stiano utilizzando le primitive Java). Soprattutto i fallimenti della cache sono molto costosi e l'interlacciamento nelle matrici ucciderà le prestazioni. Pezzi di memoria non interlacciati nelle matrici e nel codice nativo ti permetteranno di raggiungere la maggior parte dello speedup senza hardware aggiuntivo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top