From c249d3147ea994782c3be06e53f27a552b297b92 Mon Sep 17 00:00:00 2001 From: singler Date: Tue, 3 Feb 2009 17:49:36 +0000 Subject: 2009-02-03 Johannes Singler * include/parallel/algorithmfwd.h: Add parallelism default for many declarations. * include/parallel/numericfwd.h: Likewise. * include/parallel/iterator.h: Use iterator_traits as usual. * include/parallel/par_loop.h: Include equally_split.h. (for_each_template_random_access_ed): Avoid calling the Result default constructor. * include/parallel/numeric: Replace for_each_template_random_access by for_each_template_random_access_ed in numeric functions. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@143902 138bc75d-0d04-0410-961f-82ee72b054a4 --- libstdc++-v3/include/parallel/algorithmfwd.h | 27 ++++++++++++++++++--------- libstdc++-v3/include/parallel/iterator.h | 3 ++- libstdc++-v3/include/parallel/numeric | 12 ++++++------ libstdc++-v3/include/parallel/numericfwd.h | 9 ++++++--- libstdc++-v3/include/parallel/par_loop.h | 24 +++++++++++++++++------- 5 files changed, 49 insertions(+), 26 deletions(-) (limited to 'libstdc++-v3/include') diff --git a/libstdc++-v3/include/parallel/algorithmfwd.h b/libstdc++-v3/include/parallel/algorithmfwd.h index 3f386a5cdbc..7aed7c71d4b 100644 --- a/libstdc++-v3/include/parallel/algorithmfwd.h +++ b/libstdc++-v3/include/parallel/algorithmfwd.h @@ -99,7 +99,8 @@ namespace __parallel template typename iterator_traits<_RAIter>::difference_type count_switch(_RAIter, _RAIter, const _Tp&, random_access_iterator_tag, - __gnu_parallel::_Parallelism); + __gnu_parallel::_Parallelism parallelism + = __gnu_parallel::parallel_unbalanced); template @@ -121,7 +122,8 @@ namespace __parallel template typename iterator_traits<_RAIter>::difference_type count_if_switch(_RAIter, _RAIter, _Predicate, random_access_iterator_tag, - __gnu_parallel::_Parallelism); + __gnu_parallel::_Parallelism parallelism + = __gnu_parallel::parallel_unbalanced); // algobase.h template @@ -228,7 +230,8 @@ namespace __parallel template _Function for_each_switch(_RAIter, _RAIter, _Function, random_access_iterator_tag, - __gnu_parallel::_Parallelism); + __gnu_parallel::_Parallelism parallelism + = __gnu_parallel::parallel_balanced); template @@ -250,7 +253,8 @@ namespace __parallel template void generate_switch(_RAIter, _RAIter, _Generator, random_access_iterator_tag, - __gnu_parallel::_Parallelism); + __gnu_parallel::_Parallelism parallelism + = __gnu_parallel::parallel_balanced); template _OIter @@ -272,7 +276,8 @@ namespace __parallel template _RAIter generate_n_switch(_RAIter, _Size, _Generator, random_access_iterator_tag, - __gnu_parallel::_Parallelism); + __gnu_parallel::_Parallelism parallelism + = __gnu_parallel::parallel_balanced); template bool @@ -429,7 +434,8 @@ namespace __parallel _RAOIter transform1_switch(_RAIIter, _RAIIter, _RAOIter, UnaryOperation, random_access_iterator_tag, random_access_iterator_tag, - __gnu_parallel::_Parallelism); + __gnu_parallel::_Parallelism parallelism + = __gnu_parallel::parallel_balanced); template _RAIter max_element_switch(_RAIter, _RAIter, _Compare, random_access_iterator_tag, - __gnu_parallel::_Parallelism); + __gnu_parallel::_Parallelism parallelism + = __gnu_parallel::parallel_balanced); template @@ -615,7 +623,8 @@ namespace __parallel template _RAIter min_element_switch(_RAIter, _RAIter, _Compare, random_access_iterator_tag, - __gnu_parallel::_Parallelism); + __gnu_parallel::_Parallelism parallelism + = __gnu_parallel::parallel_balanced); template void diff --git a/libstdc++-v3/include/parallel/iterator.h b/libstdc++-v3/include/parallel/iterator.h index 7aaafee8611..95ef844350f 100644 --- a/libstdc++-v3/include/parallel/iterator.h +++ b/libstdc++-v3/include/parallel/iterator.h @@ -131,7 +131,8 @@ namespace __gnu_parallel public: typedef IteratorCategory iterator_category; typedef void value_type; - typedef typename Iterator1::difference_type difference_type; + typedef typename std::iterator_traits::difference_type + difference_type; typedef type* pointer; typedef type& reference; diff --git a/libstdc++-v3/include/parallel/numeric b/libstdc++-v3/include/parallel/numeric index 1269c5251e4..8706e3f4c01 100644 --- a/libstdc++-v3/include/parallel/numeric +++ b/libstdc++-v3/include/parallel/numeric @@ -103,13 +103,13 @@ namespace __parallel __gnu_parallel::accumulate_selector<_RandomAccessIterator> my_selector; __gnu_parallel:: - for_each_template_random_access(begin, end, + for_each_template_random_access_ed(begin, end, __gnu_parallel::nothing(), my_selector, __gnu_parallel:: accumulate_binop_reduct (binary_op), - res, res, -1, parallelism_tag); + res, res, -1); return res; } else @@ -211,9 +211,9 @@ namespace __parallel inner_product_selector my_selector(first1, first2); __gnu_parallel:: - for_each_template_random_access(first1, last1, binary_op2, + for_each_template_random_access_ed(first1, last1, binary_op2, my_selector, binary_op1, - res, res, -1, parallelism_tag); + res, res, -1); return res; } else @@ -432,10 +432,10 @@ namespace __parallel end_pair(end, result + (end - begin)); __gnu_parallel::adjacent_difference_selector functionality; __gnu_parallel:: - for_each_template_random_access(begin_pair, end_pair, bin_op, + for_each_template_random_access_ed(begin_pair, end_pair, bin_op, functionality, __gnu_parallel::dummy_reduct(), - dummy, dummy, -1, parallelism_tag); + dummy, dummy, -1); return functionality.finish_iterator; } else diff --git a/libstdc++-v3/include/parallel/numericfwd.h b/libstdc++-v3/include/parallel/numericfwd.h index 362725b4a67..b9bbe967fe2 100644 --- a/libstdc++-v3/include/parallel/numericfwd.h +++ b/libstdc++-v3/include/parallel/numericfwd.h @@ -83,7 +83,8 @@ namespace __parallel _Tp accumulate_switch(_RAIter, _RAIter, _Tp, _BinaryOper, random_access_iterator_tag, - __gnu_parallel::_Parallelism); + __gnu_parallel::_Parallelism parallelism + = __gnu_parallel::parallel_unbalanced); template _OIter @@ -124,7 +125,8 @@ namespace __parallel adjacent_difference_switch(_IIter, _IIter, _OIter, _BinaryOper, random_access_iterator_tag, random_access_iterator_tag, - __gnu_parallel::_Parallelism); + __gnu_parallel::_Parallelism parallelism + = __gnu_parallel::parallel_unbalanced); template _Tp @@ -164,7 +166,8 @@ namespace __parallel inner_product_switch(_RAIter1, _RAIter1, _RAIter2, _Tp, BinaryFunction1, BinaryFunction2, random_access_iterator_tag, random_access_iterator_tag, - __gnu_parallel::_Parallelism); + __gnu_parallel::_Parallelism + = __gnu_parallel::parallel_unbalanced); template #include #include +#include namespace __gnu_parallel { @@ -80,9 +81,9 @@ template traits_type; typedef typename traits_type::difference_type difference_type; - const difference_type length = end - begin; Result *thread_results; + bool* constructed; thread_index_t num_threads = __gnu_parallel::min(get_max_threads(), length); @@ -92,13 +93,15 @@ template( + ::operator new(num_threads * sizeof(Result))); + constructed = new bool[num_threads]; } thread_index_t iam = omp_get_thread_num(); // Neutral element. - Result reduct = Result(); + Result* reduct = static_cast(::operator new(sizeof(Result))); difference_type start = equally_split_point(length, num_threads, iam), @@ -106,23 +109,30 @@ template