use*_*310 8 arrays parallel-processing 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))
Run Code Online (Sandbox Code Playgroud)
最后一个命令给出了以下错误:
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
Run Code Online (Sandbox Code Playgroud)
我认为共享阵列D应该对所有工作人员都可见?我显然遗漏了一些基本的东西.提前致谢.
虽然基础数据是与所有工人共享的,但声明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
Run Code Online (Sandbox Code Playgroud)