I found what I believe to be a bug in DistributedArrays. I am trying to push to the first local part of an array but it ends up pushing to all of the local parts.
using Distributed
addprocs(4)
@everywhere using DistributedArrays
a = dfill([], 10)
s = @spawnat 2 push!(localpart(a)[1], 999)
a
I would expect the a
to be [[999], [], [], [] ...]
, but it actually is [[999], [999], [999], [], ...]
. This is unexpected and against my intuition for how it should behave.
This behavior is not specific to Distributed
, but the way (d)fill
operates. From the docstring
If x is an object reference, all elements will refer to the same object:
julia> A = fill(zeros(2), 2);
julia> A[1][1] = 42; # modifies both A[1][1] and A[2][1]
julia> A
2-element Vector{Vector{Float64}}:
[42.0, 0.0]
[42.0, 0.0]
end
Create the array locally first and then distribute
a = distribute([ [] for _ in 1:10 ])
There is no additional overhead since dfill
allocates locally first anyway.
1 Like