Юлия: Доступ к 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()"

Я не уверен, можете ли вы назначить распределенный массив таким способом, возможно, вы захотите создать новый (поштучно); это то, что делается на примере клеточного автомата.

Другие вопросы по тегам