2016-03-02 9 views
6

多くの作業者に対して特定のタスクを並列化する必要があります。 そのためには、すべての作業者がデータを格納する行列にアクセスする必要があります。Juliaでの共有配列の使用

私は、データの移動を最小限に抑えるために、データアレイを共有アレイとして実装できると考えました。

私は共有配列を始めるためには、私は私を与える以下の非常に簡単な例をしようとしています、私が考えることは、予期しない動作である:

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

最後のコマンドは私に次のエラーを与えます:

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 

私は共有配列Dがすべての作業者に見えるはずだと思いましたか? 私は明らかに何か基本的なものを欠いています。前もって感謝します。

答えて

7

基本データはすべてのワーカーに共通ですが、Dという宣言はありません。あなたはまだDへの参照を渡す必要がありますので、

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

ようなものが動作するはずです。メインプロセスのDを変更して、同じデータを使用していることを確認してください。

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

_declaration_の共有に関する説明は非常に役に立ちます。ありがとう。 – user1438310

関連する問題