I've got a function that calculates the eccentricity of a vertex in a
graph. This is a relatively expensive operation, so when one wants to get
the eccentricities of ALL vertices, it seems perfect for parallelization:
function p3eccentricity(
g::AbstractGraph,
vs::AbstractArray{Int, 1}=vertices(g);
edge_dists::AbstractArray{Float64, 2} = Array(
Float64,(0,0))
)
refs = RemoteRef[]
for i = 1:length(vs)
x = @spawn eccentricity(g,vs[i], edge_dists=edge_dists)
push!(refs, x)
println("pushing ref $i");
end
println("Done pushing refs");
a = Float64[]
for r in refs
append!(a,fetch(r))
println("Appended");
end
return a
end
p3eccentricity (generic function with 2 methods)
When I run this, I get the following (the failures occur at various points):
julia> @time z = p3eccentricity(g);
pushing ref 1
pushing ref 2
pushing ref 3
pushing ref 4
pushing ref 5
pushing ref 6
pushing ref 7
pushing ref 8
pushing ref 9
pushing ref 10
pushing ref 11
pushing ref 12
pushing ref 13
pushing ref 14
pushing ref 15
pushing ref 16
pushing ref 17
pushing ref 18
ERROR: write: bad address in system call argument (EFAULT)
in wait at /usr/local/julia-latest/lib/julia/sys.dylib
in stream_wait at /usr/local/julia-latest/lib/julia/sys.dylib
in write at stream.jl:790
in send_msg_ at multi.jl:181
in remote_do at multi.jl:720
in flush_gc_msgs at /usr/local/julia-latest/lib/julia/sys.dylib
in send_msg_ at multi.jl:179
in remotecall at multi.jl:667
in remotecall at multi.jl:671
in p3eccentricity at none:8
in p3eccentricity at none:6
julia> fatal error on 2: ERROR: TypeError: deserialize: in typeassert,
expected Module, got Symbol
in deserialize at serialize.jl:499
in handle_deserialize at serialize.jl:352
in deserialize at serialize.jl:435
in handle_deserialize at serialize.jl:352
in deserialize at serialize.jl:473
in handle_deserialize at serialize.jl:352
in deserialize at serialize.jl:559
in deserialize at serialize.jl:514
in handle_deserialize at serialize.jl:352
in deserialize at serialize.jl:335
in anonymous at serialize.jl:355
in ntuple at tuple.jl:30
in deserialize_tuple at serialize.jl:355
in handle_deserialize at serialize.jl:347
in deserialize at serialize.jl:405
in handle_deserialize at serialize.jl:352
in anonymous at task.jl:838
Worker 2 terminated.
What am I doing wrong? Is it even possible to parallelize complex functions
like eccentricity using @spawn and fetch in a simple manner?
Thanks.