我想弄清楚如何使用Julia进行并行计算。文档看起来很棒,即使像我这样从未使用过Parallel Computing的人(并且不了解文档背后的大部分概念;)。)。
提到:我正在使用Ubuntu在PC上工作。它有一个4核处理器。
要运行我在下面描述的代码,我将julia终端称为:
$ julia -p 4
我正在关注文档here。我在this section
中描述的示例中遇到了一些问题我正在尝试运行以下代码:
@everywhere advection_shared_chunk!(q, u) = advection_chunk!(q, u, myrange(q)..., 1:size(q,3)-1)
function advection_shared!(q, u)
@sync begin
for p in procs(q)
@async remotecall_wait(advection_shared_chunk!, p, q, u)
end
end
q
end
q = SharedArray(Float64, (500,500,500))
u = SharedArray(Float64, (500,500,500))
#Run once to JIT-compile
advection_shared!(q,u)
但我面临以下错误:
ERROR: MethodError: `remotecall_wait` has no method matching remotecall_wait(::Function, ::Int64, ::SharedArray{Float64,3}, ::SharedArray{Float64,3})
Closest candidates are:
remotecall_wait(::LocalProcess, ::Any, ::Any...)
remotecall_wait(::Base.Worker, ::Any, ::Any...)
remotecall_wait(::Integer, ::Any, ::Any...)
in anonymous at task.jl:447
...and 3 other exceptions.
in sync_end at ./task.jl:413
[inlined code] from task.jl:422
in advection_shared! at none:2
我在这里做错了什么?据我所知,我只是复制文档中的例子......或者不是吗?
感谢您的帮助,
谢谢@Daniel Arndt,你找到了诀窍!我正在查看文档:{{3}}我认为应该是与Julia 0.4.x相关的文档(迄今为止最新的稳定版本),但它似乎与Julia 0.5.x相关(所有版本中的最新版本)。
我做了你建议的更改(更改了顺序并添加了缺少的功能),一切都像魅力一样。我将在这里留下更新的代码
# Here's the kernel
@everywhere function advection_chunk!(q, u, irange, jrange, trange)
@show (irange, jrange, trange) # display so we can see what's happening
for t in trange, j in jrange, i in irange
q[i,j,t+1] = q[i,j,t] + u[i,j,t]
end
q
end
# This function retuns the (irange,jrange) indexes assigned to this worker
@everywhere function myrange(q::SharedArray)
idx = indexpids(q)
if idx == 0
# This worker is not assigned a piece
return 1:0, 1:0
end
nchunks = length(procs(q))
splits = [round(Int, s) for s in linspace(0,size(q,2),nchunks+1)]
1:size(q,1), splits[idx]+1:splits[idx+1]
end
@everywhere advection_shared_chunk!(q, u) = advection_chunk!(q, u, myrange(q)..., 1:size(q,3)-1)
function advection_shared!(q, u)
@sync begin
for p in procs(q)
@async remotecall_wait(p, advection_shared_chunk!, q, u)
end
end
q
end
q = SharedArray(Float64, (500,500,500))
u = SharedArray(Float64, (500,500,500))
#Run once to JIT-compile
advection_shared!(q,u)
完成!
答案 0 :(得分:2)
我不相信你做错了什么,除了你可能使用更新版本的文档(或者我们看到不同的东西!)。
让我们确保您使用Julia 0.4.x和这些文档:http://docs.julialang.org/en/release-0.4/manual/parallel-computing/
在Julia v0.5.0中,remotecall_wait
的前两个参数的顺序已更改。将订单切换为remotecall_wait(p, advection_shared_chunk!, q, u)
,您应该继续执行下一个错误(myrange
未定义,可以在文档的前面找到)