2016-02-05 2 views
7

Я слежу за документами для параллельного программирования в julia, и для моего разума, который мыслит как 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 

0 0 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

Я думаю, что вы можете achive это с макро @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

Смежные вопросы