Julia的并行编程

我一直在茱莉亚和我的思想中关注并行编程的文档,这种文档和openMP或MPI一样,我觉得设计选择很奇怪。

我有一个应用程序,我希望数据在进程之间分配,然后我想告诉每个进程应用一些操作给它分配的任何数据,但我在Julia看不到这样做。 这是一个例子

julia> r = remotecall(2, rand, 2)
RemoteRef{Channel{Any}}(2,1,30)

julia> fetch(r)
2-element Array{Float64,1}:
 0.733308
 0.45227 

所以过程2生活在一个有2个元素的随机数组中。 我可以通过一些函数来应用这个数组

julia> remotecall_fetch(2, getindex, r, 1)
0.7333080770447185

但为什么它不起作用,如果我应用一个应该改变向量的函数,如:

julia> remotecall_fetch(2, setindex!, r, 1,1)
ERROR: On worker 2:
MethodError: `setindex!` has no method matching setindex!(::RemoteRef{Channel{Any}}, ::Int64, ::Int64)
 in anonymous at multi.jl:892
 in run_work_thunk at multi.jl:645
 [inlined code] from multi.jl:892
 in anonymous at task.jl:63
 in remotecall_fetch at multi.jl:731
 in remotecall_fetch at multi.jl:734

我不太清楚如何描述它,但似乎工人只能回报“新”事物。 我没有看到如何将一些变量和函数发送给工作人员,并让函数修改了变量。 在上面的例子中,我希望数组存在于一个进程中,理想情况下,我可以告诉该进程在该数组上执行一些操作。 所有的操作完成后,我可以获取结果等。


我认为你可以使用宏@spawnat来实现这@spawnat

julia> addprocs(2)
2-element Array{Int64,1}:
 2
 3

julia> r = remotecall(2, rand, 2)
RemoteRef{Channel{Any}}(2,1,3)

julia> fetch(r)
2-element Array{Float64,1}:
 0.149753
 0.687653

julia> remotecall_fetch(2, getindex, r, 1)
0.14975250913699378

julia> @spawnat 2 setindex!(fetch(r), 320.0, 1)
RemoteRef{Channel{Any}}(2,1,6)

julia> fetch(r)
2-element Array{Float64,1}:
 320.0
   0.687653

julia> @spawnat 2 setindex!(fetch(r), 950.0, 2)
RemoteRef{Channel{Any}}(2,1,8)

julia> fetch(r)
2-element Array{Float64,1}:
 320.0
 950.0

但是对于remotecall_fetch ,看起来返回的数组实际上是一个副本:

julia> remotecall_fetch(2, setindex!, fetch(r), 878.99, 1)
2-element Array{Float64,1}:
 878.99
 950.0

julia> remotecall_fetch(2, setindex!, fetch(r), 232.99, 2)
2-element Array{Float64,1}:
 320.0
 232.99

julia> fetch(r)
2-element Array{Float64,1}:
 320.0
 950.0

与: Julia Version 0.4.3


根据您的需求描述,您可能会发现分布式数组很有用。

链接地址: http://www.djcxy.com/p/31933.html

上一篇: Parallel programming in Julia

下一篇: How to run py.test and linters in `python setup.py test`