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.
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 –