【问题标题】:Parallel programming in JuliaJulia 中的并行编程
【发布时间】:2016-05-16 02:27:32
【问题描述】:

我一直在关注 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

我不知道怎么形容,但工人们似乎只能返回“新”的东西。我看不到如何将一些变量和函数发送给工作人员并让函数修改变量。在上面的示例中,我希望数组存在于单个进程上,理想情况下我能够告诉该进程对该数组执行一些操作。完成所有操作后,我可以获取结果等。

【问题讨论】:

  • 我不喜欢 Julia,但你可以看看 ZMQ.jl 并通过 zeromq 分发和接收工作

标签: parallel-processing mpi julia


【解决方案1】:

我认为您可以使用宏 @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

【讨论】:

    【解决方案2】:

    根据您的需求描述,您可能会发现Distributed Arrays 很有用。

    【讨论】:

    • 我认为 DArray 对于我的目的不够灵活
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-17
    • 2015-09-09
    • 2014-02-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多