I love the new Eval Applicative!<br><br>Out of idle curiosity, can parListN be generalized to parTraverseN similar to how parList was generalized to parTraverse? Similarly, parListChunk?<br><br>-Edward Kmett<br><br><div class="gmail_quote">
On Wed, Nov 18, 2009 at 9:21 AM, Simon Marlow <span dir="ltr">&lt;<a href="mailto:marlowsd@gmail.com">marlowsd@gmail.com</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
I&#39;ve just uploaded parallel-2.0.0.0 to Hackage.  If you&#39;re using Strategies at all, I&#39;d advise updating to this version of the parallel package.  It&#39;s not completely API compatible, but if you&#39;re just using the supplied Strategies such as parList, the changes should be relatively minor.<br>

<br>
The Haddock docs include a full description of the changes, reproduced below.  Haddock docs are also here, until Hackage catches up:<br>
<br>
  <a href="http://www.haskell.org/%7Esimonmar/parallel/index.html" target="_blank">http://www.haskell.org/~simonmar/parallel/index.html</a><br>
<br>
The Strategy-using programs I&#39;ve tried so far go faster.  Enjoy!<br>
<br>
Cheers,<br>
        Simon<br>
<br>
---------------------------------------------------------------------<br>
<br>
Version 1.x<br>
<br>
  The original Strategies design is described in<br>
<br>
&lt;<a href="http://www.macs.hw.ac.uk/%7Edsg/gph/papers/html/Strategies/strategies.html" target="_blank">http://www.macs.hw.ac.uk/~dsg/gph/papers/html/Strategies/strategies.html</a>&gt;<br>
  and the code was written by<br>
     Phil Trinder, Hans-Wolfgang Loidl, Kevin Hammond et al.<br>
<br>
Version 2.x<br>
<br>
Later, during work on the shared-memory implementation of<br>
parallelism in GHC, we discovered that the original formulation of<br>
Strategies had some problems, in particular it lead to space leaks<br>
and difficulties expressing speculative parallelism.  Details are in<br>
the paper \&quot;Runtime Support for Multicore Haskell\&quot; &lt;<a href="http://www.haskell.org/%7Esimonmar/papers/multicore-ghc.pdf" target="_blank">http://www.haskell.org/~simonmar/papers/multicore-ghc.pdf</a>&gt;.<br>

<br>
This module has been rewritten in version 2. The main change is to<br>
the &#39;Strategy a&#39; type synonym, which was previously @a -&gt; Done@ and<br>
is now @a -&gt; a@.  This change helps to fix the space leak described<br>
in \&quot;Runtime Support for Multicore Haskell\&quot;.  The problem is that<br>
the runtime will currently retain the memory referenced by all<br>
sparks, until they are evaluated.  Hence, we must arrange to<br>
evaluate all the sparks eventually, just in case they aren&#39;t<br>
evaluated in parallel, so that they don&#39;t cause a space leak.  This<br>
is why we must return a \&quot;new\&quot; value after applying a &#39;Strategy&#39;,<br>
so that the application can evaluate each spark created by the<br>
&#39;Strategy&#39;.<br>
<br>
The simple rule is this: you /must/ use the result of applying<br>
a &#39;Strategy&#39; if the strategy creates parallel sparks, and you<br>
should probably discard the the original value.  If you don&#39;t<br>
do this, currently it may result in a space leak.  In the<br>
future (GHC 6.14), it will probably result in lost parallelism<br>
instead, as we plan to change GHC so that unreferenced sparks<br>
are discarded rather than retained (we can&#39;t make this change<br>
until most code is switched over to this new version of<br>
Strategies, because code using the old verison of Strategies<br>
would be broken by the change in policy).<br>
<br>
The other changes in version 2.x are:<br>
<br>
  * Strategies can now be defined using a convenient Applicative<br>
    type Eval.  e.g. parList s = unEval $ traverse (Par . s)<br>
<br>
  * &#39;parList&#39; has been generalised to &#39;parTraverse&#39;, which works on<br>
    any &#39;Traversable&#39; type.<br>
<br>
  * &#39;parList&#39; and &#39;parBuffer&#39; have versions specialised to &#39;rwhnf&#39;,<br>
    and there are transformation rules that automatically translate<br>
    e.g. @parList rwnhf@ into a call to the optimised version.<br>
<br>
  * &#39;NFData&#39; is deprecated; please use the @DeepSeq@ class in the @deepseq@<br>
    package instead.  Note that since the &#39;Strategy&#39; type changed, &#39;rnf&#39;<br>
    is no longer a &#39;Strategy&#39;: use &#39;rdeepseq&#39; instead.<br>
_______________________________________________<br>
Haskell-Cafe mailing list<br>
<a href="mailto:Haskell-Cafe@haskell.org" target="_blank">Haskell-Cafe@haskell.org</a><br>
<a href="http://www.haskell.org/mailman/listinfo/haskell-cafe" target="_blank">http://www.haskell.org/mailman/listinfo/haskell-cafe</a><br>
</blockquote></div><br>