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 /**
26*38fd1498Szrj  * @file parallel/tags.h
27*38fd1498Szrj  * @brief Tags for compile-time selection.
28*38fd1498Szrj  *  This file is a GNU parallel extension to the Standard C++ Library.
29*38fd1498Szrj  */
30*38fd1498Szrj 
31*38fd1498Szrj // Written by Johannes Singler and Felix Putze.
32*38fd1498Szrj 
33*38fd1498Szrj #ifndef _GLIBCXX_PARALLEL_TAGS_H
34*38fd1498Szrj #define _GLIBCXX_PARALLEL_TAGS_H 1
35*38fd1498Szrj 
36*38fd1498Szrj #include <omp.h>
37*38fd1498Szrj #include <parallel/types.h>
38*38fd1498Szrj 
39*38fd1498Szrj namespace __gnu_parallel
40*38fd1498Szrj {
41*38fd1498Szrj   /** @brief Forces sequential execution at compile time. */
42*38fd1498Szrj   struct sequential_tag { };
43*38fd1498Szrj 
44*38fd1498Szrj   /** @brief Recommends parallel execution at compile time,
45*38fd1498Szrj    *  optionally using a user-specified number of threads. */
46*38fd1498Szrj   struct parallel_tag
47*38fd1498Szrj   {
48*38fd1498Szrj     private:
49*38fd1498Szrj       _ThreadIndex _M_num_threads;
50*38fd1498Szrj 
51*38fd1498Szrj     public:
52*38fd1498Szrj       /** @brief Default constructor. Use default number of threads. */
parallel_tagparallel_tag53*38fd1498Szrj       parallel_tag()
54*38fd1498Szrj       { _M_num_threads = 0; }
55*38fd1498Szrj 
56*38fd1498Szrj       /** @brief Default constructor. Recommend number of threads to use.
57*38fd1498Szrj        *  @param __num_threads Desired number of threads. */
parallel_tagparallel_tag58*38fd1498Szrj       parallel_tag(_ThreadIndex __num_threads)
59*38fd1498Szrj       { _M_num_threads = __num_threads; }
60*38fd1498Szrj 
61*38fd1498Szrj       /** @brief Find out desired number of threads.
62*38fd1498Szrj        *  @return Desired number of threads. */
__get_num_threadsparallel_tag63*38fd1498Szrj       _ThreadIndex __get_num_threads()
64*38fd1498Szrj       {
65*38fd1498Szrj         if(_M_num_threads == 0)
66*38fd1498Szrj           return omp_get_max_threads();
67*38fd1498Szrj         else
68*38fd1498Szrj           return _M_num_threads;
69*38fd1498Szrj       }
70*38fd1498Szrj 
71*38fd1498Szrj       /** @brief Set the desired number of threads.
72*38fd1498Szrj        *  @param __num_threads Desired number of threads. */
set_num_threadsparallel_tag73*38fd1498Szrj       void set_num_threads(_ThreadIndex __num_threads)
74*38fd1498Szrj       { _M_num_threads = __num_threads; }
75*38fd1498Szrj   };
76*38fd1498Szrj 
77*38fd1498Szrj   /** @brief Recommends parallel execution using the
78*38fd1498Szrj       default parallel algorithm. */
79*38fd1498Szrj   struct default_parallel_tag : public parallel_tag
80*38fd1498Szrj   {
default_parallel_tagdefault_parallel_tag81*38fd1498Szrj     default_parallel_tag() { }
default_parallel_tagdefault_parallel_tag82*38fd1498Szrj     default_parallel_tag(_ThreadIndex __num_threads)
83*38fd1498Szrj     : parallel_tag(__num_threads) { }
84*38fd1498Szrj   };
85*38fd1498Szrj 
86*38fd1498Szrj   /** @brief Recommends parallel execution using dynamic
87*38fd1498Szrj       load-balancing at compile time. */
88*38fd1498Szrj   struct balanced_tag : public parallel_tag { };
89*38fd1498Szrj 
90*38fd1498Szrj   /** @brief Recommends parallel execution using static
91*38fd1498Szrj       load-balancing at compile time. */
92*38fd1498Szrj   struct unbalanced_tag : public parallel_tag { };
93*38fd1498Szrj 
94*38fd1498Szrj   /** @brief Recommends parallel execution using OpenMP dynamic
95*38fd1498Szrj       load-balancing at compile time. */
96*38fd1498Szrj   struct omp_loop_tag : public parallel_tag { };
97*38fd1498Szrj 
98*38fd1498Szrj   /** @brief Recommends parallel execution using OpenMP static
99*38fd1498Szrj       load-balancing at compile time. */
100*38fd1498Szrj   struct omp_loop_static_tag : public parallel_tag { };
101*38fd1498Szrj 
102*38fd1498Szrj 
103*38fd1498Szrj   /** @brief Base class for for std::find() variants. */
104*38fd1498Szrj   struct find_tag { };
105*38fd1498Szrj 
106*38fd1498Szrj 
107*38fd1498Szrj   /** @brief Forces parallel merging
108*38fd1498Szrj    *  with exact splitting, at compile time. */
109*38fd1498Szrj   struct exact_tag : public parallel_tag
110*38fd1498Szrj   {
exact_tagexact_tag111*38fd1498Szrj     exact_tag() { }
exact_tagexact_tag112*38fd1498Szrj     exact_tag(_ThreadIndex __num_threads)
113*38fd1498Szrj     : parallel_tag(__num_threads) { }
114*38fd1498Szrj   };
115*38fd1498Szrj 
116*38fd1498Szrj   /** @brief Forces parallel merging
117*38fd1498Szrj    *  with exact splitting, at compile time. */
118*38fd1498Szrj   struct sampling_tag : public parallel_tag
119*38fd1498Szrj   {
sampling_tagsampling_tag120*38fd1498Szrj     sampling_tag() { }
sampling_tagsampling_tag121*38fd1498Szrj     sampling_tag(_ThreadIndex __num_threads)
122*38fd1498Szrj     : parallel_tag(__num_threads) { }
123*38fd1498Szrj   };
124*38fd1498Szrj 
125*38fd1498Szrj 
126*38fd1498Szrj   /** @brief Forces parallel sorting using multiway mergesort
127*38fd1498Szrj    *  at compile time. */
128*38fd1498Szrj   struct multiway_mergesort_tag : public parallel_tag
129*38fd1498Szrj   {
multiway_mergesort_tagmultiway_mergesort_tag130*38fd1498Szrj     multiway_mergesort_tag() { }
multiway_mergesort_tagmultiway_mergesort_tag131*38fd1498Szrj     multiway_mergesort_tag(_ThreadIndex __num_threads)
132*38fd1498Szrj     : parallel_tag(__num_threads) { }
133*38fd1498Szrj   };
134*38fd1498Szrj 
135*38fd1498Szrj   /** @brief Forces parallel sorting using multiway mergesort
136*38fd1498Szrj    *  with exact splitting at compile time. */
137*38fd1498Szrj   struct multiway_mergesort_exact_tag : public parallel_tag
138*38fd1498Szrj   {
multiway_mergesort_exact_tagmultiway_mergesort_exact_tag139*38fd1498Szrj     multiway_mergesort_exact_tag() { }
multiway_mergesort_exact_tagmultiway_mergesort_exact_tag140*38fd1498Szrj     multiway_mergesort_exact_tag(_ThreadIndex __num_threads)
141*38fd1498Szrj     : parallel_tag(__num_threads) { }
142*38fd1498Szrj   };
143*38fd1498Szrj 
144*38fd1498Szrj   /** @brief Forces parallel sorting using multiway mergesort
145*38fd1498Szrj    *  with splitting by sampling at compile time. */
146*38fd1498Szrj   struct multiway_mergesort_sampling_tag : public parallel_tag
147*38fd1498Szrj   {
multiway_mergesort_sampling_tagmultiway_mergesort_sampling_tag148*38fd1498Szrj     multiway_mergesort_sampling_tag() { }
multiway_mergesort_sampling_tagmultiway_mergesort_sampling_tag149*38fd1498Szrj     multiway_mergesort_sampling_tag(_ThreadIndex __num_threads)
150*38fd1498Szrj     : parallel_tag(__num_threads) { }
151*38fd1498Szrj   };
152*38fd1498Szrj 
153*38fd1498Szrj   /** @brief Forces parallel sorting using unbalanced quicksort
154*38fd1498Szrj    *  at compile time. */
155*38fd1498Szrj   struct quicksort_tag : public parallel_tag
156*38fd1498Szrj   {
quicksort_tagquicksort_tag157*38fd1498Szrj     quicksort_tag() { }
quicksort_tagquicksort_tag158*38fd1498Szrj     quicksort_tag(_ThreadIndex __num_threads)
159*38fd1498Szrj     : parallel_tag(__num_threads) { }
160*38fd1498Szrj   };
161*38fd1498Szrj 
162*38fd1498Szrj   /** @brief Forces parallel sorting using balanced quicksort
163*38fd1498Szrj    *  at compile time. */
164*38fd1498Szrj   struct balanced_quicksort_tag : public parallel_tag
165*38fd1498Szrj   {
balanced_quicksort_tagbalanced_quicksort_tag166*38fd1498Szrj     balanced_quicksort_tag() { }
balanced_quicksort_tagbalanced_quicksort_tag167*38fd1498Szrj     balanced_quicksort_tag(_ThreadIndex __num_threads)
168*38fd1498Szrj     : parallel_tag(__num_threads) { }
169*38fd1498Szrj   };
170*38fd1498Szrj 
171*38fd1498Szrj 
172*38fd1498Szrj   /** @brief Selects the growing block size variant for std::find().
173*38fd1498Szrj       @see _GLIBCXX_FIND_GROWING_BLOCKS */
174*38fd1498Szrj   struct growing_blocks_tag : public find_tag { };
175*38fd1498Szrj 
176*38fd1498Szrj   /** @brief Selects the constant block size variant for std::find().
177*38fd1498Szrj       @see _GLIBCXX_FIND_CONSTANT_SIZE_BLOCKS */
178*38fd1498Szrj   struct constant_size_blocks_tag : public find_tag { };
179*38fd1498Szrj 
180*38fd1498Szrj   /** @brief Selects the equal splitting variant for std::find().
181*38fd1498Szrj       @see _GLIBCXX_FIND_EQUAL_SPLIT */
182*38fd1498Szrj   struct equal_split_tag : public find_tag { };
183*38fd1498Szrj }
184*38fd1498Szrj 
185*38fd1498Szrj #endif /* _GLIBCXX_PARALLEL_TAGS_H */
186