SMP parallelism gains inferior than expected

José Pedro Magalhães jpm at
Mon Feb 21 10:38:17 CET 2011


I have a program that computes a matrix of Floats of m rows by n columns.
Computing each Float is relatively expensive. Each line is completely
independent of the others, so I thought I'd try some simple SMP parallelism
on this code:

myFun :: FilePath -> IO ()
myFun fp =
  do fs <- readDataDir fp
     let process f = readFile' f >>= parse
         printLine = putStrLn . foldr (\a b -> show a ++ "\t" ++ b) ""
         runDiff l = [ [ diff x y | y <- l ]
                     | (x,i) <- zip l (map getId fs), myFilter i ]
     ps <- mapM process fs
     sequence_ [ printLine x | x <- runDiff ps *`using` parList rdeepseq* ]

So, I'm using parList to evaluate the rows in parallel, and fully evaluating
each row. Here are the timings on a Dual Quad Core AMD 2378 @2.4 GHz,
ghc-6.12.3, parallel-

-N      time (ms)
none    1m50
2       1m33
3       1m35
4       1m22
5       1m11
6       1m06
7       1m45

The increase at 7 is justified by the fact that there were two other
processes running. I don't know how to justify the small increase at N3,
though, but that doesn't matter too much. The problem is that I am not
getting the gains I expected (halving at N2, a third at N3, etc.). Is this
the best one can achieve with this implicit parallelism, or am I doing
something wrong? In particular, is the way I'm printing the results at the
end destroying potential parallel gains?

Any insights on this are appreciated.

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <>

More information about the Glasgow-haskell-users mailing list