4
votes

I'm playing around for the first time with parallel computing with julia. I'm having a bit of a headache. So let's say I start julia as follows: julia -p 4. Then I declare the a function for all processors and then I use it with pmap and also with @parallel for.

@everywhere function count_heads(n)
    c::Int = 0
    for i=1:n
        c += rand(Bool)
    end
    n, c  # tuple (input, output)
end

###### first part ######
v=pmap(count_heads, 50000:1000:70000)
println("Result first part")
println(v)

###### second part ######
println("Result second part")
@parallel for i in 50000:1000:70000
    println(count_heads(i))
end

The result is the following.

Result first part
Counting heads function
Any[(50000,24894),(51000,25559),(52000,26141),(53000,26546),(54000,27056),(55000,27426),(56000,28024),(57000,28380),(58000,29001),(59000,29398),(60000,30100),(61000,30608),(62000,31001),(63000,31520),(64000,32200),(65000,32357),(66000,33063),(67000,33674),(68000,34085),(69000,34627),(70000,34902)]
Result second part
    From worker 4:  (61000, From worker 5:  (66000, From worker 2:  (50000, From worker 3:  (56000

Thus, the funcion pmap is apparently working fine but @parallel for is stopping or it doesn't give me the results. Am I doing something wrong?

Thanks!

Update

If at the end of the code I put sleep(10). It does the work correctly.

From worker 5:  (66000,33182)
From worker 3:  (56000,27955)
............
From worker 3:  (56000,27955)
1
Also: if you are trying to play around with these things its probably more useful, and maybe better practice, to assign things to an variable and then check what is returned (or use the fetched remote refs) rather than println as I guess thats more likely to be what you'll use them for later - Alexander Morley

1 Answers

6
votes

Both of your examples work properly on my laptop so I'm not sure but I think this answer might solve your problem!

It should work as expected if you add @sync before the @parallel for

From the julia Parallel Computing Docs http://docs.julialang.org/en/release-0.4/manual/parallel-computing/:

... the reduction operator can be omitted if it is not needed. In that case, the loop executes asynchronously, i.e. it spawns independent tasks on all available workers and returns an array of RemoteRef immediately without waiting for completion. The caller can wait for the RemoteRef completions at a later point by calling fetch() on them, or wait for completion at the end of the loop by prefixing it with @sync, like @sync @parallel for.

So you are maybe calling println on the RemoteRef before it has completed.