Юлия: Доступ к DArray в функции на процессоре
Я создаю DArray:
d = dzeros(3)
Теперь я хотел бы запустить функцию параллельно с использованием pmap. Я хотел бы, чтобы эта функция обращалась к любой части d, локальной на текущем процессоре. Что-то вроде
function foo()
global d
a = localpart(d)
a[1] = 1
end
Тем не менее, я получаю
exception on 2: exception on 4: ERROR: d not defined
in mcmc_sub! at /home/benjamin/.julia/v0.3/Mamba/src/model/mcmc.jl:67
in anonymous at multi.jl:847
in run_work_thunk at multi.jl:613
in anonymous at task.jl:847
на каждом процессе.
d должен быть определен на каждом процессоре. Например, такой код работает:
julia> d = dzeros(3)
3-element DArray{Float64,1,Array{Float64,1}}:
0.0
0.0
0.0
julia> @spawnat(2, (a = localpart(d); a[1]=1;))
RemoteRef(2,1,65)
julia> d
3-element DArray{Float64,1,Array{Float64,1}}:
1.0
0.0
0.0
1 ответ
Решение
Я не совсем уверен, что копия не происходит, но я понимаю, что вы можете просто передать d
в качестве параметра (это ссылка на все, передача не будет перемещать данные).
Простой пример:
function foo(d, u)
r, = myindexes(d)
return u * 100000 + sum(d[r])
end
function main()
d = distribute(1:100)
show(pmap(x-> foo(d, x), 1:10))
end
# julia -p 2 -L test.jl -e "main()"
Я не уверен, можете ли вы назначить распределенный массив таким способом, возможно, вы захотите создать новый (поштучно); это то, что делается на примере клеточного автомата.