|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: Dec 2000
Messaggi: 501
|
[JAVA] Ottimizzazione del Multithreading
Salve,
ho scritto un software in JAVA che simula un ambiente fisico. Ad ogni step temporale è necessario manipolare un elevato numero di oggetti (decine di migliaia) e quindi ho pensato di utilizzare i thread per cercare di parallelizzare il lavoro, mediante il seguente approccio: Ad ogni step temporale vengono instanziati un numero predeterminato di Thread (ad esempio 4), quindi ogni Thread manipolerà un quarto degli elementi. I Thread vengono avviati simultaneamente e vengono sincronizzati (Thread.join()) per far sì che la simulazione proceda verso le operazioni successive soltanto se tutti i thread hanno completato il loro lavoro. Mi sono reso conto, che con questo approccio i miei due core vengono impegnati circa al 40-50% l'uno (ovviamente l'ideale sarebbe impegnarli al 100%). Come potrei fare per migliorare le prestazioni? E' possibile che il problema dipenda dal fatto che ad ogni step temporale instanzio 4 nuovi Thread? oppure è ininfluente? E' possibile, inoltre, che l'occupazione dei core risulti scarsa perché devono restare in attesa che il thread + lento termini l'elaborazione? (in linea di massima hanno tutti lo stesso numero di elementi da manipolare). Ogni suggerimento è ben accetto! ![]() ![]() |
![]() |
![]() |
![]() |
#2 | |
Member
Iscritto dal: Dec 2007
Messaggi: 284
|
Quote:
|
|
![]() |
![]() |
![]() |
#3 |
Senior Member
Iscritto dal: May 2001
Messaggi: 12840
|
Istanziare nuovi thread comporta un dispendio di tempo, dai un'occhiata a questo:
http://download.oracle.com/javase/tu...ncy/pools.html |
![]() |
![]() |
![]() |
#4 |
Member
Iscritto dal: Aug 2010
Messaggi: 138
|
Sicuro che non dipendi anche dal S.O. ? se è a 32 bit (e quindi per forza la JVM è a 32 bit) più di 1.6-1.8GB di ram totali NON puoi usare (condivisi tra tutti i programmi Java in esecuzione parallela ).
|
![]() |
![]() |
![]() |
#5 | |
Senior Member
Iscritto dal: Dec 2000
Messaggi: 501
|
Si, interagiscono, ma non in quella fase, quindi li posso "elaborare" simultaneamente.
Quote:
Uso prevalentemente S.O. a 64 bit, anche se ho avviato simulazioni anche a 32 bit. La memoria viene consumata in effetti ma non supera, di norma, 500-800 MB, ben al di sotto di 1.6 GB! |
|
![]() |
![]() |
![]() |
#6 |
Bannato
Iscritto dal: Apr 2006
Messaggi: 5857
|
Non sono un esperto di multithreading sotto Java ma visto che parli di migliaia di oggetti e di voler saturare i processori, potrei suggerirti di guardare anche il nuovo modello di Threading presente in Java 7.0.
Sto parlando del Fork-Join che naturalmente scaricando una libreria da Oracle utilizzabile anche sotto Java 6.0 Magari fa al caso tuo. |
![]() |
![]() |
![]() |
#7 | |
Senior Member
Iscritto dal: Oct 2004
Messaggi: 1945
|
Quote:
![]() |
|
![]() |
![]() |
![]() |
#8 | ||
Senior Member
Iscritto dal: Dec 2000
Messaggi: 501
|
Quote:
Quote:
Me le studierò sicuramente! In ogni caso, qualsiasi altro suggerimento è sempre ben accetto! ![]() |
||
![]() |
![]() |
![]() |
#9 |
Senior Member
Iscritto dal: Dec 2000
Messaggi: 501
|
Negli ultimi giorni stavo cercando di implementare anche le librerie OpenMP/JaMP.
Tramite delle direttive inserite nel codice consente di parallelizzare l'elaborazione di alcuni blocchi di codice, senza la necessità di utilizzare in modo esplicito i Thread (la direttiva è simile a //#omp parallel): Codice:
... //#omp parallel for for (int i=0;i<100000000;i++){...} ... Riesco a tenere impegnati tutti i core al 100%, ma l'elaborazione risulta molto più lenta della versione senza OpenMp... C'è qualcuno che ha già utilizzato con successo questa tecnica? |
![]() |
![]() |
![]() |
#10 |
Senior Member
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
|
Usa un profiler - nel jdk c'è jvisualvm - sul programma originale e vedi se e dove si verifica un problema.
Dalla descrizione del programma, il comportamento ottimale sarebbe rappresentato da N user thread "verdi" e uno user thread "giallo" (quello che attende che gli altri abbiano terminato il proprio compito). Il fatto che i core non siano impegnati al 100% dovrebbe invece essere testimoniato da almeno tre user-thread in attesa che uno termini. Esiste anche la possibilità che l'occupazione parziale delle cpu sia semplicemente dovuto ad una scarsità di istruzioni da eseguire: se il core è multithread potrebbe esserci uno slot libero, se non lo è potrebbero esserci delle pipeline non occupate. Oppure potrebbero esserci una valanga di cache-miss dovute ad un problema di località dei dati: non ne sono certissimo ma credo che anche questo porterebbe ad un disimpegno dei core in attesa che il bus trasferisca i dati dalla memoria periferica a quella locale.
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me! |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 10:22.