2015-03-06 13 views
5

Sto provando a fare delle analisi statistiche usando Julia. Il codice è costituito dai file script.jl (ad esempio l'inizializzazione dei dati) e algorithm.jl.Gestione dei dati in loop parallelo in Julia

Il numero di simulazioni è ampio (almeno 100.000), quindi ha senso utilizzare l'elaborazione parallela.

Il codice sotto è solo alcuni pseudocodice per illustrare la mia domanda -

function script(simulations::Int64) 

# initialise input data 
... 

# initialise other variables for statistical analysis using zeros() 
... 

require("algorithm.jl") 

@parallel for z = 1:simulations 
    while true 

    choices = algorithm(data);  

    if length(choices) == 0 
     break 
    else 
     # process choices and pick one (which alters the data) 
     ... 
    end 

    end 
end 

# display results of statistical analysis 
... 

end 

e

function algorithm(data) 

# actual algorithm 
... 

return choices; 

end 

Come esempio, vorrei sapere quanti scelte ci sono in media, qual è il scelta più comune, e così via. A tal fine ho bisogno di salvare alcuni dati da choices (nel la for-loop) alle variabili di analisi statistica (inizializzati prima il ciclo for) e visualizzare i risultati (dopo il per-loop).

Ho letto di utilizzare @spawn e fetch() e funzioni come pmap() ma non sono sicuro di come procedere. L'uso delle variabili all'interno del ciclo for non funziona in quanto ogni proc ottiene la propria copia, quindi i valori delle variabili di analisi statistica dopo il ciclo for saranno solo zero.

[Edit] In Julia io uso include("script.jl") e script(100000) per eseguire le simulazioni, non ci sono problemi quando si utilizza un singolo proc. Tuttavia, quando si utilizzano più proc (ad esempio usando addprocs(3)) tutte le variabili statistiche sono zeri dopo il ciclo for - che è prevedibile.

+0

La funzione 'algoritmo' restituisce sempre identiche' scelte' per l'input 'dati' identico? – rickhg12hs

+0

@ rickhg12hs Sì, lo fa. – Ailurus

+1

Quindi, dato il tuo pseudo-codice, non solo il primo ciclo ('z = 1') processerebbe' scelte'? – rickhg12hs

risposta

1

Sembra che si desideri parallelizzare un'operazione inerentemente seriale, poiché ogni operazione è correlata al risultato di un'altra (in questo caso data). Penso che se si potrebbe implementare il codice di cui sopra, come:

@parallel (dosumethingwithdata) for z = 1:simulations 
    while true 

    choices = algorithm(data,z);  

    if length(choices) == 0 
     break 
    else 
     # process choices and pick one (which alters the data) 
     ... 
    end 

    data 

    end 
end 

allora si può trovare una soluzione parallela per il problema.