JuliaParallel / DistributedArrays.jl

Distributed Arrays in Julia
Other
197 stars 35 forks source link

Transfer of distributed structs when members are accessed #203

Open raminammour opened 5 years ago

raminammour commented 5 years ago

Hello,

Consider the following example:

@everywhere struct SS1
    v::Vector{Float64}
    m::Vector{Float64}
end
dSS=@DArray [SS1(rand(10),i*ones(10)) for i in 1:10]
dSS2=@DArray [SS1(rand(10^6),i*ones(10)) for i in 1:10];

@time dSS[2].m
@time dSS2[2].m;

  0.004819 seconds (81 allocations: 4.094 KiB)
  0.005085 seconds (210 allocations: 7.634 MiB)

As you see, the whole struct gets serialized (7 mb) and then v (small vector) can be accessed. Is there a way to implement this so that dS[2].v is sent without the whole struct.

Put in another way, is there a generic way to have dS[i].m mean something like getm(dS,i) where:

@everywhere function getm(dS,i)
    indi=DistributedArrays.locate(dS,i)
    pidi=procs(dS)[indi...]
    lindi=i-dS.cuts[1][indi...]+1
    @fetchfrom pidi dS[:L][lindi].m
end

Is this possible? Is it a reasonable feature to ask for :)?

Thanks!

jishnub commented 4 years ago

dSS[2].m gets lowered to getproperty(dSS[2], :m), where the first argument is necessarily fetched before evaluation. Perhaps there could be a macro that could evaluate an expression on the host and return the result? Eg. @fetchfromhost dSS[2].m that would wrap the expression in something like getm.