libstdc++
types.h
Go to the documentation of this file.
00001 // -*- C++ -*-
00002 
00003 // Copyright (C) 2007, 2008, 2009 Free Software Foundation, Inc.
00004 //
00005 // This file is part of the GNU ISO C++ Library.  This library is free
00006 // software; you can redistribute it and/or modify it under the terms
00007 // of the GNU General Public License as published by the Free Software
00008 // Foundation; either version 3, or (at your option) any later
00009 // version.
00010 
00011 // This library is distributed in the hope that it will be useful, but
00012 // WITHOUT ANY WARRANTY; without even the implied warranty of
00013 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00014 // General Public License for more details.
00015 
00016 // Under Section 7 of GPL version 3, you are granted additional
00017 // permissions described in the GCC Runtime Library Exception, version
00018 // 3.1, as published by the Free Software Foundation.
00019 
00020 // You should have received a copy of the GNU General Public License and
00021 // a copy of the GCC Runtime Library Exception along with this program;
00022 // see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
00023 // <http://www.gnu.org/licenses/>.
00024 
00025 /** @file parallel/types.h
00026  *  @brief Basic types and typedefs.
00027  *  This file is a GNU parallel extension to the Standard C++ Library.
00028  */
00029 
00030 // Written by Johannes Singler and Felix Putze.
00031 
00032 #ifndef _GLIBCXX_PARALLEL_TYPES_H
00033 #define _GLIBCXX_PARALLEL_TYPES_H 1
00034 
00035 #include <cstdlib>
00036 #include <limits>
00037 #include <tr1/cstdint>
00038 
00039 namespace __gnu_parallel
00040 {
00041   // Enumerated types.
00042 
00043   /// Run-time equivalents for the compile-time tags.
00044   enum _Parallelism
00045     {
00046       /// Not parallel.
00047       sequential,
00048 
00049       /// Parallel unbalanced (equal-sized chunks).
00050       parallel_unbalanced,
00051 
00052       /// Parallel balanced (work-stealing).
00053       parallel_balanced,
00054 
00055       /// Parallel with OpenMP dynamic load-balancing.
00056       parallel_omp_loop,
00057 
00058       /// Parallel with OpenMP static load-balancing.
00059       parallel_omp_loop_static,
00060 
00061       /// Parallel with OpenMP taskqueue construct.
00062       parallel_taskqueue
00063     };
00064 
00065   /// Strategies for run-time algorithm selection: 
00066   // force_sequential, force_parallel, heuristic.
00067   enum _AlgorithmStrategy
00068     {
00069       heuristic,
00070       force_sequential,
00071       force_parallel
00072     };
00073 
00074   /// Sorting algorithms: 
00075   // multi-way mergesort, quicksort, load-balanced quicksort.
00076   enum _SortAlgorithm 
00077     { 
00078       MWMS, 
00079       QS, 
00080       QS_BALANCED 
00081     };
00082 
00083   /// Merging algorithms: 
00084   // bubblesort-alike, loser-tree variants, enum __sentinel.
00085   enum _MultiwayMergeAlgorithm
00086     {
00087       LOSER_TREE
00088     };
00089 
00090   /// Partial sum algorithms: recursive, linear.
00091   enum _PartialSumAlgorithm 
00092     { 
00093       RECURSIVE, 
00094       LINEAR 
00095     };
00096 
00097   /// Sorting/merging algorithms: sampling, __exact.
00098   enum _SplittingAlgorithm 
00099     { 
00100       SAMPLING, 
00101       EXACT 
00102     };
00103 
00104   /// Find algorithms:
00105   // growing blocks, equal-sized blocks, equal splitting.
00106   enum _FindAlgorithm 
00107     { 
00108       GROWING_BLOCKS, 
00109       CONSTANT_SIZE_BLOCKS, 
00110       EQUAL_SPLIT 
00111     };
00112 
00113   /**
00114    * @brief Unsigned integer to index __elements.
00115    * The total number of elements for each algorithm must fit into this type.
00116    */
00117   typedef uint64_t _SequenceIndex;
00118 
00119   /**
00120    * @brief Unsigned integer to index a thread number.
00121    * The maximum thread number (for each processor) must fit into this type.
00122    */
00123   typedef uint16_t _ThreadIndex;
00124 
00125   // XXX atomics interface?
00126   /// Longest compare-and-swappable integer type on this platform.
00127   typedef int64_t _CASable;
00128 
00129   /// Number of bits of _CASable.
00130   static const int _CASable_bits = std::numeric_limits<_CASable>::digits;
00131 
00132   /// ::_CASable with the right half of bits set to 1.
00133   static const _CASable _CASable_mask =
00134                             ((_CASable(1) << (_CASable_bits / 2)) - 1);
00135 }
00136 
00137 #endif /* _GLIBCXX_PARALLEL_TYPES_H */