JuliaParallel / DistributedArrays.jl

Distributed Arrays in Julia
Other
197 stars 35 forks source link

All localparts of DArray are updated when only one is specified #238

Open jsbryaniv opened 2 years ago

jsbryaniv commented 2 years ago

I ran into an issue when running this block of code:

using Distributed
if nprocs() == 1
    addprocs()
end
@everywhere using DistributedArrays

a = dfill([], 20)
@sync @distributed for i in 1:20
  b = (i, myid())
  push!(localpart(a)[1], b)
end

a

I would expect a to be

[(1,2), (2,2), (3,2)]
[]
[]
[(4, 3), (5, 3), (6, 3)]
[]
⋮

because I am only pushing to the first local part of a. But what I get is this:

[(1, 2), (2, 2), (3, 2)]
 [(1, 2), (2, 2), (3, 2)]
 [(1, 2), (2, 2), (3, 2)]
 [(4, 3), (5, 3), (6, 3)]
 [(4, 3), (5, 3), (6, 3)]
 ⋮
 [(17, 8), (18, 8)]
 [(17, 8), (18, 8)]
 [(19, 9), (20, 9)]
 [(19, 9), (20, 9)]

It seems that i am pushing to all local parts of a, not just the first one.

jsbryaniv commented 2 years ago

A simpler minimal working example is this:

using Distributed
addprocs(4)
@everywhere using DistributedArrays

a = dfill([], 10)

s = @spawnat 2 push!(localpart(a)[1], 999)

a