<table cellspacing="0" cellpadding="0" border="0" ><tr><td valign="top" style="font: inherit;">That makes sense.&nbsp; So maybe I should split my mapping into two parallel ones or however many CPUs there are using par.<br><br>--- On <b>Wed, 9/16/09, Bulat Ziganshin <i>&lt;bulat.ziganshin@gmail.com&gt;</i></b> wrote:<br><blockquote style="border-left: 2px solid rgb(16, 16, 255); margin-left: 5px; padding-left: 5px;"><br>From: Bulat Ziganshin &lt;bulat.ziganshin@gmail.com&gt;<br>Subject: Re: [Haskell-cafe] GHC threaded runtimes and pure functions<br>To: "Gregory Propf" &lt;gregorypropf@yahoo.com&gt;<br>Cc: "Haskell-Cafe" &lt;haskell-cafe@haskell.org&gt;<br>Date: Wednesday, September 16, 2009, 6:29 AM<br><br><div class="plainMail">Hello Gregory,<br><br>Wednesday, September 16, 2009, 5:17:01 PM, you wrote:<br><br>no. additional threads are launched for i/o system and, as you<br>requested by -N2 for haskell workload. but ghc don't auto-parallelize<br>your
 code. it's a bit too hard, since making too much threads (e.g.<br>one for every addition) will make bookkeeping too heavy and it's<br>impossible to automatically deduce how much operations each<br>computation will require. instead, you are provided with 'par'<br>primitive to show compiler explicitly what parts to run in parallel<br><br>&gt; One of the things I liked about Haskell was the notion of pure<br>&gt; functions and the fact that they can be, in theory, automatically<br>&gt; parallelized on multicore hardware. I think this will become a huge<br>&gt; deal in a few years as cores multiply.&nbsp; My question is simply this:<br>&gt; under GHC is this what really happens with, say a mapping over a<br>&gt; pure function.&nbsp; Yes, I compiled with --threaded and am using the<br>&gt; +RTS -N2 options on my dual core machine.&nbsp; Here's the code I wrote<br>&gt; as a speed test.&nbsp; It just doesn't seem any faster with -N2.&nbsp; Using<br>&gt; the ps
 command I found that multiple threads are indeed launched<br>&gt; (this is Linux) but all but one show as being in a state of waiting<br>&gt; for some event to finish (the ps output flags them all 'Sl'.<br><br><br><br><br>&gt; main = do rg &lt;- getStdGen<br>&gt; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; let rs = take&nbsp; 10000000 $ randomRs (1::Int,100000::Int) rg<br>&gt; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rs'= map (\n -&gt; n*n) rs<br>&gt; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; print rs'<br><br>&gt;&nbsp;&nbsp;&nbsp;<br><br><br>-- <br>Best regards,<br> Bulat&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; mailto:<a ymailto="mailto:Bulat.Ziganshin@gmail.com" href="/mc/compose?to=Bulat.Ziganshin@gmail.com">Bulat.Ziganshin@gmail.com</a><br><br></div></blockquote></td></tr></table><br>