parMap doesn't work fine

Hello! I've just started using parallel computations in Haskell. parMap works fine, it is so easy to use. However, parMap fails with functions returning lazy structures, e.g. tuples. This code works as expected: (parMap rpar) bm tvalues bm :: Double -> Double is some heavy function. But if I want to return list of pairs (t, bm t) it doesn't use cpu cores fine (only one is in use): (parMap rpar) (\t -> (t, bm t)) tvalues The same is valid for functions returning lists. How do I use multiple cores with functions returning tuples?

Hello!
I've just started using parallel computations in Haskell. parMap works fine, it is so easy to use. However, parMap fails with functions returning lazy structures, e.g. tuples.
This code works as expected:
(parMap rpar) bm tvalues
Using rpar is redundant. That strategy schedules a value to maybe be computed later in parallel, but parMap already distributed work between cores, so you might as well use rseq or something.
bm :: Double -> Double is some heavy function. But if I want to return list of pairs (t, bm t) it doesn't use cpu cores fine (only one is in use):
(parMap rpar) (\t -> (t, bm t)) tvalues
That's only evaluating the pair in parallel. bm t will only be computed when you open up the pairs afterwards. Try rdeepseq instead. Brandon

On Thu, 2011-05-12 at 15:29 +0400, Grigory Sarnitskiy wrote:
Hello!
I've just started using parallel computations in Haskell. parMap works fine, it is so easy to use. However, parMap fails with functions returning lazy structures, e.g. tuples.
This code works as expected:
(parMap rpar) bm tvalues
bm :: Double -> Double is some heavy function. But if I want to return list of pairs (t, bm t) it doesn't use cpu cores fine (only one is in use):
(parMap rpar) (\t -> (t, bm t)) tvalues
The same is valid for functions returning lists. How do I use multiple cores with functions returning tuples?
You probably want deepseq: parMap rpar ((\x -> deepseq x x) . bm) tvalues where bm returns tuples. For examples parMap rpar ((\x -> deepseq x x) . (\t -> (t, bm t)) tvalues If you want to get only head: parMap rpar (\t -> let z = bm t in z `seq` t `seq` (t, z)) tvalues Regards
participants (3)
-
Brandon Moore
-
Grigory Sarnitskiy
-
Maciej Marcin Piechotka