DistributedArrays.jl icon indicating copy to clipboard operation
DistributedArrays.jl copied to clipboard

Transfer of distributed structs when members are accessed

Open raminammour opened this issue 6 years ago • 1 comments

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!

raminammour avatar May 07 '19 14:05 raminammour

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.

jishnub avatar Oct 05 '20 12:10 jishnub