2016-02-05 19 views
7

Julia'da paralel programlama için dokümanlar takip ediyorum ve openMP veya MPI gibi düşünen aklım için tasarım seçimini oldukça garip buluyorum.Julia'da Paralel programlama

Verilerin işlemlerin arasında dağıtılmasını istediğim bir uygulamam var, ve sonra her işlemin kendisine atanmış olan verilere bazı işlemleri uygulamalarını söylemek istiyorum, ancak bunu Julia'da yapmanın bir yolunu görmüyorum. Aşağıda, işlem 2'de 2 elemanlı rastgele bir dizi yer alan bir örnek

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

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

örneğidir. Ben

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

yoluyla bu diziye bazı fonksiyon uygulayabilirsiniz ama gibi vektör değiştirmelisiniz bir işlev uygularsanız neden çalışmıyor: Oldukça nasıl bilmiyorum

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 

Bunu açıklayın, ama işçiler sadece "yeni" şeyleri iade edebiliyor gibi görünüyor. Bazı değişkenleri ve bir işçiye nasıl bir işlev gönderebileceğimi görmüyorum ve fonksiyonun değişkenleri yerinde değiştirmesini sağlıyorum. Yukarıdaki örnekte, dizinin tek bir süreçte yaşamasını isterdim ve ideal olarak bu işlemi bu dizide bazı işlemleri gerçekleştirmek için anlatabilirdim. tüm işlemler Sonra sonuçları vb alamadan bitirdikten sonra

+1

Julia değilim, ama [ZMQ.jl] (https://github.com/JuliaLang/ZMQ.jl) bir göz atın ve zeromq –

cevap

4

Sana makro @spawnat ile bu başarmak düşünüyorum:

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 

Ama remotecall_fetch ile iade dizide benziyor gerçekten bir kopyasıdır:

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 

ile: Julia Version 0.4.3

-1

Sen fi olabilir İhtiyacınızın açıklamasına göre, Distributed Arrays faydalıdır.

+0

aracılığıyla iş dağıtmak ve almak olabilir DArray düşünüyorum amaçlarım için yeterince esnek – Lindon