PDA

View Full Version : [Java] condizione di uscita da un programma


sissipula
13-06-2009, 12:16
Per migliorare le prestazioni di una libreria java mono-thread per il cal-
colo numerico si e deciso di migrare ad una piattaforma multiprocesso-
re dotata di N CPU e di riscrivere in versione multi-thread un metodo
BinaryTreeSum.computeSum(Node root) molto oneroso. Tale metodo permet-
te di calcolare la somma dei valori contenuti nei nodi di un albero binario
di enormi dimensioni.
Per fare ciò ho creato un numero di thread visitatori dell'ordine del numero delle CPU disponibili e lascio insistere i singoli thread su un buff er di dimensione illimitata condiviso inizialmente contenente il solo nodo radice. I visitatori estraggono ripetutamente e concorrentemente un nodo dalla testa del bu ffer ed inseriscono in coda gli eventuali figli, dopo aver opportunamente considerato nel computo complessivo il valore del nodo fino al verificarsi di una opportuna condizione che però non riesco a trovare potreste darmi un suggerimento?? Quando faccio terminare tutto ciò?? Non posso utilizzare la sola condizione di buffer vuoto!!:mc:

gugoXX
13-06-2009, 14:32
Non ti basta muoverti fino al livello dell'albero tale per cui i figli siano >N, ovvero tale per cui 2^liv > N
e da li' procedere con 2^liv Thread ciascuno dei quali effettua il calcolo sulla suo sottoalbero?
Poi ritorni in seriale e ritiri i risultati dei 2^liv Thread considerando la parte restante dell'albero originale fino alla radice.

PGI-Bis
13-06-2009, 15:19
Se ognuno degli N Thread piglia un nodo e sputa i figli (che terminologia tecnica, eh!? :D) e parti dalla radice di un albero direi che la condizione che termina il computo è "ognuno degli N thread ha di fronte una coda vuota".

Hai ragione da vendere quando dici che non basta che la coda dei nodi da esaminare sia vuota perchè potrebbe esserlo nel momento in cui un Thread abbia prelevato un nodo ma non abbia ancora inserito i figli.

Quando alla struttura di controllo direi che siamo di fronte ad una via di mezzo tra una barriera ed un countdown.

Tieni conto anche della soluzione di gugo perchè se l'operazione compiuta dal singolo Thread è sufficientemente rapida l'incidenza sui tempi di esecuzione della sincronizzazione richiesta per l'accesso alla coda e alla struttura di controllo potrebbe essere sensibile.

Considera inoltre che collegare il numero di Thread al numero di CPU potrebbe non sfruttare pienamente la capacità della piattaforma perchè anche una singola CPU può eseguire istruzioni in parallelo - o almeno questo è quanto mi pare di ricordare dal buon vecchio Patterson-Hennessy.