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