[Haskell-cafe] Re: Haskell Paralellism
Simon Marlow
simonmarhaskell at gmail.com
Thu Oct 25 07:03:17 EDT 2007
Dominik Luecke wrote:
> I am trying to use the code
>
> rels list =
> let
> o1 = (map makeCompEntry) $ head $ splitList list
> o2 = (map makeCompEntry) $ head $ tail $ splitList list
> o3 = (map makeCompEntry) $ head $ tail $ tail $ splitList list
> in
> case (head $ tail $ tail $ tail $ splitList list) of
you've written 'splitList list' 4 times here. The compiler might be clever
enough to common them up, but personally I wouldn't rely on it. Your code
can be shortened quite a lot, e.g:
let
(o1:o2:o3:rest) = map makeCompEntry (splitList list)
in
case rest of
...
> [] -> o1 `par` o2 `par` o3 `seq` o1 : o2 : o3 : []
> _ ->
> let o4 = rels (head $ tail $ tail $ tail $ splitList list)
> in
> o1 `par` o2 `par` o3 `par` o4 `seq`
> o1 : o2 : o3 : o4
without knowing what splitList and the rest of the program does, it's hard
to say why you don't get any parallelism here. But note that when you say:
o1 `par` o2 `par` o3 `seq` o1 : o2 : o3 : []
what this does is create "sparks" for o1-o3 before returning the list
[o1,o2,o3]. Now, something else is consuming this list - if whatever
consumes it looks at the head of the list first, then you've immediately
lost the opportunity to overlap o1 with anything else, because the program
is demanding it eagerly.
All this is quite hard to think about, and there is a serious lack of tools
at the moment to tell you what's going on. We do hope to address that in
the future.
Right now, I suggest keeping things really simple. Use large-grain
parallelism, in a very few places in your program. Use strategies - parMap
is a good one because it hides the laziness aspect, you don't need to worry
about what is getting evaluated when.
Cheers,
Simon
More information about the Haskell-Cafe
mailing list