2016-03-02 14 views
6

Muszę wykonać paralelne określone zadanie dla wielu pracowników. W tym celu potrzebuję wszystkich pracowników, aby mieli dostęp do macierzy przechowującej dane.Współdzielone użycie macierzy w Julii

Myślałem, że matryca danych może być zaimplementowana jako współdzielona macierz w celu zminimalizowania ruchu danych.

W celu zaczynaj mi ze Wspólną tablic, próbuję następujący bardzo prosty przykład, który daje mi, co ja myślę, nieoczekiwane zachowanie:

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)) 

Ostatnia komenda daje mi następujący błąd:

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 

Myślałem, że wspólna tablica D powinna być widoczna dla wszystkich pracowników? Ja wyraźnie brakuje czegoś podstawowego. Z góry dziękuję.

Odpowiedz

7

Mimo że podstawowe dane są udostępniane wszystkim pracownikom, deklaracja D nie jest. Nadal będzie trzeba przekazać w odniesieniu do D, więc coś

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

powinno działać. Możesz zmienić D na głównym procesie i zobaczyć, że jest on w rzeczywistości przy użyciu tych samych danych:

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

Twoje wyjaśnienie dotyczące dzielenia się _deklaracją_ jest bardzo pomocne. Dzięki. – user1438310