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