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 <vector> 1861debfc3dSmrg#include <parallel/algorithm> 1871debfc3dSmrg 1881debfc3dSmrgint main() 1891debfc3dSmrg{ 1901debfc3dSmrg std::vector<int> 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<typename _FIter> 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<typename _FIter> 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 <stdlib.h> 5701debfc3dSmrg#include <omp.h> 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"><parallel/settings.h></filename></link> 7441debfc3dSmrgfor complete details. 7451debfc3dSmrg</para> 7461debfc3dSmrg 7471debfc3dSmrg<para> 7481debfc3dSmrgA small example of tuning the default: 7491debfc3dSmrg</para> 7501debfc3dSmrg 7511debfc3dSmrg<programlisting> 7521debfc3dSmrg#include <parallel/algorithm> 7531debfc3dSmrg#include <parallel/settings.h> 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