SharedArrays и перемещение данных между процессами в Julia - PullRequest
0 голосов
/ 13 декабря 2018

Я пытаюсь понять, перемещаются ли данные типа SharedArray по процессам и, следовательно, возникают накладные расходы.

После определения переменных в моем главном модуле (процесс 1) я вызвал pmap для Array ( im1 ) и SharedArray ( im1_shared ) версии моих данных.

pmap(someFunction(im1, im2, x), iterations)
pmap(someFunction(im1_shared, im2_shared, x), iterations) 

То есть im1 , im2 и im1_shared , im2_shared являются разновидностями аргументов по умолчанию, и срезы используютсявзято с помощью итератора x и обработано рабочими.

Используя

@fetchfrom 2 varinfo()

Я получаю:

im1 122.070 MiB 4000 ×4000 Массив {Float64,2}

im2 122.070 МБ 4000 × 4000 Массив {Float64,2}

im1_shared 122.071 МБ 4000 × 4000 SharedArray {Float64,2}

im2_shared122.071 MiB 4000 × 4000 SharedArray {Float64,2}

Поэтому мои мысли и недоразумения по этому поводу:

  1. Во время вызова функции pmap для типов Array, im1 и im2были скопированы все 3 дополнительных работника.В конце концов у меня в памяти есть 4 копии im1 и im2 .
  2. Работники (здесь работник 2) также перечисляют SharedArrays.Поэтому я думаю, что любой из них может быть частично правильным:

    2.1.varinfo() перечисляет все переменные в локальной рабочей области рабочих, но SharedArrays не хранятся в локальной памяти тех.Они просто перечислены, чтобы подразумевать, что работник имеет к ним доступ.

    В этом случае, если SharedArrays хранятся только один раз и все работники имеют к ним доступ, почему эти типы не используются по умолчанию в Julia- чтобы минимизировать накладные расходы в первую очередь?

    2.2 SharedArray также был скопирован для каждого работника, таким образом, 122 МБ для каждого SharedArray.Таким образом, единственным преимуществом SharedArrays перед массивами является доступ для каждого работника.Сохраненные данные должны быть скопированы в любую сторону.

    В этом случае единственный способ избежать накладных расходов - использовать что-то вроде распределенного массива и разрешать работникам работать только с кусками, к которым у них уже есть доступ или которые хранятся в их памяти, верно?

Не могли бы вы помочь мне разобраться в этих двух сценариях (2.1 и 2.2).

ОБНОВЛЕНИЕ 1: Вот рабочий пример:

@everywhere using InteractiveUtils # to call varinfo() on all workers

### FUNCTIONS
@everywhere function foo(x::Array{Float64, 2}, y::Array{Float64, 2}, t::Int64)
    #just take a slice of both arrays at dfined steps and sum the values
    x_slice = x[t:t+5, t:t+5]
    y_slice = y[t:t+5, t:t+5]
    return x_slice + y_slice   
end

@everywhere function fooShared(x::SharedArray{Float64, 2}, y::SharedArray{Float64, 2}, t::Int64)
    #just take a slice of both arrays at dfined steps and sum the values
    x_slice = x[t:t+5, t:t+5]
    y_slice = y[t:t+5, t:t+5]
    return x_slice + y_slice   
end

### DATA
n = 1000
#the two Arrays
im1 = rand(1.0:2.0, n, n)
im2 = copy(im1);

#The two shared arrays
im1_shared = SharedArray(im1)
im2_shared = SharedArray(im2);

@fetchfrom 2 varinfo() # im1_shared and im2_shared are not yet listed, of course not...

pmap(x -> foo(im1, im2, x), [1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
pmap(x -> fooShared(im1_shared, im2_shared, x), [1, 2, 3, 4, 5, 6, 7, 8, 9, 10])

@fetchfrom 2 varinfo() # im1_shared and im2_shared are now listed

1 Ответ

0 голосов
/ 14 декабря 2018

SharedArray распределяется между многими процессами Julia посредством отображения памяти (https://docs.julialang.org/en/v1/stdlib/Mmap/index.html). Данные могут быть инициализированы следующим образом:

using Distributed
Distributed.addprocs(2);
@everywhere using SharedArrays
@everywhere function ff(ss::SharedArray)
   println(myid()," ",localindices(ss))
   for ind in localindices(ss)
       ss[ind] = rand(1.0:2.0)    
   end   
end

А теперь давайте выполним фактическую инициализацию:

julia> s = SharedArray{Float64}((1000,1000),init=ff)
      From worker 2:    2 1:500000
      From worker 3:    3 500001:1000000
1000×1000 SharedArray{Float64,2}:
 2.0  1.0  1.0  1.0  1.0  2.0  …  2.0  1.0  2.0  2.0  1.0
 2.0  2.0  2.0  2.0  2.0  2.0     2.0  1.0  2.0  1.0  2.0
 2.0  1.0  1.0  2.0  1.0  2.0     1.0  1.0  1.0  1.0  2.0
 ⋮                        ⋮    ⋱  ⋮
 1.0  1.0  1.0  1.0  1.0  2.0     2.0  2.0  1.0  1.0  1.0
 1.0  2.0  1.0  2.0  2.0  1.0     2.0  2.0  1.0  1.0  1.0
 2.0  2.0  1.0  2.0  1.0  2.0     2.0  1.0  1.0  2.0  2.0

Вы можете видеть, что каждый рабочий инициализировал отдельную часть массива, с которой он работает.

...