[Haskell-cafe] testing par with simple program
Don Stewart
dons at galois.com
Fri Aug 21 14:30:21 EDT 2009
paolo.veronelli:
> A better test program
>
> import Control.Parallel
>
> main = a `par` b `pseq` print (a + b )
> where
> a = ack 3 11
> b = fib 39
>
> ack 0 n = n+1
> ack m 0 = ack (m-1) 1
> ack m n = ack (m-1) (ack m (n-1))
>
> fib 0 = 0
> fib 1 = 1
> fib n = fib (n-1) + fib (n-2)
>
> running it , these are the results
>
> From the resource graph and the timings it is clear that the program is not
> able to use all the 2 cores powers, considering computing 'a' alone is about 7
> seconds and 'b' alone 9.
> What is retaining the cpu's to run full power ?
>
Some advice on analysing parallel programs:
* Read Simon Marlow's excellent paper:
"Runtime Support for Multicore Haskell"
http://ghcmutterings.wordpress.com/2009/03/03/new-paper-runtime-support-for-multicore-haskell/
* Install GHC Head from 2009, it includes spark profiling.
* Never bother measuring without using -O or -O2 -- unoptimized code
is just not useful to think about.
* Compile your program:
$ ghc-6.11.20090228 -O2 --make -threaded A.hs
[1 of 1] Compiling Main ( A.hs, A.o )
Linking A ...
* Run it with +RTS -sstderr
$ ./A +RTS -N2 -sstderr
./A +RTS -N2 -sstderr
63262367
...
Generation 0: 12021 collections, 0 parallel, 1.33s, 1.42s elapsed
Generation 1: 2 collections, 1 parallel, 0.00s, 0.00s elapsed
Parallel GC work balance: 1.03 (426 / 414, ideal 2)
SPARKS: 1 (1 converted, 0 pruned)
Productivity 90.7% of total user, 126.4% of total elapsed
And we see 3 things:
* It did use the parallel GC : good!
* It did convert 1 spark to a thread: good!
* Productivity was greater than 100%: good!
So this looks fine!
So I suspect you're falling into the ghc 6.10.x series bug where < 3 sparks would not be converted.
Try with either 3 sparks, or using GHC 6.11.x series.
-- Don
More information about the Haskell-Cafe
mailing list