Control.Parallel.Strategies.parMap CPU usage

Christian Hoener zu Siederdissen choener at tbi.univie.ac.at
Fri Mar 13 11:02:27 EDT 2009


Simon Marlow wrote:
> Christian Hoener zu Siederdissen wrote:
> 
>> when using parMap (or parList and demanding) I see a curious pattern 
>> in CPU usage.
>> Running "parMap rnf fib [1..100]" gives the following pattern of used 
>> CPUs:
>> 4,3,2,1,4,3,2,1,...
> 
> How did you find out which CPU is being used?

Sorry for the misunderstanding, the "pattern of used CPUs" is the _counted_number_ of active cores! 
That means that I am cycling through 4 to 1 active CPUs while there definitively is work that could 
be done by a core. Essentially, parMap seems to divide the list of thunks into blocks of 4 (or n in 
-Nn) and finishes each block before going to the next block.

This is easy to see by running the program and watching the number of active threads in htop / top.

> 
>> The fib function requires roughly two times the time if we go from 
>> fib(n) to fib(n+1), meaning that calculating the next element in the 
>> list always takes longer than the current. What I would like is a 
>> version of parMap that directly takes a free CPU and lets it calculate 
>> the next result, giving the usage pattern 4,4,4,4,...
> 
> In GHC you don't have any control over which CPU is used to execute a 
> spark.  We use dynamic load-balancing, which means the work distribution 
> is essentially random, and will change from run to run.
> 
> If you want more explicit control over your work distribution, try using 
> GHC.Conc.forkOnIO.
> 
> Also note that the implementation of much of this stuff is changing 
> rapidly, so you might want to try a recent snapshot.  Take a look at our 
> paper, if you haven't already:
> 
> http://www.haskell.org/~simonmar/papers/multicore-ghc.pdf
> 
> Cheers,
>     Simon

Hopefully I will find the time to try the latest head and see if the idle-pattern (better name?) 
persists.


Gruss,
Christian


More information about the Glasgow-haskell-users mailing list