Parallel forkOS does not work on ubuntu

Simon Marlow marlowsd at
Wed Dec 10 09:24:28 EST 2008

Hoang Truong wrote:
> Hi Simon,
> I tried with forkIO and added another dowork functions but the result is 
> the same: only one core is used, three other cores are idle. Do you have 
> any other suggestions? Is there anything I should take care when 
> installing GHC?
> I also did try the Wombat.hs from the tutorial, but only one core is 
> used and the times are almost the same.
> seq sum: 119201850
> seq time: 20.959932 seconds.
> par sum: 119201850
> par time: 20.959547 seconds.

Your program is suffering from microbenchmarkitis, I'm afraid.  There's 
only one spark, which tickles a bug in the scheduler in 6.10.1 and earlier 
(but sometimes doesn't happen due to random scheduling behaviour).  Even 
with that fixed, the program uses fib which tickles another bug: when 
optimised, fib doesn't do any allocation, and GHC's scheduler relies on 
allocation happening at regular enough intervals.

In 6.10.1 we never get to do load-balancing in this example, because fib 
doesn't ever yield control to the scheduler.  In HEAD, where we have 
work-stealing and don't rely on the scheduler for load-balancing, the 
load-balancing problem goes away but reveals another problem: the second 
thread wants to GC, but in order to GC it has to synchronise with the other 
running threads, but the other thread is running fib and never yields.  We 
can fix this by allowing CPUs to GC independently (which we plan to do), 
but even then you could still run into the same problem because eventually 
a global GC will be required.  If you really want to see the program 
running in parallel, turn off -O.


More information about the Glasgow-haskell-users mailing list