</indexterm>
<para>GHC implements some major extensions to Haskell to support
- concurrent and parallel programming. Let us first etablish terminology:
+ concurrent and parallel programming. Let us first establish terminology:
<itemizedlist>
<listitem><para><emphasis>Parallelism</emphasis> means running
a Haskell program on multiple processors, with the goal of improving
url="http://research.microsoft.com/copyright/accept.asp?path=/users/simonpj/papers/concurrent-haskell.ps.gz">
Concurrent Haskell paper</ulink> is still an excellent
resource, as is <ulink
- url="http://research.microsoft.com/%7Esimonpj/papers/marktoberdorf">Tackling
+ url="http://research.microsoft.com/%7Esimonpj/papers/marktoberdorf/">Tackling
the awkward squad</ulink>.
</para><para>
To the programmer, Concurrent Haskell introduces no new language constructs;
By default GHC runs your program on one processor; if you
want it to run in parallel you must link your program
with the <option>-threaded</option>, and run it with the RTS
- <option>-N</option> option; see <xref linkend="sec-using-smp" />).
+ <option>-N</option> option; see <xref linkend="using-smp" />).
The runtime will
schedule the running Haskell threads among the available OS
threads, running as many in parallel as you specified with the
linkend="concurrent-haskell"/>), but the simplest mechanism for extracting parallelism from pure code is
to use the <literal>par</literal> combinator, which is closely related to (and often used
with) <literal>seq</literal>. Both of these are available from <ulink
- url="../libraries/base/Control-Parallel.html"><literal>Control.Parallel</literal></ulink>:</para>
+ url="../libraries/parallel/Control-Parallel.html"><literal>Control.Parallel</literal></ulink>:</para>
<programlisting>
infixr 0 `par`
nfib :: Int -> Int
nfib n | n <= 1 = 1
- | otherwise = par n1 (seq n2 (n1 + n2))
+ | otherwise = par n1 (seq n2 (n1 + n2 + 1))
where n1 = nfib (n-1)
n2 = nfib (n-2)</programlisting>
(leaving the parent to evaluate the other branch). Also, we must use
<function>seq</function> to ensure that the parent will evaluate
<varname>n2</varname> <emphasis>before</emphasis> <varname>n1</varname>
- in the expression <literal>(n1 + n2)</literal>. It is not sufficient
- to reorder the expression as <literal>(n2 + n1)</literal>, because
+ in the expression <literal>(n1 + n2 + 1)</literal>. It is not sufficient
+ to reorder the expression as <literal>(n2 + n1 + 1)</literal>, because
the compiler may not generate code to evaluate the addends from left to
right.</para>
<para>More sophisticated combinators for expressing parallelism are
available from the <ulink
- url="../libraries/base/Control-Parallel-Strategies.html"><literal>Control.Parallel.Strategies</literal></ulink> module.
+ url="../libraries/parallel/Control-Parallel-Strategies.html"><literal>Control.Parallel.Strategies</literal></ulink> module.
This module builds functionality around <literal>par</literal>,
expressing more elaborate patterns of parallel computation, such as
parallel <literal>map</literal>.</para>