111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// -*- C++ -*-
211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// Copyright (C) 2007-2014 Free Software Foundation, Inc.
411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert//
511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// This file is part of the GNU ISO C++ Library.  This library is free
611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// software; you can redistribute it and/or modify it under the terms
711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// of the GNU General Public License as published by the Free Software
811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// Foundation; either version 3, or (at your option) any later
911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// version.
1011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
1111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// This library is distributed in the hope that it will be useful, but
1211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// WITHOUT ANY WARRANTY; without even the implied warranty of
1311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
1411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// General Public License for more details.
1511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
1611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// Under Section 7 of GPL version 3, you are granted additional
1711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// permissions described in the GCC Runtime Library Exception, version
1811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// 3.1, as published by the Free Software Foundation.
1911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
2011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// You should have received a copy of the GNU General Public License and
2111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// a copy of the GCC Runtime Library Exception along with this program;
2211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
2311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// <http://www.gnu.org/licenses/>.
2411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
2511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert/**
2611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @file parallel/tags.h
2711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @brief Tags for compile-time selection.
2811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *  This file is a GNU parallel extension to the Standard C++ Library.
2911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */
3011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
3111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// Written by Johannes Singler and Felix Putze.
3211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
3311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#ifndef _GLIBCXX_PARALLEL_TAGS_H
3411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define _GLIBCXX_PARALLEL_TAGS_H 1
3511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
3611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include <omp.h>
3711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include <parallel/types.h>
3811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
3911cd02dfb91661c65134cac258cf5924270e9d2Dan Albertnamespace __gnu_parallel
4011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{
4111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  /** @brief Forces sequential execution at compile time. */
4211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  struct sequential_tag { };
4311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
4411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  /** @brief Recommends parallel execution at compile time,
4511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *  optionally using a user-specified number of threads. */
4611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  struct parallel_tag
4711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  {
4811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    private:
4911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _ThreadIndex _M_num_threads;
5011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
5111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    public:
5211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /** @brief Default constructor. Use default number of threads. */
5311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      parallel_tag()
5411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { _M_num_threads = 0; }
5511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
5611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /** @brief Default constructor. Recommend number of threads to use.
5711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @param __num_threads Desired number of threads. */
5811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      parallel_tag(_ThreadIndex __num_threads)
5911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { _M_num_threads = __num_threads; }
6011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
6111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /** @brief Find out desired number of threads.
6211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @return Desired number of threads. */
6311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _ThreadIndex __get_num_threads()
6411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      {
6511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        if(_M_num_threads == 0)
6611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert          return omp_get_max_threads();
6711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        else
6811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert          return _M_num_threads;
6911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      }
7011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
7111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /** @brief Set the desired number of threads.
7211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @param __num_threads Desired number of threads. */
7311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      void set_num_threads(_ThreadIndex __num_threads)
7411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { _M_num_threads = __num_threads; }
7511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  };
7611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
7711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  /** @brief Recommends parallel execution using the
7811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      default parallel algorithm. */
7911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  struct default_parallel_tag : public parallel_tag
8011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  {
8111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    default_parallel_tag() { }
8211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    default_parallel_tag(_ThreadIndex __num_threads)
8311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    : parallel_tag(__num_threads) { }
8411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  };
8511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
8611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  /** @brief Recommends parallel execution using dynamic
8711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      load-balancing at compile time. */
8811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  struct balanced_tag : public parallel_tag { };
8911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
9011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  /** @brief Recommends parallel execution using static
9111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      load-balancing at compile time. */
9211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  struct unbalanced_tag : public parallel_tag { };
9311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
9411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  /** @brief Recommends parallel execution using OpenMP dynamic
9511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      load-balancing at compile time. */
9611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  struct omp_loop_tag : public parallel_tag { };
9711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
9811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  /** @brief Recommends parallel execution using OpenMP static
9911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      load-balancing at compile time. */
10011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  struct omp_loop_static_tag : public parallel_tag { };
10111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
10211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
10311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  /** @brief Base class for for std::find() variants. */
10411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  struct find_tag { };
10511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
10611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
10711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  /** @brief Forces parallel merging
10811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *  with exact splitting, at compile time. */
10911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  struct exact_tag : public parallel_tag
11011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  {
11111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    exact_tag() { }
11211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    exact_tag(_ThreadIndex __num_threads)
11311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    : parallel_tag(__num_threads) { }
11411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  };
11511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
11611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  /** @brief Forces parallel merging
11711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *  with exact splitting, at compile time. */
11811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  struct sampling_tag : public parallel_tag
11911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  {
12011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    sampling_tag() { }
12111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    sampling_tag(_ThreadIndex __num_threads)
12211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    : parallel_tag(__num_threads) { }
12311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  };
12411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
12511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
12611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  /** @brief Forces parallel sorting using multiway mergesort
12711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *  at compile time. */
12811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  struct multiway_mergesort_tag : public parallel_tag
12911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  {
13011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    multiway_mergesort_tag() { }
13111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    multiway_mergesort_tag(_ThreadIndex __num_threads)
13211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    : parallel_tag(__num_threads) { }
13311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  };
13411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
13511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  /** @brief Forces parallel sorting using multiway mergesort
13611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *  with exact splitting at compile time. */
13711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  struct multiway_mergesort_exact_tag : public parallel_tag
13811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  {
13911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    multiway_mergesort_exact_tag() { }
14011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    multiway_mergesort_exact_tag(_ThreadIndex __num_threads)
14111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    : parallel_tag(__num_threads) { }
14211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  };
14311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
14411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  /** @brief Forces parallel sorting using multiway mergesort
14511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *  with splitting by sampling at compile time. */
14611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  struct multiway_mergesort_sampling_tag : public parallel_tag
14711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  {
14811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    multiway_mergesort_sampling_tag() { }
14911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    multiway_mergesort_sampling_tag(_ThreadIndex __num_threads)
15011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    : parallel_tag(__num_threads) { }
15111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  };
15211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
15311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  /** @brief Forces parallel sorting using unbalanced quicksort
15411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *  at compile time. */
15511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  struct quicksort_tag : public parallel_tag
15611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  {
15711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    quicksort_tag() { }
15811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    quicksort_tag(_ThreadIndex __num_threads)
15911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    : parallel_tag(__num_threads) { }
16011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  };
16111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
16211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  /** @brief Forces parallel sorting using balanced quicksort
16311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *  at compile time. */
16411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  struct balanced_quicksort_tag : public parallel_tag
16511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  {
16611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    balanced_quicksort_tag() { }
16711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    balanced_quicksort_tag(_ThreadIndex __num_threads)
16811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    : parallel_tag(__num_threads) { }
16911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  };
17011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
17111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
17211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  /** @brief Selects the growing block size variant for std::find().
17311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      @see _GLIBCXX_FIND_GROWING_BLOCKS */
17411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  struct growing_blocks_tag : public find_tag { };
17511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
17611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  /** @brief Selects the constant block size variant for std::find().
17711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      @see _GLIBCXX_FIND_CONSTANT_SIZE_BLOCKS */
17811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  struct constant_size_blocks_tag : public find_tag { };
17911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
18011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  /** @brief Selects the equal splitting variant for std::find().
18111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      @see _GLIBCXX_FIND_EQUAL_SPLIT */
18211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  struct equal_split_tag : public find_tag { };
18311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}
18411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
18511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif /* _GLIBCXX_PARALLEL_TAGS_H */
186