2016-02-05 1 views
7

J'ai suivi les docs pour la programmation parallèle en julia et pour mon esprit, qui pense comme openMP ou MPI, je trouve le choix de conception assez étrange. J'ai une application où je veux que les données soient réparties entre les processus, et ensuite je veux dire à chaque processus d'appliquer une opération à toutes les données qui lui sont assignées, mais je ne vois pas comment faire cela dans Julia. Voici un exempleProgrammation parallèle en 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 

ainsi le processus 2 vit un réseau aléatoire avec 2 éléments. Je peux appliquer une fonction à ce tableau via

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

mais pourquoi il ne fonctionne pas si j'appliquer une fonction qui devrait changer le vecteur, comme:

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 

Je ne sais pas comment décrivez-le, mais il semble que les travailleurs ne peuvent que rendre de «nouvelles» choses. Je ne vois pas comment je peux envoyer des variables et une fonction à un ouvrier et que la fonction modifie les variables en place. Dans l'exemple ci-dessus, j'aimerais que le tableau vive sur un seul processus et, idéalement, je serais capable de dire à ce processus d'effectuer certaines opérations sur ce tableau. Une fois que toutes les opérations sont terminées, je pourrais alors aller chercher des résultats, etc.

+1

Je ne suis pas dans Julia, mais vous pourriez jeter un coup d'oeil à [ZMQ.jl] (https://github.com/JuliaLang/ZMQ.jl) et distribuer et recevoir du travail à travers zeromq –

Répondre

4

Je pense que vous pouvez cela avec la ACHIVE @spawnat macro:

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 

Mais avec remotecall_fetch, il semble que le tableau retourné est vraiment une copie:

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 

avec: Julia Version 0.4.3

-1

Vous pouvez fi nd Distributed Arrays utile, basé sur la description de votre besoin.

+0

Je pense que DArray n'est pas assez flexible pour mes fins – Lindon