xref: /netbsd-src/external/gpl3/gcc.old/dist/libstdc++-v3/doc/xml/manual/parallel_mode.xml (revision 8feb0f0b7eaff0608f8350bbfa3098827b4bb91b)
11debfc3dSmrg<chapter xmlns="http://docbook.org/ns/docbook" version="5.0"
21debfc3dSmrg	 xml:id="manual.ext.parallel_mode" xreflabel="Parallel Mode">
31debfc3dSmrg<?dbhtml filename="parallel_mode.html"?>
41debfc3dSmrg
51debfc3dSmrg<info><title>Parallel Mode</title>
61debfc3dSmrg  <keywordset>
71debfc3dSmrg    <keyword>C++</keyword>
81debfc3dSmrg    <keyword>library</keyword>
91debfc3dSmrg    <keyword>parallel</keyword>
101debfc3dSmrg  </keywordset>
111debfc3dSmrg</info>
121debfc3dSmrg
131debfc3dSmrg
141debfc3dSmrg
151debfc3dSmrg<para> The libstdc++ parallel mode is an experimental parallel
16*8feb0f0bSmrgimplementation of many algorithms of the C++ Standard Library.
171debfc3dSmrg</para>
181debfc3dSmrg
191debfc3dSmrg<para>
201debfc3dSmrgSeveral of the standard algorithms, for instance
211debfc3dSmrg<function>std::sort</function>, are made parallel using OpenMP
22*8feb0f0bSmrgannotations. These parallel mode constructs can be invoked by
231debfc3dSmrgexplicit source declaration or by compiling existing sources with a
241debfc3dSmrgspecific compiler flag.
251debfc3dSmrg</para>
261debfc3dSmrg
27*8feb0f0bSmrg<note>
28*8feb0f0bSmrg  <para>
29*8feb0f0bSmrg    The parallel mode has not been kept up to date with recent C++ standards
30*8feb0f0bSmrg    and so it only conforms to the C++03 requirements.
31*8feb0f0bSmrg    That means that move-only predicates may not work with parallel mode
32*8feb0f0bSmrg    algorithms, and for C++20 most of the algorithms cannot be used in
33*8feb0f0bSmrg    <code>constexpr</code> functions.
34*8feb0f0bSmrg  </para>
35*8feb0f0bSmrg  <para>
36*8feb0f0bSmrg    For C++17 and above there are new overloads of the standard algorithms
37*8feb0f0bSmrg    which take an execution policy argument. You should consider using those
38*8feb0f0bSmrg    instead of the non-standard parallel mode extensions.
39*8feb0f0bSmrg  </para>
40*8feb0f0bSmrg</note>
411debfc3dSmrg
421debfc3dSmrg<section xml:id="manual.ext.parallel_mode.intro" xreflabel="Intro"><info><title>Intro</title></info>
431debfc3dSmrg
441debfc3dSmrg
451debfc3dSmrg<para>The following library components in the include
461debfc3dSmrg<filename class="headerfile">numeric</filename> are included in the parallel mode:</para>
471debfc3dSmrg<itemizedlist>
481debfc3dSmrg  <listitem><para><function>std::accumulate</function></para></listitem>
491debfc3dSmrg  <listitem><para><function>std::adjacent_difference</function></para></listitem>
501debfc3dSmrg  <listitem><para><function>std::inner_product</function></para></listitem>
511debfc3dSmrg  <listitem><para><function>std::partial_sum</function></para></listitem>
521debfc3dSmrg</itemizedlist>
531debfc3dSmrg
541debfc3dSmrg<para>The following library components in the include
551debfc3dSmrg<filename class="headerfile">algorithm</filename> are included in the parallel mode:</para>
561debfc3dSmrg<itemizedlist>
571debfc3dSmrg  <listitem><para><function>std::adjacent_find</function></para></listitem>
581debfc3dSmrg  <listitem><para><function>std::count</function></para></listitem>
591debfc3dSmrg  <listitem><para><function>std::count_if</function></para></listitem>
601debfc3dSmrg  <listitem><para><function>std::equal</function></para></listitem>
611debfc3dSmrg  <listitem><para><function>std::find</function></para></listitem>
621debfc3dSmrg  <listitem><para><function>std::find_if</function></para></listitem>
631debfc3dSmrg  <listitem><para><function>std::find_first_of</function></para></listitem>
641debfc3dSmrg  <listitem><para><function>std::for_each</function></para></listitem>
651debfc3dSmrg  <listitem><para><function>std::generate</function></para></listitem>
661debfc3dSmrg  <listitem><para><function>std::generate_n</function></para></listitem>
671debfc3dSmrg  <listitem><para><function>std::lexicographical_compare</function></para></listitem>
681debfc3dSmrg  <listitem><para><function>std::mismatch</function></para></listitem>
691debfc3dSmrg  <listitem><para><function>std::search</function></para></listitem>
701debfc3dSmrg  <listitem><para><function>std::search_n</function></para></listitem>
711debfc3dSmrg  <listitem><para><function>std::transform</function></para></listitem>
721debfc3dSmrg  <listitem><para><function>std::replace</function></para></listitem>
731debfc3dSmrg  <listitem><para><function>std::replace_if</function></para></listitem>
741debfc3dSmrg  <listitem><para><function>std::max_element</function></para></listitem>
751debfc3dSmrg  <listitem><para><function>std::merge</function></para></listitem>
761debfc3dSmrg  <listitem><para><function>std::min_element</function></para></listitem>
771debfc3dSmrg  <listitem><para><function>std::nth_element</function></para></listitem>
781debfc3dSmrg  <listitem><para><function>std::partial_sort</function></para></listitem>
791debfc3dSmrg  <listitem><para><function>std::partition</function></para></listitem>
801debfc3dSmrg  <listitem><para><function>std::random_shuffle</function></para></listitem>
811debfc3dSmrg  <listitem><para><function>std::set_union</function></para></listitem>
821debfc3dSmrg  <listitem><para><function>std::set_intersection</function></para></listitem>
831debfc3dSmrg  <listitem><para><function>std::set_symmetric_difference</function></para></listitem>
841debfc3dSmrg  <listitem><para><function>std::set_difference</function></para></listitem>
851debfc3dSmrg  <listitem><para><function>std::sort</function></para></listitem>
861debfc3dSmrg  <listitem><para><function>std::stable_sort</function></para></listitem>
871debfc3dSmrg  <listitem><para><function>std::unique_copy</function></para></listitem>
881debfc3dSmrg</itemizedlist>
891debfc3dSmrg
901debfc3dSmrg</section>
911debfc3dSmrg
921debfc3dSmrg<section xml:id="manual.ext.parallel_mode.semantics" xreflabel="Semantics"><info><title>Semantics</title></info>
931debfc3dSmrg<?dbhtml filename="parallel_mode_semantics.html"?>
941debfc3dSmrg
951debfc3dSmrg
961debfc3dSmrg<para> The parallel mode STL algorithms are currently not exception-safe,
971debfc3dSmrgi.e. user-defined functors must not throw exceptions.
981debfc3dSmrgAlso, the order of execution is not guaranteed for some functions, of course.
991debfc3dSmrgTherefore, user-defined functors should not have any concurrent side effects.
1001debfc3dSmrg</para>
1011debfc3dSmrg
1021debfc3dSmrg<para> Since the current GCC OpenMP implementation does not support
1031debfc3dSmrgOpenMP parallel regions in concurrent threads,
1041debfc3dSmrgit is not possible to call parallel STL algorithm in
1051debfc3dSmrgconcurrent threads, either.
1061debfc3dSmrgIt might work with other compilers, though.</para>
1071debfc3dSmrg
1081debfc3dSmrg</section>
1091debfc3dSmrg
1101debfc3dSmrg<section xml:id="manual.ext.parallel_mode.using" xreflabel="Using"><info><title>Using</title></info>
1111debfc3dSmrg<?dbhtml filename="parallel_mode_using.html"?>
1121debfc3dSmrg
1131debfc3dSmrg
1141debfc3dSmrg<section xml:id="parallel_mode.using.prereq_flags"><info><title>Prerequisite Compiler Flags</title></info>
1151debfc3dSmrg
1161debfc3dSmrg
1171debfc3dSmrg<para>
1181debfc3dSmrg  Any use of parallel functionality requires additional compiler
1191debfc3dSmrg  and runtime support, in particular support for OpenMP. Adding this support is
1201debfc3dSmrg  not difficult: just compile your application with the compiler
1211debfc3dSmrg  flag <literal>-fopenmp</literal>. This will link
1221debfc3dSmrg  in <code>libgomp</code>, the
1231debfc3dSmrg  <link xmlns:xlink="http://www.w3.org/1999/xlink"
1241debfc3dSmrg    xlink:href="http://gcc.gnu.org/onlinedocs/libgomp/">GNU Offloading and
1251debfc3dSmrg    Multi Processing Runtime Library</link>,
1261debfc3dSmrg  whose presence is mandatory.
1271debfc3dSmrg</para>
1281debfc3dSmrg
1291debfc3dSmrg<para>
1301debfc3dSmrgIn addition, hardware that supports atomic operations and a compiler
1311debfc3dSmrg  capable of producing atomic operations is mandatory: GCC defaults to no
1321debfc3dSmrg  support for atomic operations on some common hardware
1331debfc3dSmrg  architectures. Activating atomic operations may require explicit
1341debfc3dSmrg  compiler flags on some targets (like sparc and x86), such
1351debfc3dSmrg  as <literal>-march=i686</literal>,
1361debfc3dSmrg  <literal>-march=native</literal> or <literal>-mcpu=v9</literal>. See
1371debfc3dSmrg  the GCC manual for more information.
1381debfc3dSmrg</para>
1391debfc3dSmrg
1401debfc3dSmrg</section>
1411debfc3dSmrg
1421debfc3dSmrg<section xml:id="parallel_mode.using.parallel_mode"><info><title>Using Parallel Mode</title></info>
1431debfc3dSmrg
1441debfc3dSmrg
1451debfc3dSmrg<para>
1461debfc3dSmrg  To use the libstdc++ parallel mode, compile your application with
1471debfc3dSmrg  the prerequisite flags as detailed above, and in addition
1481debfc3dSmrg  add <constant>-D_GLIBCXX_PARALLEL</constant>. This will convert all
1491debfc3dSmrg  use of the standard (sequential) algorithms to the appropriate parallel
1501debfc3dSmrg  equivalents. Please note that this doesn't necessarily mean that
1511debfc3dSmrg  everything will end up being executed in a parallel manner, but
1521debfc3dSmrg  rather that the heuristics and settings coded into the parallel
1531debfc3dSmrg  versions will be used to determine if all, some, or no algorithms
1541debfc3dSmrg  will be executed using parallel variants.
1551debfc3dSmrg</para>
1561debfc3dSmrg
1571debfc3dSmrg<para>Note that the <constant>_GLIBCXX_PARALLEL</constant> define may change the
1581debfc3dSmrg  sizes and behavior of standard class templates such as
1591debfc3dSmrg  <function>std::search</function>, and therefore one can only link code
1601debfc3dSmrg  compiled with parallel mode and code compiled without parallel mode
1611debfc3dSmrg  if no instantiation of a container is passed between the two
1621debfc3dSmrg  translation units. Parallel mode functionality has distinct linkage,
1631debfc3dSmrg  and cannot be confused with normal mode symbols.
1641debfc3dSmrg</para>
1651debfc3dSmrg</section>
1661debfc3dSmrg
1671debfc3dSmrg<section xml:id="parallel_mode.using.specific"><info><title>Using Specific Parallel Components</title></info>
1681debfc3dSmrg
1691debfc3dSmrg
1701debfc3dSmrg<para>When it is not feasible to recompile your entire application, or
1711debfc3dSmrg  only specific algorithms need to be parallel-aware, individual
1721debfc3dSmrg  parallel algorithms can be made available explicitly. These
1731debfc3dSmrg  parallel algorithms are functionally equivalent to the standard
1741debfc3dSmrg  drop-in algorithms used in parallel mode, but they are available in
1751debfc3dSmrg  a separate namespace as GNU extensions and may be used in programs
1761debfc3dSmrg  compiled with either release mode or with parallel mode.
1771debfc3dSmrg</para>
1781debfc3dSmrg
1791debfc3dSmrg
1801debfc3dSmrg<para>An example of using a parallel version
1811debfc3dSmrgof <function>std::sort</function>, but no other parallel algorithms, is:
1821debfc3dSmrg</para>
1831debfc3dSmrg
1841debfc3dSmrg<programlisting>
1851debfc3dSmrg#include &lt;vector&gt;
1861debfc3dSmrg#include &lt;parallel/algorithm&gt;
1871debfc3dSmrg
1881debfc3dSmrgint main()
1891debfc3dSmrg{
1901debfc3dSmrg  std::vector&lt;int&gt; v(100);
1911debfc3dSmrg
1921debfc3dSmrg  // ...
1931debfc3dSmrg
1941debfc3dSmrg  // Explicitly force a call to parallel sort.
1951debfc3dSmrg  __gnu_parallel::sort(v.begin(), v.end());
1961debfc3dSmrg  return 0;
1971debfc3dSmrg}
1981debfc3dSmrg</programlisting>
1991debfc3dSmrg
2001debfc3dSmrg<para>
2011debfc3dSmrgThen compile this code with the prerequisite compiler flags
2021debfc3dSmrg(<literal>-fopenmp</literal> and any necessary architecture-specific
2031debfc3dSmrgflags for atomic operations.)
2041debfc3dSmrg</para>
2051debfc3dSmrg
2061debfc3dSmrg<para> The following table provides the names and headers of all the
2071debfc3dSmrg  parallel algorithms that can be used in a similar manner:
2081debfc3dSmrg</para>
2091debfc3dSmrg
2101debfc3dSmrg<table frame="all" xml:id="table.parallel_algos">
2111debfc3dSmrg<title>Parallel Algorithms</title>
2121debfc3dSmrg
2131debfc3dSmrg<tgroup cols="4" align="left" colsep="1" rowsep="1">
2141debfc3dSmrg<colspec colname="c1"/>
2151debfc3dSmrg<colspec colname="c2"/>
2161debfc3dSmrg<colspec colname="c3"/>
2171debfc3dSmrg<colspec colname="c4"/>
2181debfc3dSmrg
2191debfc3dSmrg<thead>
2201debfc3dSmrg  <row>
2211debfc3dSmrg    <entry>Algorithm</entry>
2221debfc3dSmrg    <entry>Header</entry>
2231debfc3dSmrg    <entry>Parallel algorithm</entry>
2241debfc3dSmrg    <entry>Parallel header</entry>
2251debfc3dSmrg  </row>
2261debfc3dSmrg</thead>
2271debfc3dSmrg
2281debfc3dSmrg<tbody>
2291debfc3dSmrg  <row>
2301debfc3dSmrg    <entry><function>std::accumulate</function></entry>
2311debfc3dSmrg    <entry><filename class="headerfile">numeric</filename></entry>
2321debfc3dSmrg    <entry><function>__gnu_parallel::accumulate</function></entry>
2331debfc3dSmrg    <entry><filename class="headerfile">parallel/numeric</filename></entry>
2341debfc3dSmrg  </row>
2351debfc3dSmrg  <row>
2361debfc3dSmrg    <entry><function>std::adjacent_difference</function></entry>
2371debfc3dSmrg    <entry><filename class="headerfile">numeric</filename></entry>
2381debfc3dSmrg    <entry><function>__gnu_parallel::adjacent_difference</function></entry>
2391debfc3dSmrg    <entry><filename class="headerfile">parallel/numeric</filename></entry>
2401debfc3dSmrg  </row>
2411debfc3dSmrg  <row>
2421debfc3dSmrg    <entry><function>std::inner_product</function></entry>
2431debfc3dSmrg    <entry><filename class="headerfile">numeric</filename></entry>
2441debfc3dSmrg    <entry><function>__gnu_parallel::inner_product</function></entry>
2451debfc3dSmrg    <entry><filename class="headerfile">parallel/numeric</filename></entry>
2461debfc3dSmrg  </row>
2471debfc3dSmrg  <row>
2481debfc3dSmrg    <entry><function>std::partial_sum</function></entry>
2491debfc3dSmrg    <entry><filename class="headerfile">numeric</filename></entry>
2501debfc3dSmrg    <entry><function>__gnu_parallel::partial_sum</function></entry>
2511debfc3dSmrg    <entry><filename class="headerfile">parallel/numeric</filename></entry>
2521debfc3dSmrg  </row>
2531debfc3dSmrg  <row>
2541debfc3dSmrg    <entry><function>std::adjacent_find</function></entry>
2551debfc3dSmrg    <entry><filename class="headerfile">algorithm</filename></entry>
2561debfc3dSmrg    <entry><function>__gnu_parallel::adjacent_find</function></entry>
2571debfc3dSmrg    <entry><filename class="headerfile">parallel/algorithm</filename></entry>
2581debfc3dSmrg  </row>
2591debfc3dSmrg
2601debfc3dSmrg  <row>
2611debfc3dSmrg    <entry><function>std::count</function></entry>
2621debfc3dSmrg    <entry><filename class="headerfile">algorithm</filename></entry>
2631debfc3dSmrg    <entry><function>__gnu_parallel::count</function></entry>
2641debfc3dSmrg    <entry><filename class="headerfile">parallel/algorithm</filename></entry>
2651debfc3dSmrg  </row>
2661debfc3dSmrg
2671debfc3dSmrg  <row>
2681debfc3dSmrg    <entry><function>std::count_if</function></entry>
2691debfc3dSmrg    <entry><filename class="headerfile">algorithm</filename></entry>
2701debfc3dSmrg    <entry><function>__gnu_parallel::count_if</function></entry>
2711debfc3dSmrg    <entry><filename class="headerfile">parallel/algorithm</filename></entry>
2721debfc3dSmrg  </row>
2731debfc3dSmrg
2741debfc3dSmrg  <row>
2751debfc3dSmrg    <entry><function>std::equal</function></entry>
2761debfc3dSmrg    <entry><filename class="headerfile">algorithm</filename></entry>
2771debfc3dSmrg    <entry><function>__gnu_parallel::equal</function></entry>
2781debfc3dSmrg    <entry><filename class="headerfile">parallel/algorithm</filename></entry>
2791debfc3dSmrg  </row>
2801debfc3dSmrg
2811debfc3dSmrg  <row>
2821debfc3dSmrg    <entry><function>std::find</function></entry>
2831debfc3dSmrg    <entry><filename class="headerfile">algorithm</filename></entry>
2841debfc3dSmrg    <entry><function>__gnu_parallel::find</function></entry>
2851debfc3dSmrg    <entry><filename class="headerfile">parallel/algorithm</filename></entry>
2861debfc3dSmrg  </row>
2871debfc3dSmrg
2881debfc3dSmrg  <row>
2891debfc3dSmrg    <entry><function>std::find_if</function></entry>
2901debfc3dSmrg    <entry><filename class="headerfile">algorithm</filename></entry>
2911debfc3dSmrg    <entry><function>__gnu_parallel::find_if</function></entry>
2921debfc3dSmrg    <entry><filename class="headerfile">parallel/algorithm</filename></entry>
2931debfc3dSmrg  </row>
2941debfc3dSmrg
2951debfc3dSmrg  <row>
2961debfc3dSmrg    <entry><function>std::find_first_of</function></entry>
2971debfc3dSmrg    <entry><filename class="headerfile">algorithm</filename></entry>
2981debfc3dSmrg    <entry><function>__gnu_parallel::find_first_of</function></entry>
2991debfc3dSmrg    <entry><filename class="headerfile">parallel/algorithm</filename></entry>
3001debfc3dSmrg  </row>
3011debfc3dSmrg
3021debfc3dSmrg  <row>
3031debfc3dSmrg    <entry><function>std::for_each</function></entry>
3041debfc3dSmrg    <entry><filename class="headerfile">algorithm</filename></entry>
3051debfc3dSmrg    <entry><function>__gnu_parallel::for_each</function></entry>
3061debfc3dSmrg    <entry><filename class="headerfile">parallel/algorithm</filename></entry>
3071debfc3dSmrg  </row>
3081debfc3dSmrg
3091debfc3dSmrg  <row>
3101debfc3dSmrg    <entry><function>std::generate</function></entry>
3111debfc3dSmrg    <entry><filename class="headerfile">algorithm</filename></entry>
3121debfc3dSmrg    <entry><function>__gnu_parallel::generate</function></entry>
3131debfc3dSmrg    <entry><filename class="headerfile">parallel/algorithm</filename></entry>
3141debfc3dSmrg  </row>
3151debfc3dSmrg
3161debfc3dSmrg  <row>
3171debfc3dSmrg    <entry><function>std::generate_n</function></entry>
3181debfc3dSmrg    <entry><filename class="headerfile">algorithm</filename></entry>
3191debfc3dSmrg    <entry><function>__gnu_parallel::generate_n</function></entry>
3201debfc3dSmrg    <entry><filename class="headerfile">parallel/algorithm</filename></entry>
3211debfc3dSmrg  </row>
3221debfc3dSmrg
3231debfc3dSmrg  <row>
3241debfc3dSmrg    <entry><function>std::lexicographical_compare</function></entry>
3251debfc3dSmrg    <entry><filename class="headerfile">algorithm</filename></entry>
3261debfc3dSmrg    <entry><function>__gnu_parallel::lexicographical_compare</function></entry>
3271debfc3dSmrg    <entry><filename class="headerfile">parallel/algorithm</filename></entry>
3281debfc3dSmrg  </row>
3291debfc3dSmrg
3301debfc3dSmrg  <row>
3311debfc3dSmrg    <entry><function>std::mismatch</function></entry>
3321debfc3dSmrg    <entry><filename class="headerfile">algorithm</filename></entry>
3331debfc3dSmrg    <entry><function>__gnu_parallel::mismatch</function></entry>
3341debfc3dSmrg    <entry><filename class="headerfile">parallel/algorithm</filename></entry>
3351debfc3dSmrg  </row>
3361debfc3dSmrg
3371debfc3dSmrg  <row>
3381debfc3dSmrg    <entry><function>std::search</function></entry>
3391debfc3dSmrg    <entry><filename class="headerfile">algorithm</filename></entry>
3401debfc3dSmrg    <entry><function>__gnu_parallel::search</function></entry>
3411debfc3dSmrg    <entry><filename class="headerfile">parallel/algorithm</filename></entry>
3421debfc3dSmrg  </row>
3431debfc3dSmrg
3441debfc3dSmrg  <row>
3451debfc3dSmrg    <entry><function>std::search_n</function></entry>
3461debfc3dSmrg    <entry><filename class="headerfile">algorithm</filename></entry>
3471debfc3dSmrg    <entry><function>__gnu_parallel::search_n</function></entry>
3481debfc3dSmrg    <entry><filename class="headerfile">parallel/algorithm</filename></entry>
3491debfc3dSmrg  </row>
3501debfc3dSmrg
3511debfc3dSmrg  <row>
3521debfc3dSmrg    <entry><function>std::transform</function></entry>
3531debfc3dSmrg    <entry><filename class="headerfile">algorithm</filename></entry>
3541debfc3dSmrg    <entry><function>__gnu_parallel::transform</function></entry>
3551debfc3dSmrg    <entry><filename class="headerfile">parallel/algorithm</filename></entry>
3561debfc3dSmrg  </row>
3571debfc3dSmrg
3581debfc3dSmrg  <row>
3591debfc3dSmrg    <entry><function>std::replace</function></entry>
3601debfc3dSmrg    <entry><filename class="headerfile">algorithm</filename></entry>
3611debfc3dSmrg    <entry><function>__gnu_parallel::replace</function></entry>
3621debfc3dSmrg    <entry><filename class="headerfile">parallel/algorithm</filename></entry>
3631debfc3dSmrg  </row>
3641debfc3dSmrg
3651debfc3dSmrg  <row>
3661debfc3dSmrg    <entry><function>std::replace_if</function></entry>
3671debfc3dSmrg    <entry><filename class="headerfile">algorithm</filename></entry>
3681debfc3dSmrg    <entry><function>__gnu_parallel::replace_if</function></entry>
3691debfc3dSmrg    <entry><filename class="headerfile">parallel/algorithm</filename></entry>
3701debfc3dSmrg  </row>
3711debfc3dSmrg
3721debfc3dSmrg  <row>
3731debfc3dSmrg    <entry><function>std::max_element</function></entry>
3741debfc3dSmrg    <entry><filename class="headerfile">algorithm</filename></entry>
3751debfc3dSmrg    <entry><function>__gnu_parallel::max_element</function></entry>
3761debfc3dSmrg    <entry><filename class="headerfile">parallel/algorithm</filename></entry>
3771debfc3dSmrg  </row>
3781debfc3dSmrg
3791debfc3dSmrg  <row>
3801debfc3dSmrg    <entry><function>std::merge</function></entry>
3811debfc3dSmrg    <entry><filename class="headerfile">algorithm</filename></entry>
3821debfc3dSmrg    <entry><function>__gnu_parallel::merge</function></entry>
3831debfc3dSmrg    <entry><filename class="headerfile">parallel/algorithm</filename></entry>
3841debfc3dSmrg  </row>
3851debfc3dSmrg
3861debfc3dSmrg  <row>
3871debfc3dSmrg    <entry><function>std::min_element</function></entry>
3881debfc3dSmrg    <entry><filename class="headerfile">algorithm</filename></entry>
3891debfc3dSmrg    <entry><function>__gnu_parallel::min_element</function></entry>
3901debfc3dSmrg    <entry><filename class="headerfile">parallel/algorithm</filename></entry>
3911debfc3dSmrg  </row>
3921debfc3dSmrg
3931debfc3dSmrg  <row>
3941debfc3dSmrg    <entry><function>std::nth_element</function></entry>
3951debfc3dSmrg    <entry><filename class="headerfile">algorithm</filename></entry>
3961debfc3dSmrg    <entry><function>__gnu_parallel::nth_element</function></entry>
3971debfc3dSmrg    <entry><filename class="headerfile">parallel/algorithm</filename></entry>
3981debfc3dSmrg  </row>
3991debfc3dSmrg
4001debfc3dSmrg  <row>
4011debfc3dSmrg    <entry><function>std::partial_sort</function></entry>
4021debfc3dSmrg    <entry><filename class="headerfile">algorithm</filename></entry>
4031debfc3dSmrg    <entry><function>__gnu_parallel::partial_sort</function></entry>
4041debfc3dSmrg    <entry><filename class="headerfile">parallel/algorithm</filename></entry>
4051debfc3dSmrg  </row>
4061debfc3dSmrg
4071debfc3dSmrg  <row>
4081debfc3dSmrg    <entry><function>std::partition</function></entry>
4091debfc3dSmrg    <entry><filename class="headerfile">algorithm</filename></entry>
4101debfc3dSmrg    <entry><function>__gnu_parallel::partition</function></entry>
4111debfc3dSmrg    <entry><filename class="headerfile">parallel/algorithm</filename></entry>
4121debfc3dSmrg  </row>
4131debfc3dSmrg
4141debfc3dSmrg  <row>
4151debfc3dSmrg    <entry><function>std::random_shuffle</function></entry>
4161debfc3dSmrg    <entry><filename class="headerfile">algorithm</filename></entry>
4171debfc3dSmrg    <entry><function>__gnu_parallel::random_shuffle</function></entry>
4181debfc3dSmrg    <entry><filename class="headerfile">parallel/algorithm</filename></entry>
4191debfc3dSmrg  </row>
4201debfc3dSmrg
4211debfc3dSmrg  <row>
4221debfc3dSmrg    <entry><function>std::set_union</function></entry>
4231debfc3dSmrg    <entry><filename class="headerfile">algorithm</filename></entry>
4241debfc3dSmrg    <entry><function>__gnu_parallel::set_union</function></entry>
4251debfc3dSmrg    <entry><filename class="headerfile">parallel/algorithm</filename></entry>
4261debfc3dSmrg  </row>
4271debfc3dSmrg
4281debfc3dSmrg  <row>
4291debfc3dSmrg    <entry><function>std::set_intersection</function></entry>
4301debfc3dSmrg    <entry><filename class="headerfile">algorithm</filename></entry>
4311debfc3dSmrg    <entry><function>__gnu_parallel::set_intersection</function></entry>
4321debfc3dSmrg    <entry><filename class="headerfile">parallel/algorithm</filename></entry>
4331debfc3dSmrg  </row>
4341debfc3dSmrg
4351debfc3dSmrg  <row>
4361debfc3dSmrg    <entry><function>std::set_symmetric_difference</function></entry>
4371debfc3dSmrg    <entry><filename class="headerfile">algorithm</filename></entry>
4381debfc3dSmrg    <entry><function>__gnu_parallel::set_symmetric_difference</function></entry>
4391debfc3dSmrg    <entry><filename class="headerfile">parallel/algorithm</filename></entry>
4401debfc3dSmrg  </row>
4411debfc3dSmrg
4421debfc3dSmrg  <row>
4431debfc3dSmrg    <entry><function>std::set_difference</function></entry>
4441debfc3dSmrg    <entry><filename class="headerfile">algorithm</filename></entry>
4451debfc3dSmrg    <entry><function>__gnu_parallel::set_difference</function></entry>
4461debfc3dSmrg    <entry><filename class="headerfile">parallel/algorithm</filename></entry>
4471debfc3dSmrg  </row>
4481debfc3dSmrg
4491debfc3dSmrg  <row>
4501debfc3dSmrg    <entry><function>std::sort</function></entry>
4511debfc3dSmrg    <entry><filename class="headerfile">algorithm</filename></entry>
4521debfc3dSmrg    <entry><function>__gnu_parallel::sort</function></entry>
4531debfc3dSmrg    <entry><filename class="headerfile">parallel/algorithm</filename></entry>
4541debfc3dSmrg  </row>
4551debfc3dSmrg
4561debfc3dSmrg  <row>
4571debfc3dSmrg    <entry><function>std::stable_sort</function></entry>
4581debfc3dSmrg    <entry><filename class="headerfile">algorithm</filename></entry>
4591debfc3dSmrg    <entry><function>__gnu_parallel::stable_sort</function></entry>
4601debfc3dSmrg    <entry><filename class="headerfile">parallel/algorithm</filename></entry>
4611debfc3dSmrg  </row>
4621debfc3dSmrg
4631debfc3dSmrg  <row>
4641debfc3dSmrg    <entry><function>std::unique_copy</function></entry>
4651debfc3dSmrg    <entry><filename class="headerfile">algorithm</filename></entry>
4661debfc3dSmrg    <entry><function>__gnu_parallel::unique_copy</function></entry>
4671debfc3dSmrg    <entry><filename class="headerfile">parallel/algorithm</filename></entry>
4681debfc3dSmrg  </row>
4691debfc3dSmrg</tbody>
4701debfc3dSmrg</tgroup>
4711debfc3dSmrg</table>
4721debfc3dSmrg
4731debfc3dSmrg</section>
4741debfc3dSmrg
4751debfc3dSmrg</section>
4761debfc3dSmrg
4771debfc3dSmrg<section xml:id="manual.ext.parallel_mode.design" xreflabel="Design"><info><title>Design</title></info>
4781debfc3dSmrg<?dbhtml filename="parallel_mode_design.html"?>
4791debfc3dSmrg
4801debfc3dSmrg  <para>
4811debfc3dSmrg  </para>
4821debfc3dSmrg<section xml:id="parallel_mode.design.intro" xreflabel="Intro"><info><title>Interface Basics</title></info>
4831debfc3dSmrg
4841debfc3dSmrg
4851debfc3dSmrg<para>
4861debfc3dSmrgAll parallel algorithms are intended to have signatures that are
4871debfc3dSmrgequivalent to the ISO C++ algorithms replaced. For instance, the
4881debfc3dSmrg<function>std::adjacent_find</function> function is declared as:
4891debfc3dSmrg</para>
4901debfc3dSmrg<programlisting>
4911debfc3dSmrgnamespace std
4921debfc3dSmrg{
4931debfc3dSmrg  template&lt;typename _FIter&gt;
4941debfc3dSmrg    _FIter
4951debfc3dSmrg    adjacent_find(_FIter, _FIter);
4961debfc3dSmrg}
4971debfc3dSmrg</programlisting>
4981debfc3dSmrg
4991debfc3dSmrg<para>
5001debfc3dSmrgWhich means that there should be something equivalent for the parallel
5011debfc3dSmrgversion. Indeed, this is the case:
5021debfc3dSmrg</para>
5031debfc3dSmrg
5041debfc3dSmrg<programlisting>
5051debfc3dSmrgnamespace std
5061debfc3dSmrg{
5071debfc3dSmrg  namespace __parallel
5081debfc3dSmrg  {
5091debfc3dSmrg    template&lt;typename _FIter&gt;
5101debfc3dSmrg      _FIter
5111debfc3dSmrg      adjacent_find(_FIter, _FIter);
5121debfc3dSmrg
5131debfc3dSmrg    ...
5141debfc3dSmrg  }
5151debfc3dSmrg}
5161debfc3dSmrg</programlisting>
5171debfc3dSmrg
5181debfc3dSmrg<para>But.... why the ellipses?
5191debfc3dSmrg</para>
5201debfc3dSmrg
5211debfc3dSmrg<para> The ellipses in the example above represent additional overloads
5221debfc3dSmrgrequired for the parallel version of the function. These additional
5231debfc3dSmrgoverloads are used to dispatch calls from the ISO C++ function
5241debfc3dSmrgsignature to the appropriate parallel function (or sequential
5251debfc3dSmrgfunction, if no parallel functions are deemed worthy), based on either
5261debfc3dSmrgcompile-time or run-time conditions.
5271debfc3dSmrg</para>
5281debfc3dSmrg
5291debfc3dSmrg<para> The available signature options are specific for the different
5301debfc3dSmrgalgorithms/algorithm classes.</para>
5311debfc3dSmrg
5321debfc3dSmrg<para> The general view of overloads for the parallel algorithms look like this:
5331debfc3dSmrg</para>
5341debfc3dSmrg<itemizedlist>
5351debfc3dSmrg   <listitem><para>ISO C++ signature</para></listitem>
5361debfc3dSmrg   <listitem><para>ISO C++ signature + sequential_tag argument</para></listitem>
5371debfc3dSmrg   <listitem><para>ISO C++ signature + algorithm-specific tag type
5381debfc3dSmrg    (several signatures)</para></listitem>
5391debfc3dSmrg</itemizedlist>
5401debfc3dSmrg
5411debfc3dSmrg<para> Please note that the implementation may use additional functions
5421debfc3dSmrg(designated with the <code>_switch</code> suffix) to dispatch from the
5431debfc3dSmrgISO C++ signature to the correct parallel version. Also, some of the
5441debfc3dSmrgalgorithms do not have support for run-time conditions, so the last
5451debfc3dSmrgoverload is therefore missing.
5461debfc3dSmrg</para>
5471debfc3dSmrg
5481debfc3dSmrg
5491debfc3dSmrg</section>
5501debfc3dSmrg
5511debfc3dSmrg<section xml:id="parallel_mode.design.tuning" xreflabel="Tuning"><info><title>Configuration and Tuning</title></info>
5521debfc3dSmrg
5531debfc3dSmrg
5541debfc3dSmrg
5551debfc3dSmrg<section xml:id="parallel_mode.design.tuning.omp" xreflabel="OpenMP Environment"><info><title>Setting up the OpenMP Environment</title></info>
5561debfc3dSmrg
5571debfc3dSmrg
5581debfc3dSmrg<para>
5591debfc3dSmrgSeveral aspects of the overall runtime environment can be manipulated
5601debfc3dSmrgby standard OpenMP function calls.
5611debfc3dSmrg</para>
5621debfc3dSmrg
5631debfc3dSmrg<para>
5641debfc3dSmrgTo specify the number of threads to be used for the algorithms globally,
5651debfc3dSmrguse the function <function>omp_set_num_threads</function>. An example:
5661debfc3dSmrg</para>
5671debfc3dSmrg
5681debfc3dSmrg<programlisting>
5691debfc3dSmrg#include &lt;stdlib.h&gt;
5701debfc3dSmrg#include &lt;omp.h&gt;
5711debfc3dSmrg
5721debfc3dSmrgint main()
5731debfc3dSmrg{
5741debfc3dSmrg  // Explicitly set number of threads.
5751debfc3dSmrg  const int threads_wanted = 20;
5761debfc3dSmrg  omp_set_dynamic(false);
5771debfc3dSmrg  omp_set_num_threads(threads_wanted);
5781debfc3dSmrg
5791debfc3dSmrg  // Call parallel mode algorithms.
5801debfc3dSmrg
5811debfc3dSmrg  return 0;
5821debfc3dSmrg}
5831debfc3dSmrg</programlisting>
5841debfc3dSmrg
5851debfc3dSmrg<para>
5861debfc3dSmrg Some algorithms allow the number of threads being set for a particular call,
5871debfc3dSmrg by augmenting the algorithm variant.
5881debfc3dSmrg See the next section for further information.
5891debfc3dSmrg</para>
5901debfc3dSmrg
5911debfc3dSmrg<para>
5921debfc3dSmrgOther parts of the runtime environment able to be manipulated include
5931debfc3dSmrgnested parallelism (<function>omp_set_nested</function>), schedule kind
5941debfc3dSmrg(<function>omp_set_schedule</function>), and others. See the OpenMP
5951debfc3dSmrgdocumentation for more information.
5961debfc3dSmrg</para>
5971debfc3dSmrg
5981debfc3dSmrg</section>
5991debfc3dSmrg
6001debfc3dSmrg<section xml:id="parallel_mode.design.tuning.compile" xreflabel="Compile Switches"><info><title>Compile Time Switches</title></info>
6011debfc3dSmrg
6021debfc3dSmrg
6031debfc3dSmrg<para>
6041debfc3dSmrgTo force an algorithm to execute sequentially, even though parallelism
6051debfc3dSmrgis switched on in general via the macro <constant>_GLIBCXX_PARALLEL</constant>,
6061debfc3dSmrgadd <classname>__gnu_parallel::sequential_tag()</classname> to the end
6071debfc3dSmrgof the algorithm's argument list.
6081debfc3dSmrg</para>
6091debfc3dSmrg
6101debfc3dSmrg<para>
6111debfc3dSmrgLike so:
6121debfc3dSmrg</para>
6131debfc3dSmrg
6141debfc3dSmrg<programlisting>
6151debfc3dSmrgstd::sort(v.begin(), v.end(), __gnu_parallel::sequential_tag());
6161debfc3dSmrg</programlisting>
6171debfc3dSmrg
6181debfc3dSmrg<para>
6191debfc3dSmrgSome parallel algorithm variants can be excluded from compilation by
6201debfc3dSmrgpreprocessor defines. See the doxygen documentation on
6211debfc3dSmrg<code>compiletime_settings.h</code> and <code>features.h</code> for details.
6221debfc3dSmrg</para>
6231debfc3dSmrg
6241debfc3dSmrg<para>
6251debfc3dSmrgFor some algorithms, the desired variant can be chosen at compile-time by
6261debfc3dSmrgappending a tag object. The available options are specific to the particular
6271debfc3dSmrgalgorithm (class).
6281debfc3dSmrg</para>
6291debfc3dSmrg
6301debfc3dSmrg<para>
6311debfc3dSmrgFor the "embarrassingly parallel" algorithms, there is only one "tag object
6321debfc3dSmrgtype", the enum _Parallelism.
6331debfc3dSmrgIt takes one of the following values,
6341debfc3dSmrg<code>__gnu_parallel::parallel_tag</code>,
6351debfc3dSmrg<code>__gnu_parallel::balanced_tag</code>,
6361debfc3dSmrg<code>__gnu_parallel::unbalanced_tag</code>,
6371debfc3dSmrg<code>__gnu_parallel::omp_loop_tag</code>,
6381debfc3dSmrg<code>__gnu_parallel::omp_loop_static_tag</code>.
6391debfc3dSmrgThis means that the actual parallelization strategy is chosen at run-time.
6401debfc3dSmrg(Choosing the variants at compile-time will come soon.)
6411debfc3dSmrg</para>
6421debfc3dSmrg
6431debfc3dSmrg<para>
6441debfc3dSmrgFor the following algorithms in general, we have
6451debfc3dSmrg<code>__gnu_parallel::parallel_tag</code> and
6461debfc3dSmrg<code>__gnu_parallel::default_parallel_tag</code>, in addition to
6471debfc3dSmrg<code>__gnu_parallel::sequential_tag</code>.
6481debfc3dSmrg<code>__gnu_parallel::default_parallel_tag</code> chooses the default
6491debfc3dSmrgalgorithm at compiletime, as does omitting the tag.
6501debfc3dSmrg<code>__gnu_parallel::parallel_tag</code> postpones the decision to runtime
6511debfc3dSmrg(see next section).
6521debfc3dSmrgFor all tags, the number of threads desired for this call can optionally be
6531debfc3dSmrgpassed to the respective tag's constructor.
6541debfc3dSmrg</para>
6551debfc3dSmrg
6561debfc3dSmrg<para>
6571debfc3dSmrgThe <code>multiway_merge</code> algorithm comes with the additional choices,
6581debfc3dSmrg<code>__gnu_parallel::exact_tag</code> and
6591debfc3dSmrg<code>__gnu_parallel::sampling_tag</code>.
6601debfc3dSmrgExact and sampling are the two available splitting strategies.
6611debfc3dSmrg</para>
6621debfc3dSmrg
6631debfc3dSmrg<para>
6641debfc3dSmrgFor the <code>sort</code> and <code>stable_sort</code> algorithms, there are
6651debfc3dSmrgseveral additional choices, namely
6661debfc3dSmrg<code>__gnu_parallel::multiway_mergesort_tag</code>,
6671debfc3dSmrg<code>__gnu_parallel::multiway_mergesort_exact_tag</code>,
6681debfc3dSmrg<code>__gnu_parallel::multiway_mergesort_sampling_tag</code>,
6691debfc3dSmrg<code>__gnu_parallel::quicksort_tag</code>, and
6701debfc3dSmrg<code>__gnu_parallel::balanced_quicksort_tag</code>.
6711debfc3dSmrgMultiway mergesort comes with the two splitting strategies for multi-way
6721debfc3dSmrgmerging. The quicksort options cannot be used for <code>stable_sort</code>.
6731debfc3dSmrg</para>
6741debfc3dSmrg
6751debfc3dSmrg</section>
6761debfc3dSmrg
6771debfc3dSmrg<section xml:id="parallel_mode.design.tuning.settings" xreflabel="_Settings"><info><title>Run Time Settings and Defaults</title></info>
6781debfc3dSmrg
6791debfc3dSmrg
6801debfc3dSmrg<para>
6811debfc3dSmrgThe default parallelization strategy, the choice of specific algorithm
6821debfc3dSmrgstrategy, the minimum threshold limits for individual parallel
6831debfc3dSmrgalgorithms, and aspects of the underlying hardware can be specified as
6841debfc3dSmrgdesired via manipulation
6851debfc3dSmrgof <classname>__gnu_parallel::_Settings</classname> member data.
6861debfc3dSmrg</para>
6871debfc3dSmrg
6881debfc3dSmrg<para>
6891debfc3dSmrgFirst off, the choice of parallelization strategy: serial, parallel,
6901debfc3dSmrgor heuristically deduced. This corresponds
6911debfc3dSmrgto <code>__gnu_parallel::_Settings::algorithm_strategy</code> and is a
6921debfc3dSmrgvalue of enum <type>__gnu_parallel::_AlgorithmStrategy</type>
6931debfc3dSmrgtype. Choices
6941debfc3dSmrginclude: <type>heuristic</type>, <type>force_sequential</type>,
6951debfc3dSmrgand <type>force_parallel</type>. The default is <type>heuristic</type>.
6961debfc3dSmrg</para>
6971debfc3dSmrg
6981debfc3dSmrg
6991debfc3dSmrg<para>
7001debfc3dSmrgNext, the sub-choices for algorithm variant, if not fixed at compile-time.
7011debfc3dSmrgSpecific algorithms like <function>find</function> or <function>sort</function>
7021debfc3dSmrgcan be implemented in multiple ways: when this is the case,
7031debfc3dSmrga <classname>__gnu_parallel::_Settings</classname> member exists to
7041debfc3dSmrgpick the default strategy. For
7051debfc3dSmrgexample, <code>__gnu_parallel::_Settings::sort_algorithm</code> can
7061debfc3dSmrghave any values of
7071debfc3dSmrgenum <type>__gnu_parallel::_SortAlgorithm</type>: <type>MWMS</type>, <type>QS</type>,
7081debfc3dSmrgor <type>QS_BALANCED</type>.
7091debfc3dSmrg</para>
7101debfc3dSmrg
7111debfc3dSmrg<para>
7121debfc3dSmrgLikewise for setting the minimal threshold for algorithm
7131debfc3dSmrgparallelization.  Parallelism always incurs some overhead. Thus, it is
7141debfc3dSmrgnot helpful to parallelize operations on very small sets of
7151debfc3dSmrgdata. Because of this, measures are taken to avoid parallelizing below
7161debfc3dSmrga certain, pre-determined threshold. For each algorithm, a minimum
7171debfc3dSmrgproblem size is encoded as a variable in the
7181debfc3dSmrgactive <classname>__gnu_parallel::_Settings</classname> object.  This
7191debfc3dSmrgthreshold variable follows the following naming scheme:
7201debfc3dSmrg<code>__gnu_parallel::_Settings::[algorithm]_minimal_n</code>.  So,
7211debfc3dSmrgfor <function>fill</function>, the threshold variable
7221debfc3dSmrgis <code>__gnu_parallel::_Settings::fill_minimal_n</code>,
7231debfc3dSmrg</para>
7241debfc3dSmrg
7251debfc3dSmrg<para>
7261debfc3dSmrgFinally, hardware details like L1/L2 cache size can be hardwired
7271debfc3dSmrgvia <code>__gnu_parallel::_Settings::L1_cache_size</code> and friends.
7281debfc3dSmrg</para>
7291debfc3dSmrg
7301debfc3dSmrg<para>
7311debfc3dSmrg</para>
7321debfc3dSmrg
7331debfc3dSmrg<para>
7341debfc3dSmrgAll these configuration variables can be changed by the user, if
7351debfc3dSmrgdesired.
7361debfc3dSmrgThere exists one global instance of the class <classname>_Settings</classname>,
7371debfc3dSmrgi. e. it is a singleton. It can be read and written by calling
7381debfc3dSmrg<code>__gnu_parallel::_Settings::get</code> and
7391debfc3dSmrg<code>__gnu_parallel::_Settings::set</code>, respectively.
7401debfc3dSmrgPlease note that the first call return a const object, so direct manipulation
7411debfc3dSmrgis forbidden.
742c0a68be4SmrgSee <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://gcc.gnu.org/onlinedocs/libstdc++/latest-doxygen/index.html">
743c0a68be4Smrg  <filename class="headerfile">&lt;parallel/settings.h&gt;</filename></link>
7441debfc3dSmrgfor complete details.
7451debfc3dSmrg</para>
7461debfc3dSmrg
7471debfc3dSmrg<para>
7481debfc3dSmrgA small example of tuning the default:
7491debfc3dSmrg</para>
7501debfc3dSmrg
7511debfc3dSmrg<programlisting>
7521debfc3dSmrg#include &lt;parallel/algorithm&gt;
7531debfc3dSmrg#include &lt;parallel/settings.h&gt;
7541debfc3dSmrg
7551debfc3dSmrgint main()
7561debfc3dSmrg{
7571debfc3dSmrg  __gnu_parallel::_Settings s;
7581debfc3dSmrg  s.algorithm_strategy = __gnu_parallel::force_parallel;
7591debfc3dSmrg  __gnu_parallel::_Settings::set(s);
7601debfc3dSmrg
7611debfc3dSmrg  // Do work... all algorithms will be parallelized, always.
7621debfc3dSmrg
7631debfc3dSmrg  return 0;
7641debfc3dSmrg}
7651debfc3dSmrg</programlisting>
7661debfc3dSmrg
7671debfc3dSmrg</section>
7681debfc3dSmrg
7691debfc3dSmrg</section>
7701debfc3dSmrg
7711debfc3dSmrg<section xml:id="parallel_mode.design.impl" xreflabel="Impl"><info><title>Implementation Namespaces</title></info>
7721debfc3dSmrg
7731debfc3dSmrg
7741debfc3dSmrg<para> One namespace contain versions of code that are always
7751debfc3dSmrgexplicitly sequential:
7761debfc3dSmrg<code>__gnu_serial</code>.
7771debfc3dSmrg</para>
7781debfc3dSmrg
7791debfc3dSmrg<para> Two namespaces contain the parallel mode:
7801debfc3dSmrg<code>std::__parallel</code> and <code>__gnu_parallel</code>.
7811debfc3dSmrg</para>
7821debfc3dSmrg
7831debfc3dSmrg<para> Parallel implementations of standard components, including
7841debfc3dSmrgtemplate helpers to select parallelism, are defined in <code>namespace
7851debfc3dSmrgstd::__parallel</code>. For instance, <function>std::transform</function> from <filename class="headerfile">algorithm</filename> has a parallel counterpart in
7861debfc3dSmrg<function>std::__parallel::transform</function> from <filename class="headerfile">parallel/algorithm</filename>. In addition, these parallel
7871debfc3dSmrgimplementations are injected into <code>namespace
7881debfc3dSmrg__gnu_parallel</code> with using declarations.
7891debfc3dSmrg</para>
7901debfc3dSmrg
7911debfc3dSmrg<para> Support and general infrastructure is in <code>namespace
7921debfc3dSmrg__gnu_parallel</code>.
7931debfc3dSmrg</para>
7941debfc3dSmrg
7951debfc3dSmrg<para> More information, and an organized index of types and functions
7961debfc3dSmrgrelated to the parallel mode on a per-namespace basis, can be found in
7971debfc3dSmrgthe generated source documentation.
7981debfc3dSmrg</para>
7991debfc3dSmrg
8001debfc3dSmrg</section>
8011debfc3dSmrg
8021debfc3dSmrg</section>
8031debfc3dSmrg
8041debfc3dSmrg<section xml:id="manual.ext.parallel_mode.test" xreflabel="Testing"><info><title>Testing</title></info>
8051debfc3dSmrg<?dbhtml filename="parallel_mode_test.html"?>
8061debfc3dSmrg
8071debfc3dSmrg
8081debfc3dSmrg  <para>
8091debfc3dSmrg    Both the normal conformance and regression tests and the
8101debfc3dSmrg    supplemental performance tests work.
8111debfc3dSmrg  </para>
8121debfc3dSmrg
8131debfc3dSmrg  <para>
8141debfc3dSmrg    To run the conformance and regression tests with the parallel mode
8151debfc3dSmrg    active,
8161debfc3dSmrg  </para>
8171debfc3dSmrg
8181debfc3dSmrg  <screen>
8191debfc3dSmrg  <userinput>make check-parallel</userinput>
8201debfc3dSmrg  </screen>
8211debfc3dSmrg
8221debfc3dSmrg  <para>
8231debfc3dSmrg    The log and summary files for conformance testing are in the
8241debfc3dSmrg    <filename class="directory">testsuite/parallel</filename> directory.
8251debfc3dSmrg  </para>
8261debfc3dSmrg
8271debfc3dSmrg  <para>
8281debfc3dSmrg    To run the performance tests with the parallel mode active,
8291debfc3dSmrg  </para>
8301debfc3dSmrg
8311debfc3dSmrg  <screen>
8321debfc3dSmrg  <userinput>make check-performance-parallel</userinput>
8331debfc3dSmrg  </screen>
8341debfc3dSmrg
8351debfc3dSmrg  <para>
8361debfc3dSmrg    The result file for performance testing are in the
8371debfc3dSmrg    <filename class="directory">testsuite</filename> directory, in the file
8381debfc3dSmrg    <filename>libstdc++_performance.sum</filename>. In addition, the
8391debfc3dSmrg    policy-based containers have their own visualizations, which have
8401debfc3dSmrg    additional software dependencies than the usual bare-boned text
8411debfc3dSmrg    file, and can be generated by using the <code>make
8421debfc3dSmrg    doc-performance</code> rule in the testsuite's Makefile.
8431debfc3dSmrg</para>
8441debfc3dSmrg</section>
8451debfc3dSmrg
8461debfc3dSmrg<bibliography xml:id="parallel_mode.biblio"><info><title>Bibliography</title></info>
8471debfc3dSmrg
8481debfc3dSmrg
8491debfc3dSmrg  <biblioentry>
8501debfc3dSmrg    <citetitle>
8511debfc3dSmrg      Parallelization of Bulk Operations for STL Dictionaries
8521debfc3dSmrg    </citetitle>
8531debfc3dSmrg
8541debfc3dSmrg    <author><personname><firstname>Johannes</firstname><surname>Singler</surname></personname></author>
8551debfc3dSmrg    <author><personname><firstname>Leonor</firstname><surname>Frias</surname></personname></author>
8561debfc3dSmrg
8571debfc3dSmrg    <copyright>
8581debfc3dSmrg      <year>2007</year>
8591debfc3dSmrg      <holder/>
8601debfc3dSmrg    </copyright>
8611debfc3dSmrg
8621debfc3dSmrg    <publisher>
8631debfc3dSmrg      <publishername>
8641debfc3dSmrg	Workshop on Highly Parallel Processing on a Chip (HPPC) 2007. (LNCS)
8651debfc3dSmrg      </publishername>
8661debfc3dSmrg    </publisher>
8671debfc3dSmrg  </biblioentry>
8681debfc3dSmrg
8691debfc3dSmrg  <biblioentry>
8701debfc3dSmrg    <citetitle>
8711debfc3dSmrg      The Multi-Core Standard Template Library
8721debfc3dSmrg    </citetitle>
8731debfc3dSmrg
8741debfc3dSmrg    <author><personname><firstname>Johannes</firstname><surname>Singler</surname></personname></author>
8751debfc3dSmrg    <author><personname><firstname>Peter</firstname><surname>Sanders</surname></personname></author>
8761debfc3dSmrg    <author><personname><firstname>Felix</firstname><surname>Putze</surname></personname></author>
8771debfc3dSmrg
8781debfc3dSmrg    <copyright>
8791debfc3dSmrg      <year>2007</year>
8801debfc3dSmrg      <holder/>
8811debfc3dSmrg    </copyright>
8821debfc3dSmrg
8831debfc3dSmrg    <publisher>
8841debfc3dSmrg      <publishername>
8851debfc3dSmrg	 Euro-Par 2007: Parallel Processing. (LNCS 4641)
8861debfc3dSmrg      </publishername>
8871debfc3dSmrg    </publisher>
8881debfc3dSmrg  </biblioentry>
8891debfc3dSmrg
8901debfc3dSmrg</bibliography>
8911debfc3dSmrg
8921debfc3dSmrg</chapter>
893