2016-03-02 7 views
6

Ho bisogno di parallelizzare un determinato compito su un numero di lavoratori. A tale scopo ho bisogno che tutti i lavoratori abbiano accesso a una matrice che memorizza i dati.Utilizzo dell'array condiviso in Julia

Ho pensato che la matrice di dati potesse essere implementata come una matrice condivisa al fine di ridurre al minimo lo spostamento dei dati.

Per farmi iniziare con le matrici condivise, sto cercando il seguente esempio molto semplice che mi dà, quello che penso è, un comportamento imprevisto:

julia -p 2 

# the data matrix 
D = SharedArray(Float64, 2, 3) 

# initialise the data matrix with dummy values 
for ii=1:length(D) 
    D[ii] = rand() 
end 

# Define some kind of dummy computation involving the shared array 
f = x -> x + sum(D) 

# call function on worker 
@time fetch(@spawnat 2 f(1.0)) 

L'ultimo comando mi dà il seguente errore:

ERROR: On worker 2: 
UndefVarError: D not defined 
in anonymous at none:1 
in anonymous at multi.jl:1358 
in anonymous at multi.jl:904 
in run_work_thunk at multi.jl:645 
in run_work_thunk at multi.jl:654 
in anonymous at task.jl:58 
in remotecall_fetch at multi.jl:731 
in call_on_owner at multi.jl:777 
in fetch at multi.jl:795 

Ho pensato che l'array D condiviso dovrebbe essere visibile a tutti i lavoratori? Mi manca chiaramente qualcosa di base. Grazie in anticipo.

risposta

7

Sebbene i dati sottostanti siano condivisi con tutti i lavoratori, la dichiarazione di D non lo è. Sarà ancora bisogno di passare nel riferimento a D, in modo da qualcosa come

f = (x,SA) -> x + sum(SA) @time fetch(@spawnat 2 f(1.0,D))

dovrebbe lavorare. È possibile modificare D sul processo principale e vedere che è infatti utilizzando gli stessi dati:

julia> # call function on worker 
     @time fetch(@spawnat 2 f(1.0,D)) 
    0.325254 seconds (225.62 k allocations: 9.701 MB, 5.88% gc time) 
4.405613684678047 

julia> D[1] += 1 
1.2005544517241717 

julia> # call function on worker 
     @time fetch(@spawnat 2 f(1.0,D)) 
    0.004548 seconds (637 allocations: 45.490 KB) 
5.405613684678047 
+0

tua spiegazione di condividere la _declaration_ è molto utile. Grazie. – user1438310