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.

Reply via email to