2016-02-05 48 views
7

我一直在關注茱莉亞和我的思想中的並行編程文檔,這個文檔和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 

我不太知道如何描述它,但似乎工人只能回報「新」事物。我沒有看到如何將一些變量和函數發送給工作人員,並讓函數修改了變量。在上面的例子中,我希望數組存在於一個進程中,理想情況下,我可以告訴該進程在該數組上執行一些操作。之後所有的操作都完成了,然後我可以取結果等

+1

我不是朱莉婭,但你可以看看[ZMQ.jl](https://github.com/JuliaLang/ZMQ.jl),並通過zeromq分發和接收工作 –

回答

4

我認爲你可以與宏@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

-1

你可以科幻nd Distributed Arrays有用,基於你的需要的描述。

+0

我認爲DArray不是足夠靈活用於我的目的 – Lindon