xref: /dflybsd-src/contrib/gcc-8.0/libstdc++-v3/include/parallel/sort.h (revision 38fd149817dfbff97799f62fcb70be98c4e32523)
1*38fd1498Szrj // -*- C++ -*-
2*38fd1498Szrj 
3*38fd1498Szrj // Copyright (C) 2007-2018 Free Software Foundation, Inc.
4*38fd1498Szrj //
5*38fd1498Szrj // This file is part of the GNU ISO C++ Library.  This library is free
6*38fd1498Szrj // software; you can redistribute it and/or modify it under the terms
7*38fd1498Szrj // of the GNU General Public License as published by the Free Software
8*38fd1498Szrj // Foundation; either version 3, or (at your option) any later
9*38fd1498Szrj // version.
10*38fd1498Szrj 
11*38fd1498Szrj // This library is distributed in the hope that it will be useful, but
12*38fd1498Szrj // WITHOUT ANY WARRANTY; without even the implied warranty of
13*38fd1498Szrj // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14*38fd1498Szrj // General Public License for more details.
15*38fd1498Szrj 
16*38fd1498Szrj // Under Section 7 of GPL version 3, you are granted additional
17*38fd1498Szrj // permissions described in the GCC Runtime Library Exception, version
18*38fd1498Szrj // 3.1, as published by the Free Software Foundation.
19*38fd1498Szrj 
20*38fd1498Szrj // You should have received a copy of the GNU General Public License and
21*38fd1498Szrj // a copy of the GCC Runtime Library Exception along with this program;
22*38fd1498Szrj // see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
23*38fd1498Szrj // <http://www.gnu.org/licenses/>.
24*38fd1498Szrj 
25*38fd1498Szrj /** @file parallel/sort.h
26*38fd1498Szrj  *  @brief Parallel sorting algorithm switch.
27*38fd1498Szrj  *  This file is a GNU parallel extension to the Standard C++ Library.
28*38fd1498Szrj  */
29*38fd1498Szrj 
30*38fd1498Szrj // Written by Johannes Singler.
31*38fd1498Szrj 
32*38fd1498Szrj #ifndef _GLIBCXX_PARALLEL_SORT_H
33*38fd1498Szrj #define _GLIBCXX_PARALLEL_SORT_H 1
34*38fd1498Szrj 
35*38fd1498Szrj #include <parallel/basic_iterator.h>
36*38fd1498Szrj #include <parallel/features.h>
37*38fd1498Szrj #include <parallel/parallel.h>
38*38fd1498Szrj 
39*38fd1498Szrj #if _GLIBCXX_PARALLEL_ASSERTIONS
40*38fd1498Szrj #include <parallel/checkers.h>
41*38fd1498Szrj #endif
42*38fd1498Szrj 
43*38fd1498Szrj #if _GLIBCXX_MERGESORT
44*38fd1498Szrj #include <parallel/multiway_mergesort.h>
45*38fd1498Szrj #endif
46*38fd1498Szrj 
47*38fd1498Szrj #if _GLIBCXX_QUICKSORT
48*38fd1498Szrj #include <parallel/quicksort.h>
49*38fd1498Szrj #endif
50*38fd1498Szrj 
51*38fd1498Szrj #if _GLIBCXX_BAL_QUICKSORT
52*38fd1498Szrj #include <parallel/balanced_quicksort.h>
53*38fd1498Szrj #endif
54*38fd1498Szrj 
55*38fd1498Szrj namespace __gnu_parallel
56*38fd1498Szrj {
57*38fd1498Szrj   //prototype
58*38fd1498Szrj   template<bool __stable, typename _RAIter,
59*38fd1498Szrj            typename _Compare, typename _Parallelism>
60*38fd1498Szrj     void
61*38fd1498Szrj     __parallel_sort(_RAIter __begin, _RAIter __end,
62*38fd1498Szrj 		    _Compare __comp, _Parallelism __parallelism);
63*38fd1498Szrj 
64*38fd1498Szrj   /**
65*38fd1498Szrj    *  @brief Choose multiway mergesort, splitting variant at run-time,
66*38fd1498Szrj    *  for parallel sorting.
67*38fd1498Szrj    *  @param __begin Begin iterator of input sequence.
68*38fd1498Szrj    *  @param __end End iterator of input sequence.
69*38fd1498Szrj    *  @param __comp Comparator.
70*38fd1498Szrj    *  @tparam __stable Sort stable.
71*38fd1498Szrj    *  @callgraph
72*38fd1498Szrj    */
73*38fd1498Szrj   template<bool __stable, typename _RAIter, typename _Compare>
74*38fd1498Szrj     inline void
__parallel_sort(_RAIter __begin,_RAIter __end,_Compare __comp,multiway_mergesort_tag __parallelism)75*38fd1498Szrj     __parallel_sort(_RAIter __begin, _RAIter __end,
76*38fd1498Szrj 		    _Compare __comp, multiway_mergesort_tag __parallelism)
77*38fd1498Szrj     {
78*38fd1498Szrj       _GLIBCXX_CALL(__end - __begin)
79*38fd1498Szrj 
80*38fd1498Szrj       if(_Settings::get().sort_splitting == EXACT)
81*38fd1498Szrj 	parallel_sort_mwms<__stable, true>
82*38fd1498Szrj 	  (__begin, __end, __comp, __parallelism.__get_num_threads());
83*38fd1498Szrj       else
84*38fd1498Szrj 	parallel_sort_mwms<__stable, false>
85*38fd1498Szrj 	  (__begin, __end, __comp, __parallelism.__get_num_threads());
86*38fd1498Szrj     }
87*38fd1498Szrj 
88*38fd1498Szrj   /**
89*38fd1498Szrj    *  @brief Choose multiway mergesort with exact splitting,
90*38fd1498Szrj    *  for parallel sorting.
91*38fd1498Szrj    *  @param __begin Begin iterator of input sequence.
92*38fd1498Szrj    *  @param __end End iterator of input sequence.
93*38fd1498Szrj    *  @param __comp Comparator.
94*38fd1498Szrj    *  @tparam __stable Sort stable.
95*38fd1498Szrj    *  @callgraph
96*38fd1498Szrj    */
97*38fd1498Szrj   template<bool __stable, typename _RAIter, typename _Compare>
98*38fd1498Szrj     inline void
__parallel_sort(_RAIter __begin,_RAIter __end,_Compare __comp,multiway_mergesort_exact_tag __parallelism)99*38fd1498Szrj     __parallel_sort(_RAIter __begin, _RAIter __end,
100*38fd1498Szrj 		    _Compare __comp,
101*38fd1498Szrj 		    multiway_mergesort_exact_tag __parallelism)
102*38fd1498Szrj     {
103*38fd1498Szrj       _GLIBCXX_CALL(__end - __begin)
104*38fd1498Szrj 
105*38fd1498Szrj       parallel_sort_mwms<__stable, true>
106*38fd1498Szrj         (__begin, __end, __comp, __parallelism.__get_num_threads());
107*38fd1498Szrj     }
108*38fd1498Szrj 
109*38fd1498Szrj   /**
110*38fd1498Szrj    *  @brief Choose multiway mergesort with splitting by sampling,
111*38fd1498Szrj    *  for parallel sorting.
112*38fd1498Szrj    *  @param __begin Begin iterator of input sequence.
113*38fd1498Szrj    *  @param __end End iterator of input sequence.
114*38fd1498Szrj    *  @param __comp Comparator.
115*38fd1498Szrj    *  @tparam __stable Sort stable.
116*38fd1498Szrj    *  @callgraph
117*38fd1498Szrj    */
118*38fd1498Szrj   template<bool __stable, typename _RAIter, typename _Compare>
119*38fd1498Szrj     inline void
__parallel_sort(_RAIter __begin,_RAIter __end,_Compare __comp,multiway_mergesort_sampling_tag __parallelism)120*38fd1498Szrj     __parallel_sort(_RAIter __begin, _RAIter __end,
121*38fd1498Szrj 		    _Compare __comp,
122*38fd1498Szrj 		    multiway_mergesort_sampling_tag __parallelism)
123*38fd1498Szrj     {
124*38fd1498Szrj       _GLIBCXX_CALL(__end - __begin)
125*38fd1498Szrj 
126*38fd1498Szrj       parallel_sort_mwms<__stable, false>
127*38fd1498Szrj       (__begin, __end, __comp, __parallelism.__get_num_threads());
128*38fd1498Szrj     }
129*38fd1498Szrj 
130*38fd1498Szrj   /**
131*38fd1498Szrj    *  @brief Choose quicksort for parallel sorting.
132*38fd1498Szrj    *  @param __begin Begin iterator of input sequence.
133*38fd1498Szrj    *  @param __end End iterator of input sequence.
134*38fd1498Szrj    *  @param __comp Comparator.
135*38fd1498Szrj    *  @tparam __stable Sort stable.
136*38fd1498Szrj    *  @callgraph
137*38fd1498Szrj    */
138*38fd1498Szrj   template<bool __stable, typename _RAIter, typename _Compare>
139*38fd1498Szrj     inline void
__parallel_sort(_RAIter __begin,_RAIter __end,_Compare __comp,quicksort_tag __parallelism)140*38fd1498Szrj     __parallel_sort(_RAIter __begin, _RAIter __end,
141*38fd1498Szrj 		    _Compare __comp, quicksort_tag __parallelism)
142*38fd1498Szrj     {
143*38fd1498Szrj       _GLIBCXX_CALL(__end - __begin)
144*38fd1498Szrj 
145*38fd1498Szrj       _GLIBCXX_PARALLEL_ASSERT(__stable == false);
146*38fd1498Szrj 
147*38fd1498Szrj       __parallel_sort_qs(__begin, __end, __comp,
148*38fd1498Szrj 			 __parallelism.__get_num_threads());
149*38fd1498Szrj     }
150*38fd1498Szrj 
151*38fd1498Szrj   /**
152*38fd1498Szrj    *  @brief Choose balanced quicksort for parallel sorting.
153*38fd1498Szrj    *  @param __begin Begin iterator of input sequence.
154*38fd1498Szrj    *  @param __end End iterator of input sequence.
155*38fd1498Szrj    *  @param __comp Comparator.
156*38fd1498Szrj    *  @tparam __stable Sort stable.
157*38fd1498Szrj    *  @callgraph
158*38fd1498Szrj    */
159*38fd1498Szrj    template<bool __stable, typename _RAIter, typename _Compare>
160*38fd1498Szrj      inline void
__parallel_sort(_RAIter __begin,_RAIter __end,_Compare __comp,balanced_quicksort_tag __parallelism)161*38fd1498Szrj      __parallel_sort(_RAIter __begin, _RAIter __end,
162*38fd1498Szrj 		     _Compare __comp, balanced_quicksort_tag __parallelism)
163*38fd1498Szrj      {
164*38fd1498Szrj        _GLIBCXX_CALL(__end - __begin)
165*38fd1498Szrj 
166*38fd1498Szrj        _GLIBCXX_PARALLEL_ASSERT(__stable == false);
167*38fd1498Szrj 
168*38fd1498Szrj        __parallel_sort_qsb(__begin, __end, __comp,
169*38fd1498Szrj 			   __parallelism.__get_num_threads());
170*38fd1498Szrj      }
171*38fd1498Szrj 
172*38fd1498Szrj   /**
173*38fd1498Szrj    *  @brief Choose multiway mergesort with exact splitting,
174*38fd1498Szrj    *  for parallel sorting.
175*38fd1498Szrj    *  @param __begin Begin iterator of input sequence.
176*38fd1498Szrj    *  @param __end End iterator of input sequence.
177*38fd1498Szrj    *  @param __comp Comparator.
178*38fd1498Szrj    *  @tparam __stable Sort stable.
179*38fd1498Szrj    *  @callgraph
180*38fd1498Szrj    */
181*38fd1498Szrj   template<bool __stable, typename _RAIter, typename _Compare>
182*38fd1498Szrj     inline void
__parallel_sort(_RAIter __begin,_RAIter __end,_Compare __comp,default_parallel_tag __parallelism)183*38fd1498Szrj     __parallel_sort(_RAIter __begin, _RAIter __end,
184*38fd1498Szrj 		    _Compare __comp, default_parallel_tag __parallelism)
185*38fd1498Szrj     {
186*38fd1498Szrj       _GLIBCXX_CALL(__end - __begin)
187*38fd1498Szrj 
188*38fd1498Szrj       __parallel_sort<__stable>
189*38fd1498Szrj 	(__begin, __end, __comp,
190*38fd1498Szrj 	 multiway_mergesort_exact_tag(__parallelism.__get_num_threads()));
191*38fd1498Szrj     }
192*38fd1498Szrj 
193*38fd1498Szrj   /**
194*38fd1498Szrj    *  @brief Choose a parallel sorting algorithm.
195*38fd1498Szrj    *  @param __begin Begin iterator of input sequence.
196*38fd1498Szrj    *  @param __end End iterator of input sequence.
197*38fd1498Szrj    *  @param __comp Comparator.
198*38fd1498Szrj    *  @tparam __stable Sort stable.
199*38fd1498Szrj    *  @callgraph
200*38fd1498Szrj    */
201*38fd1498Szrj   template<bool __stable, typename _RAIter, typename _Compare>
202*38fd1498Szrj     inline void
__parallel_sort(_RAIter __begin,_RAIter __end,_Compare __comp,parallel_tag __parallelism)203*38fd1498Szrj     __parallel_sort(_RAIter __begin, _RAIter __end,
204*38fd1498Szrj 		    _Compare __comp, parallel_tag __parallelism)
205*38fd1498Szrj     {
206*38fd1498Szrj       _GLIBCXX_CALL(__end - __begin)
207*38fd1498Szrj       typedef std::iterator_traits<_RAIter> _TraitsType;
208*38fd1498Szrj       typedef typename _TraitsType::value_type _ValueType;
209*38fd1498Szrj       typedef typename _TraitsType::difference_type _DifferenceType;
210*38fd1498Szrj 
211*38fd1498Szrj       if (false) ;
212*38fd1498Szrj #if _GLIBCXX_MERGESORT
213*38fd1498Szrj       else if (__stable || _Settings::get().sort_algorithm == MWMS)
214*38fd1498Szrj         {
215*38fd1498Szrj           if(_Settings::get().sort_splitting == EXACT)
216*38fd1498Szrj             parallel_sort_mwms<__stable, true>
217*38fd1498Szrj               (__begin, __end, __comp, __parallelism.__get_num_threads());
218*38fd1498Szrj           else
219*38fd1498Szrj             parallel_sort_mwms<false, false>
220*38fd1498Szrj               (__begin, __end, __comp, __parallelism.__get_num_threads());
221*38fd1498Szrj         }
222*38fd1498Szrj #endif
223*38fd1498Szrj #if _GLIBCXX_QUICKSORT
224*38fd1498Szrj       else if (_Settings::get().sort_algorithm == QS)
225*38fd1498Szrj         __parallel_sort_qs(__begin, __end, __comp,
226*38fd1498Szrj                            __parallelism.__get_num_threads());
227*38fd1498Szrj #endif
228*38fd1498Szrj #if _GLIBCXX_BAL_QUICKSORT
229*38fd1498Szrj       else if (_Settings::get().sort_algorithm == QS_BALANCED)
230*38fd1498Szrj         __parallel_sort_qsb(__begin, __end, __comp,
231*38fd1498Szrj                             __parallelism.__get_num_threads());
232*38fd1498Szrj #endif
233*38fd1498Szrj       else
234*38fd1498Szrj         __gnu_sequential::sort(__begin, __end, __comp);
235*38fd1498Szrj     }
236*38fd1498Szrj } // end namespace __gnu_parallel
237*38fd1498Szrj 
238*38fd1498Szrj #endif /* _GLIBCXX_PARALLEL_SORT_H */
239