I’m trying to understand why we need all parts of the standard sample code:
a `par` b `pseq` a+b
Why won’t the following be sufficient?
a `par` b `par` a+b
The above expression seems very descriptive: Try to evaluate both a and b in parallel, and return the result a+b. Is the reason only that of efficiency: the second version would spark off twice instead of once?
How about the following, more succinct version?
a `par` a+b
Why would we need to make sure b is evaluated before a+b as in the original, standard code?
Ok. I think the following paper answers my question: http://community.haskell.org/~simonmar/papers/threadscope.pdf
In summary, the problem with
and
is the lack of ordering of evaluation. In both versions, the main thread gets to work on
a(or sometimesb) immediately, causing the sparks to “fizzle” away immediately since there is no more need to start a thread to evaluate what the main thread has already started evaluating.The original version
ensures the main thread works on
bbeforea+b(or else would have started evaluatingainstead), thus giving a chance for the sparkato materialize into a thread for parallel evaluation.