2016-03-02 16 views
6

Tôi cần phải song song một tác vụ nhất định đối với một số công nhân. Với mục đích đó, tôi cần tất cả các công nhân để có quyền truy cập vào một ma trận lưu trữ dữ liệu.Sử dụng mảng được chia sẻ trong Julia

Tôi nghĩ rằng ma trận dữ liệu có thể được triển khai như một mảng được chia sẻ để giảm thiểu chuyển động dữ liệu.

Để cho tôi bắt đầu với Shared Mảng, tôi đang cố gắng như sau ví dụ rất đơn giản mà mang lại cho tôi, những gì tôi nghĩ là, hành vi bất ngờ:

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ệnh cuối cùng mang lại cho tôi những lỗi sau:

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 

Tôi nghĩ rằng mảng chung D sẽ hiển thị cho tất cả công nhân? Tôi rõ ràng thiếu một cái gì đó cơ bản. Cảm ơn trước.

Trả lời

7

Mặc dù dữ liệu cơ bản được chia sẻ cho tất cả công nhân, việc khai báo D thì không. Bạn vẫn sẽ cần phải vượt qua trong các tài liệu tham khảo để D, vì vậy cái gì đó như

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

nên làm việc. Bạn có thể thay đổi D trên quy trình chính và thấy rằng nó không hoạt động bằng cùng một dữ liệu:

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

Giải thích của bạn về việc chia sẻ _declaration_ rất hữu ích. Cảm ơn. – user1438310

Các vấn đề liên quan