From 847eb5516fad658dfdf9d1d4b5ec2eec5e628fdd Mon Sep 17 00:00:00 2001 From: Benjamin Kosnik Date: Fri, 15 Feb 2008 22:55:14 +0000 Subject: [PATCH] types.h: Move enum parallelism here. 2008-02-15 Benjamin Kosnik * include/parallel/types.h: Move enum parallelism here. Use tr1/cstdint's int16_t, uint16_t, int32_t, uint32_t, int64_t, uint64_t. * include/parallel/multiseq_selection.h: Adjust for cstdint. * include/parallel/compatibility.h: Same. * include/parallel/tags.h: Just compile-time tags. * include/parallel/base.h: Put namespace bits here. * src/Makefile.am (PARALLEL_FLAGS): Use it. * src/Makefile.in: Regenerate. * testsuite/25_algorithms/nth_element/1.cc: Add test variable. From-SVN: r132354 --- libstdc++-v3/ChangeLog | 35 ++++-- libstdc++-v3/include/parallel/base.h | 39 +++++- libstdc++-v3/include/parallel/compatibility.h | 56 ++++----- .../include/parallel/multiseq_selection.h | 3 +- libstdc++-v3/include/parallel/random_number.h | 38 +++--- .../include/parallel/random_shuffle.h | 4 +- libstdc++-v3/include/parallel/tags.h | 54 +------- libstdc++-v3/include/parallel/types.h | 115 ++++++++++++++---- libstdc++-v3/src/Makefile.am | 7 +- libstdc++-v3/src/Makefile.in | 9 +- libstdc++-v3/src/parallel_list.cc | 2 - .../testsuite/25_algorithms/nth_element/1.cc | 2 + 12 files changed, 214 insertions(+), 150 deletions(-) diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 1e1b109c6c1..05b5e7d99f4 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,18 @@ +2008-02-15 Benjamin Kosnik + + * include/parallel/types.h: Move enum parallelism here. Use + tr1/cstdint's int16_t, uint16_t, int32_t, uint32_t, int64_t, + uint64_t. + * include/parallel/multiseq_selection.h: Adjust for cstdint. + * include/parallel/compatibility.h: Same. + * include/parallel/tags.h: Just compile-time tags. + * include/parallel/base.h: Put namespace bits here. + + * src/Makefile.am (PARALLEL_FLAGS): Use it. + * src/Makefile.in: Regenerate. + + * testsuite/25_algorithms/nth_element/1.cc: Add test variable. + 2008-02-15 Hans-Peter Nilsson * testsuite/config/default.exp: Load gcc dejapatches.exp. @@ -20,7 +35,7 @@ 2008-02-13 Benjamin Kosnik * doc/doxygen/mainpage.html: Correct links. - + 2008-02-11 Benjamin Kosnik * doc/html/*: Populate with regenerated files. @@ -30,7 +45,7 @@ * doc/html/*: Remove all but contents of ext/pb_ds. * doc/html/index.html: New. * doc/html/README: New. - + 2008-02-11 Benjamin Kosnik * doc/doxygen/mainpage.html: Add in corrected links. @@ -40,7 +55,7 @@ * doc/xml/spine.xml: Edit file names. * doc/Makefile.am: Edit xml_sources. * doc/Makefile.in: Regenerate. - + 2008-02-11 Paolo Carlini * configure: Regenerate with documented autoconf and automake @@ -134,13 +149,13 @@ * doc/doxygen/guide.html: Removed, integrated into other docs. * doc/doxygen/user.cfg.in: Clean up XML generation. - * doc/doxygen/run_doxygen: Move to.. + * doc/doxygen/run_doxygen: Move to.. * scripts/run_doxygen: ...here. - + * configure: Regenerate. * Makefile.in: Regenerate. * src/Makefile.in: Regenerate. - * doc/Makefile.in: Regenerate. + * doc/Makefile.in: Regenerate. * po/Makefile.in: Regenerate. * libmath/Makefile.in: Regenerate. * include/Makefile.in: Regenerate. @@ -162,7 +177,7 @@ * testsuite/27_io/basic_iostream/cons/2020.cc: Minor tweaks. 2008-01-31 Ralf Wildenhues - + * include/backward/auto_ptr.h: Fix comment typos. * include/bits/algorithmfwd.h: Likewise. * include/bits/basic_ios.h: Likewise. @@ -309,7 +324,7 @@ * doc/doxygen/run_doxygen: Same, more namespace fixups for man generation. * doc/doxygen/user.cfg.in: Update for doxygen 1.5.4. - + * include/tr1_impl/random: Remove maint from doxygen markup. * include/tr1_impl/functional: Same. * include/std/tuple: Same. @@ -343,7 +358,7 @@ * include/backward/auto_ptr.h: Same. * testsuite/23_containers/vector/requirements/dr438/assign_neg.cc: - Fixups for line number changes. + Fixups for line number changes. * testsuite/23_containers/vector/requirements/dr438/insert_neg.cc: Same. * testsuite/23_containers/vector/requirements/dr438/ constructor_1_neg.cc: Same. @@ -375,7 +390,7 @@ * testsuite/Makefile.in: Regenerate. * scripts/make_graphs.py: Correct paths for new layout. - + 2008-01-17 Benjamin Kosnik * acinclude.m4 (AC_LC_MESSAGES): Remove serial. diff --git a/libstdc++-v3/include/parallel/base.h b/libstdc++-v3/include/parallel/base.h index 8d1c073d4d0..23ad7d6b43c 100644 --- a/libstdc++-v3/include/parallel/base.h +++ b/libstdc++-v3/include/parallel/base.h @@ -44,6 +44,37 @@ #include #include + +// Parallel mode namespaces. +namespace std +{ + namespace __parallel { } +} + +/** + * @namespace __gnu_parallel + * @brief GNU parallel classes for public use. + */ +namespace __gnu_parallel +{ + // Import all the parallel versions of components in namespace std. + using namespace std::__parallel; +} + +/** + * @namespace __gnu_sequential + * @brief GNU sequential classes for public use. + */ +namespace __gnu_sequential +{ +#ifdef _GLIBCXX_PARALLEL + using namespace std::__norm; +#else + using namespace std; +#endif +} + + namespace __gnu_parallel { // XXX remove std::duplicates from here if possible, @@ -357,8 +388,8 @@ template public: typedef _DifferenceTp difference_type; - // Better case down to uint64, than up to _DifferenceTp. - typedef pseudo_sequence_iterator iterator; + // Better case down to uint64_t, than up to _DifferenceTp. + typedef pseudo_sequence_iterator iterator; /** @brief Constructor. * @param val Element of the sequence. @@ -437,8 +468,8 @@ __replacement_assert(const char* __file, int __line, #define _GLIBCXX_PARALLEL_ASSERT(_Condition) \ do \ { \ - if (!(_Condition)) \ - __gnu_parallel::__replacement_assert(__FILE__, __LINE__, \ + if (!(_Condition)) \ + __gnu_parallel::__replacement_assert(__FILE__, __LINE__, \ __PRETTY_FUNCTION__, #_Condition); \ } while (false) diff --git a/libstdc++-v3/include/parallel/compatibility.h b/libstdc++-v3/include/parallel/compatibility.h index c4e90614109..849849bbd67 100644 --- a/libstdc++-v3/include/parallel/compatibility.h +++ b/libstdc++-v3/include/parallel/compatibility.h @@ -68,7 +68,7 @@ namespace __gnu_parallel { #if defined(__ICC) template - int32 faa32(int32* x, int32 inc) + int32_t faa32(int32_t* x, int32_t inc) { asm volatile("lock xadd %0,%1" : "=r" (inc), "=m" (*x) @@ -78,7 +78,7 @@ namespace __gnu_parallel } #if defined(__x86_64) template - int64 faa64(int64* x, int64 inc) + int64_t faa64(int64_t* x, int64_t inc) { asm volatile("lock xadd %0,%1" : "=r" (inc), "=m" (*x) @@ -97,8 +97,8 @@ namespace __gnu_parallel * @param ptr Pointer to a 32-bit signed integer. * @param addend Value to add. */ - inline int32 - fetch_and_add_32(volatile int32* ptr, int32 addend) + inline int32_t + fetch_and_add_32(volatile int32_t* ptr, int32_t addend) { #if defined(__ICC) //x86 version return _InterlockedExchangeAdd((void*)ptr, addend); @@ -110,7 +110,7 @@ namespace __gnu_parallel #elif defined(__GNUC__) return __sync_fetch_and_add(ptr, addend); #elif defined(__SUNPRO_CC) && defined(__sparc) - volatile int32 before, after; + volatile int32_t before, after; do { before = *ptr; @@ -120,7 +120,7 @@ namespace __gnu_parallel return before; #else //fallback, slow #pragma message("slow fetch_and_add_32") - int32 res; + int32_t res; #pragma omp critical { res = *ptr; @@ -136,11 +136,11 @@ namespace __gnu_parallel * @param ptr Pointer to a 64-bit signed integer. * @param addend Value to add. */ - inline int64 - fetch_and_add_64(volatile int64* ptr, int64 addend) + inline int64_t + fetch_and_add_64(volatile int64_t* ptr, int64_t addend) { #if defined(__ICC) && defined(__x86_64) //x86 version - return faa64((int64*)ptr, addend); + return faa64((int64_t*)ptr, addend); #elif defined(__ECC) //IA-64 version return _InterlockedExchangeAdd64((void*)ptr, addend); #elif defined(__ICL) || defined(_MSC_VER) @@ -156,7 +156,7 @@ namespace __gnu_parallel (defined(__i686) || defined(__pentium4) || defined(__athlon)) return __sync_fetch_and_add(ptr, addend); #elif defined(__SUNPRO_CC) && defined(__sparc) - volatile int64 before, after; + volatile int64_t before, after; do { before = *ptr; @@ -170,7 +170,7 @@ namespace __gnu_parallel //#warning "please compile with -march=i686 or better" #endif #pragma message("slow fetch_and_add_64") - int64 res; + int64_t res; #pragma omp critical { res = *ptr; @@ -190,10 +190,10 @@ namespace __gnu_parallel inline T fetch_and_add(volatile T* ptr, T addend) { - if (sizeof(T) == sizeof(int32)) - return (T)fetch_and_add_32((volatile int32*) ptr, (int32)addend); - else if (sizeof(T) == sizeof(int64)) - return (T)fetch_and_add_64((volatile int64*) ptr, (int64)addend); + if (sizeof(T) == sizeof(int32_t)) + return (T)fetch_and_add_32((volatile int32_t*) ptr, (int32_t)addend); + else if (sizeof(T) == sizeof(int64_t)) + return (T)fetch_and_add_64((volatile int64_t*) ptr, (int64_t)addend); else _GLIBCXX_PARALLEL_ASSERT(false); } @@ -202,10 +202,10 @@ namespace __gnu_parallel #if defined(__ICC) template - inline int32 - cas32(volatile int32* ptr, int32 old, int32 nw) + inline int32_t + cas32(volatile int32_t* ptr, int32_t old, int32_t nw) { - int32 before; + int32_t before; __asm__ __volatile__("lock; cmpxchgl %1,%2" : "=a"(before) : "q"(nw), "m"(*(volatile long long*)(ptr)), "0"(old) @@ -215,10 +215,10 @@ namespace __gnu_parallel #if defined(__x86_64) template - inline int64 - cas64(volatile int64 *ptr, int64 old, int64 nw) + inline int64_t + cas64(volatile int64_t *ptr, int64_t old, int64_t nw) { - int64 before; + int64_t before; __asm__ __volatile__("lock; cmpxchgq %1,%2" : "=a"(before) : "q"(nw), "m"(*(volatile long long*)(ptr)), "0"(old) @@ -238,7 +238,7 @@ namespace __gnu_parallel * @param replacement Replacement value. */ inline bool - compare_and_swap_32(volatile int32* ptr, int32 comparand, int32 replacement) + compare_and_swap_32(volatile int32_t* ptr, int32_t comparand, int32_t replacement) { #if defined(__ICC) //x86 version return _InterlockedCompareExchange((void*)ptr, replacement, @@ -278,7 +278,7 @@ namespace __gnu_parallel * @param replacement Replacement value. */ inline bool - compare_and_swap_64(volatile int64* ptr, int64 comparand, int64 replacement) + compare_and_swap_64(volatile int64_t* ptr, int64_t comparand, int64_t replacement) { #if defined(__ICC) && defined(__x86_64) //x86 version return cas64(ptr, comparand, replacement) == comparand; @@ -332,12 +332,10 @@ namespace __gnu_parallel inline bool compare_and_swap(volatile T* ptr, T comparand, T replacement) { - if (sizeof(T) == sizeof(int32)) - return compare_and_swap_32((volatile int32*) ptr, - (int32)comparand, (int32)replacement); - else if (sizeof(T) == sizeof(int64)) - return compare_and_swap_64((volatile int64*) ptr, - (int64)comparand, (int64)replacement); + if (sizeof(T) == sizeof(int32_t)) + return compare_and_swap_32((volatile int32_t*) ptr, (int32_t)comparand, (int32_t)replacement); + else if (sizeof(T) == sizeof(int64_t)) + return compare_and_swap_64((volatile int64_t*) ptr, (int64_t)comparand, (int64_t)replacement); else _GLIBCXX_PARALLEL_ASSERT(false); } diff --git a/libstdc++-v3/include/parallel/multiseq_selection.h b/libstdc++-v3/include/parallel/multiseq_selection.h index 32f1b53a2c4..88d2a509b81 100644 --- a/libstdc++-v3/include/parallel/multiseq_selection.h +++ b/libstdc++-v3/include/parallel/multiseq_selection.h @@ -67,7 +67,6 @@ namespace __gnu_parallel public: lexicographic(Comparator& _comp) : comp(_comp) { } - // XXX const bool operator()(const std::pair& p1, const std::pair& p2) const @@ -265,7 +264,7 @@ namespace __gnu_parallel } difference_type skew = static_cast - (static_cast(total) * rank / N - leftsize); + (static_cast(total) * rank / N - leftsize); if (skew > 0) { diff --git a/libstdc++-v3/include/parallel/random_number.h b/libstdc++-v3/include/parallel/random_number.h index ae523723ecb..5eb24625dd2 100644 --- a/libstdc++-v3/include/parallel/random_number.h +++ b/libstdc++-v3/include/parallel/random_number.h @@ -330,11 +330,11 @@ namespace __gnu_parallel } - typedef mersenne_twister mt11213b; // validation by experiment from mt19937.c - typedef mersenne_twister mt19937; /** @brief Random number generator, based on the Mersenne twister. */ @@ -342,24 +342,24 @@ namespace __gnu_parallel { private: mt19937 mt; - uint64 supremum, RAND_SUP; + uint64_t supremum, RAND_SUP; double supremum_reciprocal, RAND_SUP_REC; - uint64 cache; /* assumed to be twice as long as the usual random number */ + uint64_t cache; /* assumed to be twice as long as the usual random number */ int bits_left; /* bit results */ - static uint32 - scale_down(uint64 x, + static uint32_t + scale_down(uint64_t x, #if _GLIBCXX_SCALE_DOWN_FPU - uint64 /*supremum*/, double supremum_reciprocal) + uint64_t /*supremum*/, double supremum_reciprocal) #else - uint64 supremum, double /*supremum_reciprocal*/) + uint64_t supremum, double /*supremum_reciprocal*/) #endif { #if _GLIBCXX_SCALE_DOWN_FPU - return (uint32)(x * supremum_reciprocal); + return (uint32_t)(x * supremum_reciprocal); #else - return static_cast(x % supremum); + return static_cast(x % supremum); #endif } @@ -367,7 +367,7 @@ namespace __gnu_parallel /** @brief Default constructor. Seed with 0. */ random_number() : mt(0), supremum(0x100000000ULL), - RAND_SUP(1ULL << (sizeof(uint32) * 8)), + RAND_SUP(1ULL << (sizeof(uint32_t) * 8)), supremum_reciprocal((double)supremum / (double)RAND_SUP), RAND_SUP_REC(1.0 / (double)RAND_SUP), cache(0), bits_left(0) { } @@ -376,22 +376,22 @@ namespace __gnu_parallel * @param seed Random seed. * @param supremum Generate integer random numbers in the * interval @c [0,supremum). */ - random_number(uint32 seed, uint64 supremum = 0x100000000ULL) + random_number(uint32_t seed, uint64_t supremum = 0x100000000ULL) : mt(seed), supremum(supremum), - RAND_SUP(1ULL << (sizeof(uint32) * 8)), + RAND_SUP(1ULL << (sizeof(uint32_t) * 8)), supremum_reciprocal((double)supremum / (double)RAND_SUP), RAND_SUP_REC(1.0 / (double)RAND_SUP), cache(0), bits_left(0) { } /** @brief Generate unsigned random 32-bit integer. */ - uint32 + uint32_t operator()() { return scale_down(mt(), supremum, supremum_reciprocal); } /** @brief Generate unsigned random 32-bit integer in the interval @c [0,local_supremum). */ - uint32 - operator()(uint64 local_supremum) + uint32_t + operator()(uint64_t local_supremum) { return scale_down(mt(), local_supremum, (double)local_supremum * RAND_SUP_REC); @@ -400,7 +400,7 @@ namespace __gnu_parallel /** @brief Set the random seed. * @param seed to set. */ void - set_seed(uint32 seed) + set_seed(uint32_t seed) { mt.seed(seed); cache = mt(); @@ -417,7 +417,7 @@ namespace __gnu_parallel bits_left -= bits; if (bits_left < 32) { - cache |= (((uint64)mt()) << bits_left); + cache |= (((uint64_t)mt()) << bits_left); bits_left += 32; } return res; @@ -433,7 +433,7 @@ namespace __gnu_parallel bits_left -= bits; if (bits_left < 32) { - cache |= (((uint64)mt()) << bits_left); + cache |= (((uint64_t)mt()) << bits_left); bits_left += 32; } return res; diff --git a/libstdc++-v3/include/parallel/random_shuffle.h b/libstdc++-v3/include/parallel/random_shuffle.h index 348a3a34b37..2b717892507 100644 --- a/libstdc++-v3/include/parallel/random_shuffle.h +++ b/libstdc++-v3/include/parallel/random_shuffle.h @@ -106,7 +106,7 @@ template bin_index bins_end; /** @brief Random seed for this thread. */ - uint32 seed; + uint32_t seed; /** @brief Pointer to global data. */ DRandomShufflingGlobalData* sd; @@ -368,7 +368,7 @@ template for (; j < bin_cursor; ++j) sd.bin_proc[j] = i; pus[i].num_threads = num_threads; - pus[i].seed = rng(std::numeric_limits::max()); + pus[i].seed = rng(std::numeric_limits::max()); pus[i].sd = &sd; } starts[num_threads] = start; diff --git a/libstdc++-v3/include/parallel/tags.h b/libstdc++-v3/include/parallel/tags.h index c3d33e882c6..1389aed4b06 100644 --- a/libstdc++-v3/include/parallel/tags.h +++ b/libstdc++-v3/include/parallel/tags.h @@ -30,7 +30,7 @@ /** * @file parallel/tags.h - * @brief Tags for compile-time options. + * @brief Tags for compile-time selection. * This file is a GNU parallel extension to the Standard C++ Library. */ @@ -39,59 +39,8 @@ #ifndef _GLIBCXX_PARALLEL_TAGS_H #define _GLIBCXX_PARALLEL_TAGS_H 1 -// Parallel mode namespaces. -namespace std -{ - namespace __parallel { } -} - -/** - * @namespace __gnu_sequential - * @brief GNU sequential classes for public use. - */ -namespace __gnu_sequential -{ -#ifdef _GLIBCXX_PARALLEL - using namespace std::__norm; -#else - using namespace std; -#endif -} - -/** - * @namespace __gnu_parallel - * @brief GNU parallel classes for public use. - */ namespace __gnu_parallel { - // Import all the parallel versions of components in namespace std. - using namespace std::__parallel; - - enum parallelism - { - /// Not parallel. - sequential, - - /// Parallel unbalanced (equal-sized chunks). - parallel_unbalanced, - - /// Parallel balanced (work-stealing). - parallel_balanced, - - /// Parallel with OpenMP dynamic load-balancing. - parallel_omp_loop, - - /// Parallel with OpenMP static load-balancing. - parallel_omp_loop_static, - - /// Parallel with OpenMP taskqueue construct. - parallel_taskqueue - }; - - inline bool - is_parallel(const parallelism __p) { return __p != sequential; } - - /** @brief Forces sequential execution at compile time. */ struct sequential_tag { }; @@ -115,6 +64,7 @@ namespace __gnu_parallel struct omp_loop_static_tag : public parallel_tag { }; + // XXX settings.h Settings::FindDistribution /** @brief Selects the growing block size variant for std::find(). @see _GLIBCXX_FIND_GROWING_BLOCKS */ struct growing_blocks_tag { }; diff --git a/libstdc++-v3/include/parallel/types.h b/libstdc++-v3/include/parallel/types.h index 5f8014f5c71..2f0e4595400 100644 --- a/libstdc++-v3/include/parallel/types.h +++ b/libstdc++-v3/include/parallel/types.h @@ -1,6 +1,6 @@ // -*- C++ -*- -// Copyright (C) 2007 Free Software Foundation, Inc. +// Copyright (C) 2007, 2008 Free Software Foundation, Inc. // // This file is part of the GNU ISO C++ Library. This library is free // software; you can redistribute it and/or modify it under the terms @@ -29,7 +29,7 @@ // Public License. /** @file parallel/types.h - * @brief Basic typedefs. + * @brief Basic types and typedefs. * This file is a GNU parallel extension to the Standard C++ Library. */ @@ -39,51 +39,120 @@ #define _GLIBCXX_PARALLEL_TYPES_H 1 #include +#include namespace __gnu_parallel { - // XXX need to use - /** @brief 8-bit signed integer. */ - typedef char int8; + // Enumerated types. - /** @brief 8-bit unsigned integer. */ - typedef unsigned char uint8; + /// @brief Run-time equivalents for the compile-time tags. + enum parallelism + { + /// Not parallel. + sequential, - /** @brief 16-bit signed integer. */ - typedef short int16; + /// Parallel unbalanced (equal-sized chunks). + parallel_unbalanced, - /** @brief 16-bit unsigned integer. */ - typedef unsigned short uint16; + /// Parallel balanced (work-stealing). + parallel_balanced, - /** @brief 32-bit signed integer. */ - typedef int int32; + /// Parallel with OpenMP dynamic load-balancing. + parallel_omp_loop, - /** @brief 32-bit unsigned integer. */ - typedef unsigned int uint32; + /// Parallel with OpenMP static load-balancing. + parallel_omp_loop_static, - /** @brief 64-bit signed integer. */ - typedef long long int64; + /// Parallel with OpenMP taskqueue construct. + parallel_taskqueue + }; - /** @brief 64-bit unsigned integer. */ - typedef unsigned long long uint64; + inline bool + is_parallel(const parallelism __p) { return __p != sequential; } + + /// @brief Sorting algorithms: multi-way mergesort, quicksort, + /// load-balanced quicksort. + enum SortAlgorithm + { + MWMS, + QS, + QS_BALANCED + }; + + /// @brief Merging algorithms: bubblesort-alike, loser-tree + /// variants, enum sentinel. + enum MultiwayMergeAlgorithm + { + BUBBLE, + LOSER_TREE_EXPLICIT, + LOSER_TREE, + LOSER_TREE_COMBINED, + LOSER_TREE_SENTINEL, + MWM_ALGORITHM_LAST + }; + + /// @brief Partial sum algorithms: recursive, linear. + enum PartialSumAlgorithm + { + RECURSIVE, + LINEAR + }; + + /// @brief Splitting strategies for sorting/merging: sampling, exact. + enum Splitting + { + SAMPLING, + EXACT + }; + + /// @brief Find distribution strategies: growing blocks, equal-sized + /// blocks, equal splitting. + enum FindDistribution + { + GROWING_BLOCKS, + CONSTANT_SIZE_BLOCKS, + EQUAL_SPLIT + }; + + /// @brief Strategies for run-time algorithm selection: + /// force_sequential, force_parallel, heuristic. + enum AlgorithmSelection + { + heuristic, + force_sequential, + force_parallel + }; + + + /// Integer Types. + using std::tr1::int16_t; + using std::tr1::uint16_t; + + using std::tr1::int32_t; + using std::tr1::uint32_t; + + using std::tr1::int64_t; + using std::tr1::uint64_t; /** * @brief Unsigned integer to index elements. * The total number of elements for each algorithm must fit into this type. */ - typedef uint64 sequence_index_t; + typedef uint64_t sequence_index_t; /** * @brief Unsigned integer to index a thread number. * The maximum thread number (for each processor) must fit into this type. */ - typedef uint16 thread_index_t; + typedef uint16_t thread_index_t; + // XXX atomics interface? /** * @brief Longest compare-and-swappable integer type on this platform. */ - typedef int64 lcas_t; + typedef int64_t lcas_t; + // XXX numeric_limits::digits? /** * @brief Number of bits of ::lcas_t. */ @@ -92,7 +161,7 @@ namespace __gnu_parallel /** * @brief ::lcas_t with the right half of bits set to 1. */ - static const lcas_t lcas_t_mask = (((lcas_t)1 << (lcas_t_bits / 2)) - 1); + static const lcas_t lcas_t_mask = ((lcas_t(1) << (lcas_t_bits / 2)) - 1); } #endif /* _GLIBCXX_TYPES_H */ diff --git a/libstdc++-v3/src/Makefile.am b/libstdc++-v3/src/Makefile.am index 56e690d5993..9bc4b557214 100644 --- a/libstdc++-v3/src/Makefile.am +++ b/libstdc++-v3/src/Makefile.am @@ -214,11 +214,12 @@ concept-inst.lo: concept-inst.cc concept-inst.o: concept-inst.cc $(CXXCOMPILE) -D_GLIBCXX_CONCEPT_CHECKS -fimplicit-templates -c $< -# Use special rules for parallel_list.cc compile. +# Use special rules for parallel mode compilation. +PARALLEL_FLAGS = -fopenmp -D_GLIBCXX_PARALLEL -I$(glibcxx_builddir)/../libgomp parallel_list.lo: parallel_list.cc - $(LTCXXCOMPILE) -I$(glibcxx_builddir)/../libgomp -c $< + $(LTCXXCOMPILE) $(PARALLEL_FLAGS) -c $< parallel_list.o: parallel_list.cc - $(CXXCOMPILE) -I$(glibcxx_builddir)/../libgomp -c $< + $(CXXCOMPILE) $(PARALLEL_FLAGS) -c $< # Use special rules for the C++0x sources so that the proper flags are passed. system_error.lo: system_error.cc diff --git a/libstdc++-v3/src/Makefile.in b/libstdc++-v3/src/Makefile.in index acab043c071..71ddb748452 100644 --- a/libstdc++-v3/src/Makefile.in +++ b/libstdc++-v3/src/Makefile.in @@ -429,6 +429,9 @@ libstdc___la_LDFLAGS = \ # deprecated include files. GLIBCXX_INCLUDE_DIR = $(glibcxx_builddir)/include +# Use special rules for parallel mode compilation. +PARALLEL_FLAGS = -fopenmp -D_GLIBCXX_PARALLEL -I$(glibcxx_builddir)/../libgomp + # AM_CXXFLAGS needs to be in each subdirectory so that it can be # modified in a per-library or per-sub-library way. Need to manually # set this option because CONFIG_CXXFLAGS has to be after @@ -802,12 +805,10 @@ concept-inst.lo: concept-inst.cc $(LTCXXCOMPILE) -D_GLIBCXX_CONCEPT_CHECKS -fimplicit-templates -c $< concept-inst.o: concept-inst.cc $(CXXCOMPILE) -D_GLIBCXX_CONCEPT_CHECKS -fimplicit-templates -c $< - -# Use special rules for parallel_list.cc compile. parallel_list.lo: parallel_list.cc - $(LTCXXCOMPILE) -I$(glibcxx_builddir)/../libgomp -c $< + $(LTCXXCOMPILE) $(PARALLEL_FLAGS) -c $< parallel_list.o: parallel_list.cc - $(CXXCOMPILE) -I$(glibcxx_builddir)/../libgomp -c $< + $(CXXCOMPILE) $(PARALLEL_FLAGS) -c $< # Use special rules for the C++0x sources so that the proper flags are passed. system_error.lo: system_error.cc diff --git a/libstdc++-v3/src/parallel_list.cc b/libstdc++-v3/src/parallel_list.cc index a79a886904c..e038459a3df 100644 --- a/libstdc++-v3/src/parallel_list.cc +++ b/libstdc++-v3/src/parallel_list.cc @@ -27,6 +27,4 @@ // invalidate any other reasons why the executable file might be covered by // the GNU General Public License. -#define _GLIBCXX_PARALLEL - #include "list.cc" diff --git a/libstdc++-v3/testsuite/25_algorithms/nth_element/1.cc b/libstdc++-v3/testsuite/25_algorithms/nth_element/1.cc index 2ce39dd4389..2304d3634b9 100644 --- a/libstdc++-v3/testsuite/25_algorithms/nth_element/1.cc +++ b/libstdc++-v3/testsuite/25_algorithms/nth_element/1.cc @@ -49,6 +49,7 @@ test2() void test3() { + bool test __attribute__((unused)) = true; int array[] = {6, 5, 4, 3, 2, 1, 0}; Container con(array, array + 7); nth_element(con.begin(), con.it(3), con.end()); @@ -61,6 +62,7 @@ test3() void test4() { + bool test __attribute__((unused)) = true; int array[] = {0, 6, 1, 5, 2, 4, 3}; Container con(array,array + 7); nth_element(con.begin(), con.it(3), con.end());