parList implementation question

Simon Marlow marlowsd at gmail.com
Mon Dec 21 07:28:06 EST 2009


On 18/12/2009 18:31, Marcus D. Gabriel wrote:
> Hello,
>
> In Control.Parallel.Strategies, parList is defined as
>
>      parList strat []     = ()
>      parList strat (x:xs) = strat x `par` (parList strat xs)
>
> with
>
>      parMap strat f xs = map f xs `using` parList strat.
>
> I have recently found that if I define
>
>      forceParMap strat f xs = map f xs `using` forceParList strat
>
> where
>
>      forceParList strat = foldl (\done ->  (done>||) . strat) ()
>
> then to date, forceParList via forceParMap gives faster results
> than parList via parMap.  For example, in one experiment, parMap
> with parList run at 0.81 the time of the serial solution whereas
> forceParMap with forceParList run at 0.58 the time of the serial
> solution.  This is to say, forceParList completed in 0.72 the
> time of parList.  So,
>
> 1. Why is forceParList faster than parList?
> 2. Is this generic to the ghc runtime model or a particularity
>     of the ghc implementation?

I'm not sure.  Your forceParList looks equivalent to parList, unless I'm 
misreading it.

I recommend trying out the new parallel package, here:

   http://hackage.haskell.org/package/parallel

which has a new implementation of Strategies.  The version of parList 
you quoted above has a space leak problem which may be affecting your 
results.

Cheers,
	Simon


More information about the Glasgow-haskell-users mailing list