2016-02-05 33 views
7

Śledziłem dokumenty do programowania równoległego w julia i dla mojego umysłu, który myśli jak openMP lub MPI, uważam, że wybór projektu jest dość dziwny.Programowanie równoległe w Julii

Mam aplikację, w której chcę, aby dane zostały rozproszone między procesami, a następnie chcę powiedzieć każdemu procesowi, aby zastosować jakąś operację do jakichkolwiek danych, które są przypisane, ale nie widzę sposobu, aby to zrobić w Julia. Oto przykład:

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

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

, więc w procesie 2 żyje losowa tablica z 2 elementami. Mogę zastosować jakąś funkcję do tej tablicy poprzez

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

ale dlaczego to nie działa, jeśli mogę ubiegać funkcję, która powinna zmienić wektor, jak:

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 

Nie bardzo wiem jak opisz to, ale wygląda na to, że pracownicy mogą tylko zwrócić "nowe" rzeczy. Nie widzę sposobu, w jaki mogę przesłać niektóre zmienne i funkcję do elementu roboczego oraz zmodyfikować zmienne w miejscu. W powyższym przykładzie chciałbym, aby tablica działała w jednym procesie i najlepiej byłoby móc powiedzieć temu procesowi, aby wykonać pewne operacje na tej macierzy. Po wykonaniu wszystkich czynności zakończeniu mogłem następnie pobrać wyniki itp

+1

Nie jestem w Julii, ale możesz rzucić okiem na [ZMQ.jl] (https://github.com/JuliaLang/ZMQ.jl) i rozpowszechniać i odbierać pracę za pośrednictwem zeromq –

Odpowiedz

4

myślę, że można achive to z makro @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 

Ale z remotecall_fetch, wygląda zwróconej tablicy jest naprawdę kopia:

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 

z: Julia Version 0.4.3

-1

Możesz fi nd Distributed Arrays przydatne, w oparciu o opis potrzeb.

+0

Myślę, że DArray nie jest wystarczająco elastyczny dla moich celów – Lindon