This is the mail archive of the
libstdc++@gcc.gnu.org
mailing list for the libstdc++ project.
[v3] A few more uglification and formatting issues in parallel
- From: Paolo Carlini <paolo dot carlini at oracle dot com>
- To: "gcc-patches at gcc dot gnu dot org" <gcc-patches at gcc dot gnu dot org>
- Cc: libstdc++ <libstdc++ at gcc dot gnu dot org>
- Date: Thu, 05 Nov 2009 15:07:41 +0100
- Subject: [v3] A few more uglification and formatting issues in parallel
Hi,
tested x86_64-linux, committed.
Paolo.
///////////////////
2009-11-05 Paolo Carlini <paolo.carlini@oracle.com>
* include/parallel/multiway_merge.h: Simple formatting and
uglification fixes.
* include/parallel/losertree.h: Likewise.
* include/parallel/base.h: Likewise.
* include/parallel/par_loop.h: Likewise.
* include/parallel/omp_loop_static.h: Likewise.
* include/parallel/multiway_mergesort.h: Likewise.
* include/parallel/partial_sum.h: Likewise.
* include/parallel/omp_loop.h: Likewise.
Index: include/parallel/multiway_merge.h
===================================================================
--- include/parallel/multiway_merge.h (revision 153933)
+++ include/parallel/multiway_merge.h (working copy)
@@ -54,24 +54,6 @@
namespace __gnu_parallel
{
-
-// Announce guarded and unguarded iterator.
-
-template<typename _RAIter, typename _Compare>
- class _GuardedIterator;
-
-// Making the arguments const references seems to dangerous,
-// the user-defined comparator might not be const.
-template<typename _RAIter, typename _Compare>
- inline bool
- operator<(_GuardedIterator<_RAIter, _Compare>& __bi1,
- _GuardedIterator<_RAIter, _Compare>& __bi2);
-
-template<typename _RAIter, typename _Compare>
- inline bool
- operator<=(_GuardedIterator<_RAIter, _Compare>& __bi1,
- _GuardedIterator<_RAIter, _Compare>& __bi2);
-
/** @brief _Iterator wrapper supporting an implicit supremum at the end
* of the sequence, dominating all comparisons.
*
@@ -96,12 +78,11 @@
public:
/** @brief Constructor. Sets iterator to beginning of sequence.
* @param __begin Begin iterator of sequence.
- * @param _M_end End iterator of sequence.
+ * @param __end End iterator of sequence.
* @param __comp Comparator provided for associated overloaded
* compare operators. */
- _GuardedIterator(_RAIter __begin,
- _RAIter _M_end, _Compare& __comp)
- : _M_current(__begin), _M_end(_M_end), __comp(__comp)
+ _GuardedIterator(_RAIter __begin, _RAIter __end, _Compare& __comp)
+ : _M_current(__begin), _M_end(__end), __comp(__comp)
{ }
/** @brief Pre-increment operator.
@@ -124,63 +105,38 @@
operator _RAIter()
{ return _M_current; }
+ /** @brief Compare two elements referenced by guarded iterators.
+ * @param __bi1 First iterator.
+ * @param __bi2 Second iterator.
+ * @return @__c true if less. */
friend bool
- operator< <_RAIter, _Compare>(
- _GuardedIterator<_RAIter, _Compare>& __bi1,
- _GuardedIterator<_RAIter, _Compare>& __bi2);
+ operator<(_GuardedIterator<_RAIter, _Compare>& __bi1,
+ _GuardedIterator<_RAIter, _Compare>& __bi2)
+ {
+ if (__bi1._M_current == __bi1._M_end) //__bi1 is sup
+ return __bi2._M_current == __bi2._M_end; //__bi2 is not sup
+ if (__bi2._M_current == __bi2._M_end) //__bi2 is sup
+ return true;
+ return (__bi1.__comp)(*__bi1, *__bi2); //normal compare
+ }
+ /** @brief Compare two elements referenced by guarded iterators.
+ * @param __bi1 First iterator.
+ * @param __bi2 Second iterator.
+ * @return @__c True if less equal. */
friend bool
- operator<= <_RAIter, _Compare>(
- _GuardedIterator<_RAIter, _Compare>& __bi1,
- _GuardedIterator<_RAIter, _Compare>& __bi2);
+ operator<=(_GuardedIterator<_RAIter, _Compare>& __bi1,
+ _GuardedIterator<_RAIter, _Compare>& __bi2)
+ {
+ if (__bi2._M_current == __bi2._M_end) //__bi1 is sup
+ return __bi1._M_current != __bi1._M_end; //__bi2 is not sup
+ if (__bi1._M_current == __bi1._M_end) //__bi2 is sup
+ return false;
+ return !(__bi1.__comp)(*__bi2, *__bi1); //normal compare
+ }
};
-/** @brief Compare two elements referenced by guarded iterators.
- * @param __bi1 First iterator.
- * @param __bi2 Second iterator.
- * @return @__c true if less. */
template<typename _RAIter, typename _Compare>
- inline bool
- operator<(_GuardedIterator<_RAIter, _Compare>& __bi1,
- _GuardedIterator<_RAIter, _Compare>& __bi2)
- {
- if (__bi1._M_current == __bi1._M_end) //__bi1 is sup
- return __bi2._M_current == __bi2._M_end; //__bi2 is not sup
- if (__bi2._M_current == __bi2._M_end) //__bi2 is sup
- return true;
- return (__bi1.__comp)(*__bi1, *__bi2); //normal compare
- }
-
-/** @brief Compare two elements referenced by guarded iterators.
- * @param __bi1 First iterator.
- * @param __bi2 Second iterator.
- * @return @__c True if less equal. */
-template<typename _RAIter, typename _Compare>
- inline bool
- operator<=(_GuardedIterator<_RAIter, _Compare>& __bi1,
- _GuardedIterator<_RAIter, _Compare>& __bi2)
- {
- if (__bi2._M_current == __bi2._M_end) //__bi1 is sup
- return __bi1._M_current != __bi1._M_end; //__bi2 is not sup
- if (__bi1._M_current == __bi1._M_end) //__bi2 is sup
- return false;
- return !(__bi1.__comp)(*__bi2, *__bi1); //normal compare
- }
-
-template<typename _RAIter, typename _Compare>
- class _UnguardedIterator;
-
-template<typename _RAIter, typename _Compare>
- inline bool
- operator<(_UnguardedIterator<_RAIter, _Compare>& __bi1,
- _UnguardedIterator<_RAIter, _Compare>& __bi2);
-
-template<typename _RAIter, typename _Compare>
- inline bool
- operator<=(_UnguardedIterator<_RAIter, _Compare>& __bi1,
- _UnguardedIterator<_RAIter, _Compare>& __bi2);
-
-template<typename _RAIter, typename _Compare>
class _UnguardedIterator
{
private:
@@ -192,10 +148,10 @@
public:
/** @brief Constructor. Sets iterator to beginning of sequence.
* @param __begin Begin iterator of sequence.
- * @param _M_end Unused, only for compatibility.
+ * @param __end Unused, only for compatibility.
* @param __comp Unused, only for compatibility. */
_UnguardedIterator(_RAIter __begin,
- _RAIter _M_end, _Compare& __comp)
+ _RAIter /* __end */, _Compare& __comp)
: _M_current(__begin), __comp(__comp)
{ }
@@ -219,43 +175,31 @@
operator _RAIter()
{ return _M_current; }
+ /** @brief Compare two elements referenced by unguarded iterators.
+ * @param __bi1 First iterator.
+ * @param __bi2 Second iterator.
+ * @return @__c true if less. */
friend bool
- operator< <_RAIter, _Compare>(
- _UnguardedIterator<_RAIter, _Compare>& __bi1,
- _UnguardedIterator<_RAIter, _Compare>& __bi2);
+ operator<(_UnguardedIterator<_RAIter, _Compare>& __bi1,
+ _UnguardedIterator<_RAIter, _Compare>& __bi2)
+ {
+ // Normal compare.
+ return (__bi1.__comp)(*__bi1, *__bi2);
+ }
+ /** @brief Compare two elements referenced by unguarded iterators.
+ * @param __bi1 First iterator.
+ * @param __bi2 Second iterator.
+ * @return @__c True if less equal. */
friend bool
- operator<= <_RAIter, _Compare>(
- _UnguardedIterator<_RAIter, _Compare>& __bi1,
- _UnguardedIterator<_RAIter, _Compare>& __bi2);
+ operator<=(_UnguardedIterator<_RAIter, _Compare>& __bi1,
+ _UnguardedIterator<_RAIter, _Compare>& __bi2)
+ {
+ // Normal compare.
+ return !(__bi1.__comp)(*__bi2, *__bi1);
+ }
};
-/** @brief Compare two elements referenced by unguarded iterators.
- * @param __bi1 First iterator.
- * @param __bi2 Second iterator.
- * @return @__c true if less. */
-template<typename _RAIter, typename _Compare>
- inline bool
- operator<(_UnguardedIterator<_RAIter, _Compare>& __bi1,
- _UnguardedIterator<_RAIter, _Compare>& __bi2)
- {
- // Normal compare.
- return (__bi1.__comp)(*__bi1, *__bi2);
- }
-
-/** @brief Compare two elements referenced by unguarded iterators.
- * @param __bi1 First iterator.
- * @param __bi2 Second iterator.
- * @return @__c True if less equal. */
-template<typename _RAIter, typename _Compare>
- inline bool
- operator<=(_UnguardedIterator<_RAIter, _Compare>& __bi1,
- _UnguardedIterator<_RAIter, _Compare>& __bi2)
- {
- // Normal compare.
- return !(__bi1.__comp)(*__bi2, *__bi1);
- }
-
/** @brief Highly efficient 3-way merging procedure.
*
* Merging is done with the algorithm implementation described by Peter
@@ -287,11 +231,10 @@
typename _DifferenceTp,
typename _Compare>
_RAIter3
- multiway_merge_3_variant(
- _RAIterIterator __seqs_begin,
- _RAIterIterator __seqs_end,
- _RAIter3 __target,
- _DifferenceTp __length, _Compare __comp)
+ multiway_merge_3_variant(_RAIterIterator __seqs_begin,
+ _RAIterIterator __seqs_end,
+ _RAIter3 __target,
+ _DifferenceTp __length, _Compare __comp)
{
_GLIBCXX_CALL(__length);
@@ -612,15 +555,14 @@
typename _RAIter3,
typename _DifferenceTp, typename _Compare>
_RAIter3
- multiway_merge_loser_tree_unguarded(
- _RAIterIterator __seqs_begin,
- _RAIterIterator __seqs_end,
- _RAIter3 __target,
- const typename std::iterator_traits<typename std::iterator_traits<
- _RAIterIterator>::value_type::first_type>::value_type&
- __sentinel,
- _DifferenceTp __length,
- _Compare __comp)
+ multiway_merge_loser_tree_unguarded(_RAIterIterator __seqs_begin,
+ _RAIterIterator __seqs_end,
+ _RAIter3 __target,
+ const typename std::iterator_traits<typename std::iterator_traits<
+ _RAIterIterator>::value_type::first_type>::value_type&
+ __sentinel,
+ _DifferenceTp __length,
+ _Compare __comp)
{
_GLIBCXX_CALL(__length)
typedef _DifferenceTp _DifferenceType;
@@ -702,15 +644,14 @@
typename _DifferenceTp,
typename _Compare>
_RAIter3
- multiway_merge_loser_tree_sentinel(
- _RAIterIterator __seqs_begin,
- _RAIterIterator __seqs_end,
- _RAIter3 __target,
+ multiway_merge_loser_tree_sentinel(_RAIterIterator __seqs_begin,
+ _RAIterIterator __seqs_end,
+ _RAIter3 __target,
const typename std::iterator_traits<typename std::iterator_traits<
_RAIterIterator>::value_type::first_type>::value_type&
- __sentinel,
- _DifferenceTp __length,
- _Compare __comp)
+ __sentinel,
+ _DifferenceTp __length,
+ _Compare __comp)
{
_GLIBCXX_CALL(__length)
@@ -773,16 +714,16 @@
* @param _Tp type to give the loser tree traits for.
*/
template <typename _Tp>
-struct _LoserTreeTraits
-{
- /**
- * @brief True iff to use pointers instead of values in loser trees.
- *
- * The default behavior is to use pointers if the data type is four
- * times as big as the pointer to it.
- */
- static const bool _M_use_pointer = (sizeof(_Tp) > 4 * sizeof(_Tp*));
-};
+ struct _LoserTreeTraits
+ {
+ /**
+ * @brief True iff to use pointers instead of values in loser trees.
+ *
+ * The default behavior is to use pointers if the data type is four
+ * times as big as the pointer to it.
+ */
+ static const bool _M_use_pointer = (sizeof(_Tp) > 4 * sizeof(_Tp*));
+ };
/**
* @brief Switch for 3-way merging with __sentinels turned off.
@@ -796,10 +737,11 @@
typename _Compare>
struct __multiway_merge_3_variant_sentinel_switch
{
- _RAIter3 operator()(_RAIterIterator __seqs_begin,
- _RAIterIterator __seqs_end,
- _RAIter3 __target,
- _DifferenceTp __length, _Compare __comp)
+ _RAIter3
+ operator()(_RAIterIterator __seqs_begin,
+ _RAIterIterator __seqs_end,
+ _RAIter3 __target,
+ _DifferenceTp __length, _Compare __comp)
{
return multiway_merge_3_variant<_GuardedIterator>
(__seqs_begin, __seqs_end, __target, __length, __comp);
@@ -815,13 +757,15 @@
typename _RAIter3,
typename _DifferenceTp,
typename _Compare>
- struct __multiway_merge_3_variant_sentinel_switch
- <true, _RAIterIterator, _RAIter3, _DifferenceTp, _Compare>
+ struct __multiway_merge_3_variant_sentinel_switch<true, _RAIterIterator,
+ _RAIter3, _DifferenceTp,
+ _Compare>
{
- _RAIter3 operator()(_RAIterIterator __seqs_begin,
- _RAIterIterator __seqs_end,
- _RAIter3 __target,
- _DifferenceTp __length, _Compare __comp)
+ _RAIter3
+ operator()(_RAIterIterator __seqs_begin,
+ _RAIterIterator __seqs_end,
+ _RAIter3 __target,
+ _DifferenceTp __length, _Compare __comp)
{
return multiway_merge_3_variant<_UnguardedIterator>
(__seqs_begin, __seqs_end, __target, __length, __comp);
@@ -840,10 +784,11 @@
typename _Compare>
struct __multiway_merge_4_variant_sentinel_switch
{
- _RAIter3 operator()(_RAIterIterator __seqs_begin,
- _RAIterIterator __seqs_end,
- _RAIter3 __target,
- _DifferenceTp __length, _Compare __comp)
+ _RAIter3
+ operator()(_RAIterIterator __seqs_begin,
+ _RAIterIterator __seqs_end,
+ _RAIter3 __target,
+ _DifferenceTp __length, _Compare __comp)
{
return multiway_merge_4_variant<_GuardedIterator>
(__seqs_begin, __seqs_end, __target, __length, __comp);
@@ -859,13 +804,15 @@
typename _RAIter3,
typename _DifferenceTp,
typename _Compare>
- struct __multiway_merge_4_variant_sentinel_switch
- <true, _RAIterIterator, _RAIter3, _DifferenceTp, _Compare>
+ struct __multiway_merge_4_variant_sentinel_switch<true, _RAIterIterator,
+ _RAIter3, _DifferenceTp,
+ _Compare>
{
- _RAIter3 operator()(_RAIterIterator __seqs_begin,
- _RAIterIterator __seqs_end,
- _RAIter3 __target,
- _DifferenceTp __length, _Compare __comp)
+ _RAIter3
+ operator()(_RAIterIterator __seqs_begin,
+ _RAIterIterator __seqs_end,
+ _RAIter3 __target,
+ _DifferenceTp __length, _Compare __comp)
{
return multiway_merge_4_variant<_UnguardedIterator>
(__seqs_begin, __seqs_end, __target, __length, __comp);
@@ -882,30 +829,30 @@
typename _DifferenceTp,
typename _Compare>
struct __multiway_merge_k_variant_sentinel_switch
- {
- _RAIter3 operator()
- (_RAIterIterator __seqs_begin,
- _RAIterIterator __seqs_end,
- _RAIter3 __target,
- const typename std::iterator_traits<typename std::iterator_traits<
- _RAIterIterator>::value_type::first_type>::value_type&
- __sentinel,
- _DifferenceTp __length, _Compare __comp)
- {
- typedef typename std::iterator_traits<_RAIterIterator>
- ::value_type::first_type
- _RAIter1;
- typedef typename std::iterator_traits<_RAIter1>::value_type
- _ValueType;
+ {
+ _RAIter3
+ operator()(_RAIterIterator __seqs_begin,
+ _RAIterIterator __seqs_end,
+ _RAIter3 __target,
+ const typename std::iterator_traits<typename std::iterator_traits<
+ _RAIterIterator>::value_type::first_type>::value_type&
+ __sentinel,
+ _DifferenceTp __length, _Compare __comp)
+ {
+ typedef typename std::iterator_traits<_RAIterIterator>
+ ::value_type::first_type
+ _RAIter1;
+ typedef typename std::iterator_traits<_RAIter1>::value_type
+ _ValueType;
- return multiway_merge_loser_tree_sentinel<
- typename __gnu_cxx::__conditional_type<
- _LoserTreeTraits<_ValueType>::_M_use_pointer,
- _LoserTreePointerUnguarded<__stable, _ValueType, _Compare>,
- _LoserTreeUnguarded<__stable, _ValueType, _Compare>
- >::__type>(
- __seqs_begin, __seqs_end, __target, __sentinel, __length, __comp);
- }
+ return multiway_merge_loser_tree_sentinel<
+ typename __gnu_cxx::__conditional_type<
+ _LoserTreeTraits<_ValueType>::_M_use_pointer,
+ _LoserTreePointerUnguarded<__stable, _ValueType, _Compare>,
+ _LoserTreeUnguarded<__stable, _ValueType, _Compare>
+ >::__type>
+ (__seqs_begin, __seqs_end, __target, __sentinel, __length, __comp);
+ }
};
/**
@@ -916,17 +863,18 @@
typename _RAIter3,
typename _DifferenceTp,
typename _Compare>
- struct __multiway_merge_k_variant_sentinel_switch
- <false, __stable, _RAIterIterator, _RAIter3, _DifferenceTp, _Compare>
+ struct __multiway_merge_k_variant_sentinel_switch<false, __stable,
+ _RAIterIterator, _RAIter3,
+ _DifferenceTp, _Compare>
{
- _RAIter3 operator()
- (_RAIterIterator __seqs_begin,
- _RAIterIterator __seqs_end,
- _RAIter3 __target,
+ _RAIter3
+ operator()(_RAIterIterator __seqs_begin,
+ _RAIterIterator __seqs_end,
+ _RAIter3 __target,
const typename std::iterator_traits<typename std::iterator_traits<
_RAIterIterator>::value_type::first_type>::value_type&
- __sentinel,
- _DifferenceTp __length, _Compare __comp)
+ __sentinel,
+ _DifferenceTp __length, _Compare __comp)
{
typedef typename std::iterator_traits<_RAIterIterator>
::value_type::first_type
@@ -963,14 +911,13 @@
typename _DifferenceTp,
typename _Compare>
_RAIter3
- __sequential_multiway_merge(
- _RAIterIterator __seqs_begin,
- _RAIterIterator __seqs_end,
- _RAIter3 __target,
+ __sequential_multiway_merge(_RAIterIterator __seqs_begin,
+ _RAIterIterator __seqs_end,
+ _RAIter3 __target,
const typename std::iterator_traits<typename std::iterator_traits<
_RAIterIterator>::value_type::first_type>::value_type&
- __sentinel,
- _DifferenceTp __length, _Compare __comp)
+ __sentinel,
+ _DifferenceTp __length, _Compare __comp)
{
_GLIBCXX_CALL(__length)
@@ -1061,8 +1008,8 @@
template<bool __stable, class _RAIter, class _StrictWeakOrdering>
struct _SamplingSorter
{
- void operator()(_RAIter __first, _RAIter __last,
- _StrictWeakOrdering __comp)
+ void
+ operator()(_RAIter __first, _RAIter __last, _StrictWeakOrdering __comp)
{ __gnu_sequential::stable_sort(__first, __last, __comp); }
};
@@ -1074,8 +1021,8 @@
template<class _RAIter, class _StrictWeakOrdering>
struct _SamplingSorter<false, _RAIter, _StrictWeakOrdering>
{
- void operator()(_RAIter __first, _RAIter __last,
- _StrictWeakOrdering __comp)
+ void
+ operator()(_RAIter __first, _RAIter __last, _StrictWeakOrdering __comp)
{ __gnu_sequential::sort(__first, __last, __comp); }
};
@@ -1087,10 +1034,11 @@
typename _Compare,
typename _DifferenceType>
void
- multiway_merge_sampling_splitting
- (_RAIterIterator __seqs_begin,
- _RAIterIterator __seqs_end,
- _DifferenceType __length, _DifferenceType __total_length, _Compare __comp,
+ multiway_merge_sampling_splitting(_RAIterIterator __seqs_begin,
+ _RAIterIterator __seqs_end,
+ _DifferenceType __length,
+ _DifferenceType __total_length,
+ _Compare __comp,
std::vector<std::pair<_DifferenceType, _DifferenceType> > *__pieces)
{
typedef typename std::iterator_traits<_RAIterIterator>
@@ -1168,11 +1116,11 @@
typename _Compare,
typename _DifferenceType>
void
- multiway_merge_exact_splitting
- (_RAIterIterator __seqs_begin,
- _RAIterIterator __seqs_end,
- _DifferenceType __length, _DifferenceType __total_length,
- _Compare __comp,
+ multiway_merge_exact_splitting(_RAIterIterator __seqs_begin,
+ _RAIterIterator __seqs_end,
+ _DifferenceType __length,
+ _DifferenceType __total_length,
+ _Compare __comp,
std::vector<std::pair<_DifferenceType, _DifferenceType> > *__pieces)
{
typedef typename std::iterator_traits<_RAIterIterator>
Index: include/parallel/losertree.h
===================================================================
--- include/parallel/losertree.h (revision 153933)
+++ include/parallel/losertree.h (working copy)
@@ -163,7 +163,8 @@
*/
template<bool __stable/* default == true */, typename _Tp,
typename _Compare>
- class _LoserTree : public _LoserTreeBase<_Tp, _Compare>
+ class _LoserTree
+ : public _LoserTreeBase<_Tp, _Compare>
{
typedef _LoserTreeBase<_Tp, _Compare> _Base;
using _Base::_M_k;
@@ -797,7 +798,7 @@
* run empty. This is a very fast variant.
*/
template<typename _Tp, typename _Compare>
- class LoserTreePointerUnguardedBase
+ class _LoserTreePointerUnguardedBase
{
protected:
struct _Loser
@@ -812,8 +813,8 @@
public:
- LoserTreePointerUnguardedBase(unsigned int __k, const _Tp& _sentinel,
- _Compare __comp = std::less<_Tp>())
+ _LoserTreePointerUnguardedBase(unsigned int __k, const _Tp& _sentinel,
+ _Compare __comp = std::less<_Tp>())
: _M_comp(__comp)
{
_M_ik = __k;
@@ -831,7 +832,7 @@
}
}
- ~LoserTreePointerUnguardedBase()
+ ~_LoserTreePointerUnguardedBase()
{ delete[] _M_losers; }
int
@@ -861,16 +862,16 @@
*/
template<bool __stable/* default == true */, typename _Tp, typename _Compare>
class _LoserTreePointerUnguarded
- : public LoserTreePointerUnguardedBase<_Tp, _Compare>
+ : public _LoserTreePointerUnguardedBase<_Tp, _Compare>
{
- typedef LoserTreePointerUnguardedBase<_Tp, _Compare> _Base;
+ typedef _LoserTreePointerUnguardedBase<_Tp, _Compare> _Base;
using _Base::_M_k;
using _Base::_M_losers;
public:
_LoserTreePointerUnguarded(unsigned int __k, const _Tp& _sentinel,
_Compare __comp = std::less<_Tp>())
- : _Base::LoserTreePointerUnguardedBase(__k, _sentinel, __comp)
+ : _Base::_LoserTreePointerUnguardedBase(__k, _sentinel, __comp)
{ }
unsigned int
@@ -945,16 +946,16 @@
*/
template<typename _Tp, typename _Compare>
class _LoserTreePointerUnguarded</* __stable == */false, _Tp, _Compare>
- : public LoserTreePointerUnguardedBase<_Tp, _Compare>
+ : public _LoserTreePointerUnguardedBase<_Tp, _Compare>
{
- typedef LoserTreePointerUnguardedBase<_Tp, _Compare> _Base;
+ typedef _LoserTreePointerUnguardedBase<_Tp, _Compare> _Base;
using _Base::_M_k;
using _Base::_M_losers;
public:
_LoserTreePointerUnguarded(unsigned int __k, const _Tp& _sentinel,
_Compare __comp = std::less<_Tp>())
- : _Base::LoserTreePointerUnguardedBase(__k, _sentinel, __comp)
+ : _Base::_LoserTreePointerUnguardedBase(__k, _sentinel, __comp)
{ }
unsigned int
Index: include/parallel/base.h
===================================================================
--- include/parallel/base.h (revision 153933)
+++ include/parallel/base.h (working copy)
@@ -93,13 +93,13 @@
__is_parallel(const _Parallelism __p) { return __p != sequential; }
-/** @brief Calculates the rounded-down logarithm of @__c __n for base 2.
- * @param __n Argument.
- * @return Returns 0 for any argument <1.
- */
-template<typename _Size>
- inline _Size
- __rd_log2(_Size __n)
+ /** @brief Calculates the rounded-down logarithm of @__c __n for base 2.
+ * @param __n Argument.
+ * @return Returns 0 for any argument <1.
+ */
+ template<typename _Size>
+ inline _Size
+ __rd_log2(_Size __n)
{
_Size __k;
for (__k = 0; __n > 1; __n >>= 1)
@@ -107,356 +107,352 @@
return __k;
}
-/** @brief Encode two integers into one gnu_parallel::_CASable.
- * @param __a First integer, to be encoded in the most-significant @__c
- * _CASable_bits/2 bits.
- * @param __b Second integer, to be encoded in the least-significant
- * @__c _CASable_bits/2 bits.
- * @return value encoding @__c __a and @__c __b.
- * @see decode2
- */
-inline _CASable
-__encode2(int __a, int __b) //must all be non-negative, actually
-{
- return (((_CASable)__a) << (_CASable_bits / 2)) | (((_CASable)__b) << 0);
-}
+ /** @brief Encode two integers into one gnu_parallel::_CASable.
+ * @param __a First integer, to be encoded in the most-significant @__c
+ * _CASable_bits/2 bits.
+ * @param __b Second integer, to be encoded in the least-significant
+ * @__c _CASable_bits/2 bits.
+ * @return value encoding @__c __a and @__c __b.
+ * @see decode2
+ */
+ inline _CASable
+ __encode2(int __a, int __b) //must all be non-negative, actually
+ {
+ return (((_CASable)__a) << (_CASable_bits / 2)) | (((_CASable)__b) << 0);
+ }
-/** @brief Decode two integers from one gnu_parallel::_CASable.
- * @param __x __gnu_parallel::_CASable to decode integers from.
- * @param __a First integer, to be decoded from the most-significant
- * @__c _CASable_bits/2 bits of @__c __x.
- * @param __b Second integer, to be encoded in the least-significant
- * @__c _CASable_bits/2 bits of @__c __x.
- * @see __encode2
- */
-inline void
-decode2(_CASable __x, int& __a, int& __b)
-{
- __a = (int)((__x >> (_CASable_bits / 2)) & _CASable_mask);
- __b = (int)((__x >> 0 ) & _CASable_mask);
-}
+ /** @brief Decode two integers from one gnu_parallel::_CASable.
+ * @param __x __gnu_parallel::_CASable to decode integers from.
+ * @param __a First integer, to be decoded from the most-significant
+ * @__c _CASable_bits/2 bits of @__c __x.
+ * @param __b Second integer, to be encoded in the least-significant
+ * @__c _CASable_bits/2 bits of @__c __x.
+ * @see __encode2
+ */
+ inline void
+ decode2(_CASable __x, int& __a, int& __b)
+ {
+ __a = (int)((__x >> (_CASable_bits / 2)) & _CASable_mask);
+ __b = (int)((__x >> 0 ) & _CASable_mask);
+ }
-//needed for parallel "numeric", even if "algorithm" not included
+ //needed for parallel "numeric", even if "algorithm" not included
-/** @brief Equivalent to std::min. */
-template<typename _Tp>
- const _Tp&
- min(const _Tp& __a, const _Tp& __b)
- { return (__a < __b) ? __a : __b; }
+ /** @brief Equivalent to std::min. */
+ template<typename _Tp>
+ const _Tp&
+ min(const _Tp& __a, const _Tp& __b)
+ { return (__a < __b) ? __a : __b; }
-/** @brief Equivalent to std::max. */
-template<typename _Tp>
- const _Tp&
- max(const _Tp& __a, const _Tp& __b)
- { return (__a > __b) ? __a : __b; }
+ /** @brief Equivalent to std::max. */
+ template<typename _Tp>
+ const _Tp&
+ max(const _Tp& __a, const _Tp& __b)
+ { return (__a > __b) ? __a : __b; }
-/** @brief Constructs predicate for equality from strict weak
- * ordering predicate
- */
-template<typename _T1, typename _T2, typename _Compare>
- class _EqualFromLess : public std::binary_function<_T1, _T2, bool>
- {
- private:
- _Compare& _M_comp;
+ /** @brief Constructs predicate for equality from strict weak
+ * ordering predicate
+ */
+ template<typename _T1, typename _T2, typename _Compare>
+ class _EqualFromLess : public std::binary_function<_T1, _T2, bool>
+ {
+ private:
+ _Compare& _M_comp;
- public:
- _EqualFromLess(_Compare& __comp) : _M_comp(__comp) { }
+ public:
+ _EqualFromLess(_Compare& __comp) : _M_comp(__comp) { }
- bool operator()(const _T1& __a, const _T2& __b)
- {
- return !_M_comp(__a, __b) && !_M_comp(__b, __a);
- }
- };
+ bool operator()(const _T1& __a, const _T2& __b)
+ { return !_M_comp(__a, __b) && !_M_comp(__b, __a); }
+ };
-/** @brief Similar to std::binder1st,
- * but giving the argument types explicitly. */
-template<typename _Predicate, typename argument_type>
- class __unary_negate
- : public std::unary_function<argument_type, bool>
- {
- protected:
- _Predicate _M_pred;
+ /** @brief Similar to std::binder1st,
+ * but giving the argument types explicitly. */
+ template<typename _Predicate, typename argument_type>
+ class __unary_negate
+ : public std::unary_function<argument_type, bool>
+ {
+ protected:
+ _Predicate _M_pred;
- public:
- explicit
- __unary_negate(const _Predicate& __x) : _M_pred(__x) { }
+ public:
+ explicit
+ __unary_negate(const _Predicate& __x) : _M_pred(__x) { }
- bool
- operator()(const argument_type& __x)
- { return !_M_pred(__x); }
- };
+ bool
+ operator()(const argument_type& __x)
+ { return !_M_pred(__x); }
+ };
-/** @brief Similar to std::binder1st,
- * but giving the argument types explicitly. */
-template<typename _Operation, typename _FirstArgumentType,
- typename _SecondArgumentType, typename _ResultType>
- class __binder1st
- : public std::unary_function<_SecondArgumentType, _ResultType>
- {
- protected:
- _Operation _M_op;
- _FirstArgumentType _M_value;
+ /** @brief Similar to std::binder1st,
+ * but giving the argument types explicitly. */
+ template<typename _Operation, typename _FirstArgumentType,
+ typename _SecondArgumentType, typename _ResultType>
+ class __binder1st
+ : public std::unary_function<_SecondArgumentType, _ResultType>
+ {
+ protected:
+ _Operation _M_op;
+ _FirstArgumentType _M_value;
- public:
- __binder1st(const _Operation& __x,
- const _FirstArgumentType& __y)
- : _M_op(__x), _M_value(__y) { }
+ public:
+ __binder1st(const _Operation& __x, const _FirstArgumentType& __y)
+ : _M_op(__x), _M_value(__y) { }
- _ResultType
- operator()(const _SecondArgumentType& __x)
- { return _M_op(_M_value, __x); }
+ _ResultType
+ operator()(const _SecondArgumentType& __x)
+ { return _M_op(_M_value, __x); }
- // _GLIBCXX_RESOLVE_LIB_DEFECTS
- // 109. Missing binders for non-const sequence elements
- _ResultType
- operator()(_SecondArgumentType& __x) const
- { return _M_op(_M_value, __x); }
- };
+ // _GLIBCXX_RESOLVE_LIB_DEFECTS
+ // 109. Missing binders for non-const sequence elements
+ _ResultType
+ operator()(_SecondArgumentType& __x) const
+ { return _M_op(_M_value, __x); }
+ };
-/**
- * @brief Similar to std::binder2nd, but giving the argument types
- * explicitly.
- */
-template<typename _Operation, typename _FirstArgumentType,
- typename _SecondArgumentType, typename _ResultType>
- class binder2nd
- : public std::unary_function<_FirstArgumentType, _ResultType>
- {
- protected:
- _Operation _M_op;
- _SecondArgumentType _M_value;
+ /**
+ * @brief Similar to std::binder2nd, but giving the argument types
+ * explicitly.
+ */
+ template<typename _Operation, typename _FirstArgumentType,
+ typename _SecondArgumentType, typename _ResultType>
+ class binder2nd
+ : public std::unary_function<_FirstArgumentType, _ResultType>
+ {
+ protected:
+ _Operation _M_op;
+ _SecondArgumentType _M_value;
- public:
- binder2nd(const _Operation& __x,
- const _SecondArgumentType& __y)
- : _M_op(__x), _M_value(__y) { }
+ public:
+ binder2nd(const _Operation& __x, const _SecondArgumentType& __y)
+ : _M_op(__x), _M_value(__y) { }
- _ResultType
- operator()(const _FirstArgumentType& __x) const
- { return _M_op(__x, _M_value); }
+ _ResultType
+ operator()(const _FirstArgumentType& __x) const
+ { return _M_op(__x, _M_value); }
- // _GLIBCXX_RESOLVE_LIB_DEFECTS
- // 109. Missing binders for non-const sequence elements
- _ResultType
- operator()(_FirstArgumentType& __x)
- { return _M_op(__x, _M_value); }
- };
+ // _GLIBCXX_RESOLVE_LIB_DEFECTS
+ // 109. Missing binders for non-const sequence elements
+ _ResultType
+ operator()(_FirstArgumentType& __x)
+ { return _M_op(__x, _M_value); }
+ };
-/** @brief Similar to std::equal_to, but allows two different types. */
-template<typename _T1, typename _T2>
- struct _EqualTo : std::binary_function<_T1, _T2, bool>
- {
- bool operator()(const _T1& __t1, const _T2& __t2) const
- { return __t1 == __t2; }
- };
+ /** @brief Similar to std::equal_to, but allows two different types. */
+ template<typename _T1, typename _T2>
+ struct _EqualTo : std::binary_function<_T1, _T2, bool>
+ {
+ bool operator()(const _T1& __t1, const _T2& __t2) const
+ { return __t1 == __t2; }
+ };
-/** @brief Similar to std::less, but allows two different types. */
-template<typename _T1, typename _T2>
- struct _Less : std::binary_function<_T1, _T2, bool>
- {
- bool
- operator()(const _T1& __t1, const _T2& __t2) const
- { return __t1 < __t2; }
+ /** @brief Similar to std::less, but allows two different types. */
+ template<typename _T1, typename _T2>
+ struct _Less : std::binary_function<_T1, _T2, bool>
+ {
+ bool
+ operator()(const _T1& __t1, const _T2& __t2) const
+ { return __t1 < __t2; }
- bool
- operator()(const _T2& __t2, const _T1& __t1) const
- { return __t2 < __t1; }
- };
+ bool
+ operator()(const _T2& __t2, const _T1& __t1) const
+ { return __t2 < __t1; }
+ };
-// Partial specialization for one type. Same as std::less.
-template<typename _Tp>
-struct _Less<_Tp, _Tp> : public std::binary_function<_Tp, _Tp, bool>
- {
- bool
- operator()(const _Tp& __x, const _Tp& __y) const
- { return __x < __y; }
- };
+ // Partial specialization for one type. Same as std::less.
+ template<typename _Tp>
+ struct _Less<_Tp, _Tp> : public std::binary_function<_Tp, _Tp, bool>
+ {
+ bool
+ operator()(const _Tp& __x, const _Tp& __y) const
+ { return __x < __y; }
+ };
/** @brief Similar to std::plus, but allows two different types. */
-template<typename _Tp1, typename _Tp2>
- struct _Plus : public std::binary_function<_Tp1, _Tp2, _Tp1>
- {
- typedef __typeof__(*static_cast<_Tp1*>(NULL)
- + *static_cast<_Tp2*>(NULL)) __result;
+ template<typename _Tp1, typename _Tp2>
+ struct _Plus : public std::binary_function<_Tp1, _Tp2, _Tp1>
+ {
+ typedef __typeof__(*static_cast<_Tp1*>(NULL)
+ + *static_cast<_Tp2*>(NULL)) __result;
- __result
- operator()(const _Tp1& __x, const _Tp2& __y) const
- { return __x + __y; }
- };
+ __result
+ operator()(const _Tp1& __x, const _Tp2& __y) const
+ { return __x + __y; }
+ };
-// Partial specialization for one type. Same as std::plus.
-template<typename _Tp>
- struct _Plus<_Tp, _Tp> : public std::binary_function<_Tp, _Tp, _Tp>
- {
- typedef __typeof__(*static_cast<_Tp*>(NULL)
- + *static_cast<_Tp*>(NULL)) __result;
+ // Partial specialization for one type. Same as std::plus.
+ template<typename _Tp>
+ struct _Plus<_Tp, _Tp> : public std::binary_function<_Tp, _Tp, _Tp>
+ {
+ typedef __typeof__(*static_cast<_Tp*>(NULL)
+ + *static_cast<_Tp*>(NULL)) __result;
- __result
- operator()(const _Tp& __x, const _Tp& __y) const
- { return __x + __y; }
- };
+ __result
+ operator()(const _Tp& __x, const _Tp& __y) const
+ { return __x + __y; }
+ };
-/** @brief Similar to std::multiplies, but allows two different types. */
-template<typename _Tp1, typename _Tp2>
- struct _Multiplies : public std::binary_function<_Tp1, _Tp2, _Tp1>
- {
- typedef __typeof__(*static_cast<_Tp1*>(NULL)
- * *static_cast<_Tp2*>(NULL)) __result;
+ /** @brief Similar to std::multiplies, but allows two different types. */
+ template<typename _Tp1, typename _Tp2>
+ struct _Multiplies : public std::binary_function<_Tp1, _Tp2, _Tp1>
+ {
+ typedef __typeof__(*static_cast<_Tp1*>(NULL)
+ * *static_cast<_Tp2*>(NULL)) __result;
- __result
- operator()(const _Tp1& __x, const _Tp2& __y) const
- { return __x * __y; }
- };
+ __result
+ operator()(const _Tp1& __x, const _Tp2& __y) const
+ { return __x * __y; }
+ };
-// Partial specialization for one type. Same as std::multiplies.
-template<typename _Tp>
- struct _Multiplies<_Tp, _Tp> : public std::binary_function<_Tp, _Tp, _Tp>
- {
- typedef __typeof__(*static_cast<_Tp*>(NULL)
- * *static_cast<_Tp*>(NULL)) __result;
+ // Partial specialization for one type. Same as std::multiplies.
+ template<typename _Tp>
+ struct _Multiplies<_Tp, _Tp> : public std::binary_function<_Tp, _Tp, _Tp>
+ {
+ typedef __typeof__(*static_cast<_Tp*>(NULL)
+ * *static_cast<_Tp*>(NULL)) __result;
- __result
- operator()(const _Tp& __x, const _Tp& __y) const
- { return __x * __y; }
- };
+ __result
+ operator()(const _Tp& __x, const _Tp& __y) const
+ { return __x * __y; }
+ };
-template<typename _Tp, typename _DifferenceTp>
- class _PseudoSequence;
+ template<typename _Tp, typename _DifferenceTp>
+ class _PseudoSequence;
-/** @brief _Iterator associated with __gnu_parallel::_PseudoSequence.
- * If features the usual random-access iterator functionality.
- * @param _Tp Sequence _M_value type.
- * @param _DifferenceType Sequence difference type.
- */
-template<typename _Tp, typename _DifferenceTp>
- class _PseudoSequenceIterator
- {
- public:
- typedef _DifferenceTp _DifferenceType;
+ /** @brief _Iterator associated with __gnu_parallel::_PseudoSequence.
+ * If features the usual random-access iterator functionality.
+ * @param _Tp Sequence _M_value type.
+ * @param _DifferenceType Sequence difference type.
+ */
+ template<typename _Tp, typename _DifferenceTp>
+ class _PseudoSequenceIterator
+ {
+ public:
+ typedef _DifferenceTp _DifferenceType;
- private:
- const _Tp& _M_val;
- _DifferenceType _M_pos;
+ private:
+ const _Tp& _M_val;
+ _DifferenceType _M_pos;
- public:
- _PseudoSequenceIterator(const _Tp& _M_val, _DifferenceType _M_pos)
- : _M_val(_M_val), _M_pos(_M_pos) { }
+ public:
+ _PseudoSequenceIterator(const _Tp& __val, _DifferenceType __pos)
+ : _M_val(__val), _M_pos(__pos) { }
- // Pre-increment operator.
- _PseudoSequenceIterator&
- operator++()
- {
- ++_M_pos;
- return *this;
- }
+ // Pre-increment operator.
+ _PseudoSequenceIterator&
+ operator++()
+ {
+ ++_M_pos;
+ return *this;
+ }
- // Post-increment operator.
- const _PseudoSequenceIterator
- operator++(int)
- { return _PseudoSequenceIterator(_M_pos++); }
+ // Post-increment operator.
+ const _PseudoSequenceIterator
+ operator++(int)
+ { return _PseudoSequenceIterator(_M_pos++); }
- const _Tp&
- operator*() const
- { return _M_val; }
+ const _Tp&
+ operator*() const
+ { return _M_val; }
- const _Tp&
- operator[](_DifferenceType) const
- { return _M_val; }
+ const _Tp&
+ operator[](_DifferenceType) const
+ { return _M_val; }
- bool
- operator==(const _PseudoSequenceIterator& __i2)
- { return _M_pos == __i2._M_pos; }
+ bool
+ operator==(const _PseudoSequenceIterator& __i2)
+ { return _M_pos == __i2._M_pos; }
- _DifferenceType
- operator!=(const _PseudoSequenceIterator& __i2)
- { return _M_pos != __i2._M_pos; }
+ _DifferenceType
+ operator!=(const _PseudoSequenceIterator& __i2)
+ { return _M_pos != __i2._M_pos; }
- _DifferenceType
- operator-(const _PseudoSequenceIterator& __i2)
- { return _M_pos - __i2._M_pos; }
- };
+ _DifferenceType
+ operator-(const _PseudoSequenceIterator& __i2)
+ { return _M_pos - __i2._M_pos; }
+ };
-/** @brief Sequence that conceptually consists of multiple copies of
- the same element.
- * The copies are not stored explicitly, of course.
- * @param _Tp Sequence _M_value type.
- * @param _DifferenceType Sequence difference type.
- */
-template<typename _Tp, typename _DifferenceTp>
- class _PseudoSequence
- {
- public:
- typedef _DifferenceTp _DifferenceType;
+ /** @brief Sequence that conceptually consists of multiple copies of
+ the same element.
+ * The copies are not stored explicitly, of course.
+ * @param _Tp Sequence _M_value type.
+ * @param _DifferenceType Sequence difference type.
+ */
+ template<typename _Tp, typename _DifferenceTp>
+ class _PseudoSequence
+ {
+ public:
+ typedef _DifferenceTp _DifferenceType;
- // Better cast down to uint64_t, than up to _DifferenceTp.
- typedef _PseudoSequenceIterator<_Tp, uint64_t> iterator;
+ // Better cast down to uint64_t, than up to _DifferenceTp.
+ typedef _PseudoSequenceIterator<_Tp, uint64_t> iterator;
- /** @brief Constructor.
- * @param _M_val Element of the sequence.
- * @param __count Number of (virtual) copies.
- */
- _PseudoSequence(const _Tp& _M_val, _DifferenceType __count)
- : _M_val(_M_val), __count(__count) { }
+ /** @brief Constructor.
+ * @param _M_val Element of the sequence.
+ * @param __count Number of (virtual) copies.
+ */
+ _PseudoSequence(const _Tp& __val, _DifferenceType __count)
+ : _M_val(__val), _M_count(__count) { }
- /** @brief Begin iterator. */
- iterator
- begin() const
- { return iterator(_M_val, 0); }
+ /** @brief Begin iterator. */
+ iterator
+ begin() const
+ { return iterator(_M_val, 0); }
- /** @brief End iterator. */
- iterator
- end() const
- { return iterator(_M_val, __count); }
+ /** @brief End iterator. */
+ iterator
+ end() const
+ { return iterator(_M_val, _M_count); }
- private:
- const _Tp& _M_val;
- _DifferenceType __count;
- };
+ private:
+ const _Tp& _M_val;
+ _DifferenceType _M_count;
+ };
-/** @brief Functor that does nothing */
-template<typename _ValueTp>
- class _VoidFunctor
- {
- inline void
- operator()(const _ValueTp& __v) const { }
- };
+ /** @brief Functor that does nothing */
+ template<typename _ValueTp>
+ class _VoidFunctor
+ {
+ inline void
+ operator()(const _ValueTp& __v) const { }
+ };
-/** @brief Compute the median of three referenced elements,
- according to @__c __comp.
- * @param __a First iterator.
- * @param __b Second iterator.
- * @param __c Third iterator.
- * @param __comp Comparator.
- */
-template<typename _RAIter, typename _Compare>
- _RAIter
- __median_of_three_iterators(_RAIter __a, _RAIter __b,
- _RAIter __c, _Compare& __comp)
- {
- if (__comp(*__a, *__b))
- if (__comp(*__b, *__c))
- return __b;
+ /** @brief Compute the median of three referenced elements,
+ according to @__c __comp.
+ * @param __a First iterator.
+ * @param __b Second iterator.
+ * @param __c Third iterator.
+ * @param __comp Comparator.
+ */
+ template<typename _RAIter, typename _Compare>
+ _RAIter
+ __median_of_three_iterators(_RAIter __a, _RAIter __b,
+ _RAIter __c, _Compare& __comp)
+ {
+ if (__comp(*__a, *__b))
+ if (__comp(*__b, *__c))
+ return __b;
+ else
+ if (__comp(*__a, *__c))
+ return __c;
+ else
+ return __a;
else
- if (__comp(*__a, *__c))
- return __c;
- else
- return __a;
- else
- {
- // Just swap __a and __b.
- if (__comp(*__a, *__c))
- return __a;
- else
- if (__comp(*__b, *__c))
- return __c;
- else
- return __b;
- }
- }
+ {
+ // Just swap __a and __b.
+ if (__comp(*__a, *__c))
+ return __a;
+ else
+ if (__comp(*__b, *__c))
+ return __c;
+ else
+ return __b;
+ }
+ }
#define _GLIBCXX_PARALLEL_ASSERT(_Condition) __glibcxx_assert(_Condition)
Index: include/parallel/par_loop.h
===================================================================
--- include/parallel/par_loop.h (revision 153933)
+++ include/parallel/par_loop.h (working copy)
@@ -40,94 +40,93 @@
namespace __gnu_parallel
{
+ /** @brief Embarrassingly parallel algorithm for random access
+ * iterators, using hand-crafted parallelization by equal splitting
+ * the work.
+ *
+ * @param __begin Begin iterator of element sequence.
+ * @param __end End iterator of element sequence.
+ * @param __o User-supplied functor (comparator, predicate, adding
+ * functor, ...)
+ * @param __f Functor to "process" an element with __op (depends on
+ * desired functionality, e. g. for std::for_each(), ...).
+ * @param __r Functor to "add" a single __result to the already
+ * processed elements (depends on functionality).
+ * @param __base Base value for reduction.
+ * @param __output Pointer to position where final result is written to
+ * @param __bound Maximum number of elements processed (e. g. for
+ * std::count_n()).
+ * @return User-supplied functor (that may contain a part of the result).
+ */
+ template<typename _RAIter,
+ typename _Op,
+ typename _Fu,
+ typename _Red,
+ typename _Result>
+ _Op
+ __for_each_template_random_access_ed(_RAIter __begin, _RAIter __end,
+ _Op __o, _Fu& __f, _Red __r,
+ _Result __base, _Result& __output,
+ typename std::iterator_traits<_RAIter>::difference_type __bound)
+ {
+ typedef std::iterator_traits<_RAIter> _TraitsType;
+ typedef typename _TraitsType::difference_type _DifferenceType;
+ const _DifferenceType __length = __end - __begin;
+ _Result *__thread_results;
+ bool* __constructed;
-/** @brief Embarrassingly parallel algorithm for random access
- * iterators, using hand-crafted parallelization by equal splitting
- * the work.
- *
- * @param __begin Begin iterator of element sequence.
- * @param __end End iterator of element sequence.
- * @param __o User-supplied functor (comparator, predicate, adding
- * functor, ...)
- * @param __f Functor to "process" an element with __op (depends on
- * desired functionality, e. g. for std::for_each(), ...).
- * @param __r Functor to "add" a single __result to the already
- * processed elements (depends on functionality).
- * @param __base Base value for reduction.
- * @param __output Pointer to position where final result is written to
- * @param __bound Maximum number of elements processed (e. g. for
- * std::count_n()).
- * @return User-supplied functor (that may contain a part of the result).
- */
-template<typename _RAIter,
- typename _Op,
- typename _Fu,
- typename _Red,
- typename _Result>
- _Op
- __for_each_template_random_access_ed(
- _RAIter __begin, _RAIter __end, _Op __o, _Fu& __f, _Red __r,
- _Result __base, _Result& __output,
- typename std::iterator_traits<_RAIter>::difference_type __bound)
- {
- typedef std::iterator_traits<_RAIter> _TraitsType;
- typedef typename _TraitsType::difference_type _DifferenceType;
- const _DifferenceType __length = __end - __begin;
- _Result *__thread_results;
- bool* __constructed;
+ _ThreadIndex __num_threads =
+ __gnu_parallel::min<_DifferenceType>(__get_max_threads(), __length);
- _ThreadIndex __num_threads =
- __gnu_parallel::min<_DifferenceType>(__get_max_threads(), __length);
-
-# pragma omp parallel num_threads(__num_threads)
+# pragma omp parallel num_threads(__num_threads)
{
# pragma omp single
- {
- __num_threads = omp_get_num_threads();
- __thread_results =
- static_cast<_Result*>(
- ::operator new(__num_threads * sizeof(_Result)));
- __constructed = new bool[__num_threads];
- }
+ {
+ __num_threads = omp_get_num_threads();
+ __thread_results =
+ static_cast<_Result*>(::operator new(__num_threads
+ * sizeof(_Result)));
+ __constructed = new bool[__num_threads];
+ }
- _ThreadIndex __iam = omp_get_thread_num();
+ _ThreadIndex __iam = omp_get_thread_num();
- // Neutral element.
- _Result* __reduct =
- static_cast<_Result*>(::operator new(sizeof(_Result)));
+ // Neutral element.
+ _Result* __reduct =
+ static_cast<_Result*>(::operator new(sizeof(_Result)));
- _DifferenceType
- __start = equally_split_point(__length, __num_threads, __iam),
- __stop = equally_split_point(__length, __num_threads, __iam + 1);
+ _DifferenceType
+ __start = equally_split_point(__length, __num_threads, __iam),
+ __stop = equally_split_point(__length, __num_threads, __iam + 1);
- if (__start < __stop)
- {
- new(__reduct) _Result(__f(__o, __begin + __start));
- ++__start;
- __constructed[__iam] = true;
- }
- else
- __constructed[__iam] = false;
+ if (__start < __stop)
+ {
+ new(__reduct) _Result(__f(__o, __begin + __start));
+ ++__start;
+ __constructed[__iam] = true;
+ }
+ else
+ __constructed[__iam] = false;
- for (; __start < __stop; ++__start)
- *__reduct = __r(*__reduct, __f(__o, __begin + __start));
+ for (; __start < __stop; ++__start)
+ *__reduct = __r(*__reduct, __f(__o, __begin + __start));
- __thread_results[__iam] = *__reduct;
+ __thread_results[__iam] = *__reduct;
} //parallel
- for (_ThreadIndex __i = 0; __i < __num_threads; ++__i)
- if (__constructed[__i])
- __output = __r(__output, __thread_results[__i]);
+ for (_ThreadIndex __i = 0; __i < __num_threads; ++__i)
+ if (__constructed[__i])
+ __output = __r(__output, __thread_results[__i]);
- // Points to last element processed (needed as return value for
- // some algorithms like transform).
- __f._M_finish_iterator = __begin + __length;
+ // Points to last element processed (needed as return value for
+ // some algorithms like transform).
+ __f._M_finish_iterator = __begin + __length;
- delete[] __thread_results;
- delete[] __constructed;
+ delete[] __thread_results;
+ delete[] __constructed;
- return __o;
- }
+ return __o;
+ }
} // end namespace
Index: include/parallel/omp_loop_static.h
===================================================================
--- include/parallel/omp_loop_static.h (revision 153933)
+++ include/parallel/omp_loop_static.h (working copy)
@@ -40,7 +40,6 @@
namespace __gnu_parallel
{
-
/** @brief Embarrassingly parallel algorithm for random access
* iterators, using an OpenMP for loop with static scheduling.
*
@@ -58,37 +57,38 @@
* std::count_n()).
* @return User-supplied functor (that may contain a part of the result).
*/
-template<typename _RAIter,
- typename _Op,
- typename _Fu,
- typename _Red,
- typename _Result>
- _Op
- __for_each_template_random_access_omp_loop_static(
- _RAIter __begin, _RAIter __end, _Op __o, _Fu& __f, _Red __r,
- _Result __base, _Result& __output,
- typename std::iterator_traits<_RAIter>::difference_type __bound)
- {
- typedef typename
- std::iterator_traits<_RAIter>::difference_type
- _DifferenceType;
+ template<typename _RAIter,
+ typename _Op,
+ typename _Fu,
+ typename _Red,
+ typename _Result>
+ _Op
+ __for_each_template_random_access_omp_loop_static(_RAIter __begin,
+ _RAIter __end, _Op __o,
+ _Fu& __f, _Red __r,
+ _Result __base,
+ _Result& __output,
+ typename std::iterator_traits<_RAIter>::difference_type __bound)
+ {
+ typedef typename std::iterator_traits<_RAIter>::difference_type
+ _DifferenceType;
- _DifferenceType __length = __end - __begin;
- _ThreadIndex __num_threads =
- std::min<_DifferenceType>(__get_max_threads(), __length);
+ _DifferenceType __length = __end - __begin;
+ _ThreadIndex __num_threads =
+ std::min<_DifferenceType>(__get_max_threads(), __length);
- _Result *__thread_results;
+ _Result *__thread_results;
-# pragma omp parallel num_threads(__num_threads)
+# pragma omp parallel num_threads(__num_threads)
{
# pragma omp single
- {
- __num_threads = omp_get_num_threads();
- __thread_results = new _Result[__num_threads];
+ {
+ __num_threads = omp_get_num_threads();
+ __thread_results = new _Result[__num_threads];
- for (_ThreadIndex __i = 0; __i < __num_threads; ++__i)
- __thread_results[__i] = _Result();
- }
+ for (_ThreadIndex __i = 0; __i < __num_threads; ++__i)
+ __thread_results[__i] = _Result();
+ }
_ThreadIndex __iam = omp_get_thread_num();
@@ -98,17 +98,17 @@
__f(__o, __begin+__pos));
} //parallel
- for (_ThreadIndex __i = 0; __i < __num_threads; ++__i)
- __output = __r(__output, __thread_results[__i]);
+ for (_ThreadIndex __i = 0; __i < __num_threads; ++__i)
+ __output = __r(__output, __thread_results[__i]);
- delete [] __thread_results;
+ delete [] __thread_results;
- // Points to last element processed (needed as return value for
- // some algorithms like transform).
- __f.finish_iterator = __begin + __length;
+ // Points to last element processed (needed as return value for
+ // some algorithms like transform).
+ __f.finish_iterator = __begin + __length;
- return __o;
- }
+ return __o;
+ }
} // end namespace
Index: include/parallel/multiway_mergesort.h
===================================================================
--- include/parallel/multiway_mergesort.h (revision 153933)
+++ include/parallel/multiway_mergesort.h (working copy)
@@ -41,451 +41,444 @@
namespace __gnu_parallel
{
+ /** @brief Subsequence description. */
+ template<typename _DifferenceTp>
+ struct _Piece
+ {
+ typedef _DifferenceTp _DifferenceType;
-/** @brief Subsequence description. */
-template<typename _DifferenceTp>
- struct _Piece
- {
- typedef _DifferenceTp _DifferenceType;
+ /** @brief Begin of subsequence. */
+ _DifferenceType _M_begin;
- /** @brief Begin of subsequence. */
- _DifferenceType _M_begin;
+ /** @brief End of subsequence. */
+ _DifferenceType _M_end;
+ };
- /** @brief End of subsequence. */
- _DifferenceType _M_end;
- };
+ /** @brief Data accessed by all threads.
+ *
+ * PMWMS = parallel multiway mergesort */
+ template<typename _RAIter>
+ struct _PMWMSSortingData
+ {
+ typedef std::iterator_traits<_RAIter> _TraitsType;
+ typedef typename _TraitsType::value_type _ValueType;
+ typedef typename _TraitsType::difference_type _DifferenceType;
-/** @brief Data accessed by all threads.
- *
- * PMWMS = parallel multiway mergesort */
-template<typename _RAIter>
- struct _PMWMSSortingData
- {
- typedef std::iterator_traits<_RAIter> _TraitsType;
- typedef typename _TraitsType::value_type _ValueType;
- typedef typename _TraitsType::difference_type _DifferenceType;
+ /** @brief Number of threads involved. */
+ _ThreadIndex _M_num_threads;
- /** @brief Number of threads involved. */
- _ThreadIndex _M_num_threads;
+ /** @brief Input __begin. */
+ _RAIter _M_source;
- /** @brief Input __begin. */
- _RAIter _M_source;
+ /** @brief Start indices, per thread. */
+ _DifferenceType* _M_starts;
- /** @brief Start indices, per thread. */
- _DifferenceType* _M_starts;
+ /** @brief Storage in which to sort. */
+ _ValueType** _M_temporary;
- /** @brief Storage in which to sort. */
- _ValueType** _M_temporary;
+ /** @brief Samples. */
+ _ValueType* _M_samples;
- /** @brief Samples. */
- _ValueType* _M_samples;
+ /** @brief Offsets to add to the found positions. */
+ _DifferenceType* _M_offsets;
- /** @brief Offsets to add to the found positions. */
- _DifferenceType* _M_offsets;
+ /** @brief Pieces of data to merge @__c [thread][__sequence] */
+ std::vector<_Piece<_DifferenceType> >* _M_pieces;
+ };
- /** @brief Pieces of data to merge @__c [thread][__sequence] */
- std::vector<_Piece<_DifferenceType> >* _M_pieces;
-};
+ /**
+ * @brief Select _M_samples from a sequence.
+ * @param __sd Pointer to algorithm data. _Result will be placed in
+ * @__c __sd->_M_samples.
+ * @param __num_samples Number of _M_samples to select.
+ */
+ template<typename _RAIter, typename _DifferenceTp>
+ void
+ __determine_samples(_PMWMSSortingData<_RAIter>* __sd,
+ _DifferenceTp __num_samples)
+ {
+ typedef std::iterator_traits<_RAIter> _TraitsType;
+ typedef typename _TraitsType::value_type _ValueType;
+ typedef _DifferenceTp _DifferenceType;
-/**
- * @brief Select _M_samples from a sequence.
- * @param __sd Pointer to algorithm data. _Result will be placed in
- * @__c __sd->_M_samples.
- * @param __num_samples Number of _M_samples to select.
- */
-template<typename _RAIter, typename _DifferenceTp>
- void
- __determine_samples(_PMWMSSortingData<_RAIter>* __sd,
- _DifferenceTp __num_samples)
- {
- typedef std::iterator_traits<_RAIter> _TraitsType;
- typedef typename _TraitsType::value_type _ValueType;
- typedef _DifferenceTp _DifferenceType;
+ _ThreadIndex __iam = omp_get_thread_num();
- _ThreadIndex __iam = omp_get_thread_num();
+ _DifferenceType* __es = new _DifferenceType[__num_samples + 2];
- _DifferenceType* __es = new _DifferenceType[__num_samples + 2];
+ equally_split(__sd->_M_starts[__iam + 1] - __sd->_M_starts[__iam],
+ __num_samples + 1, __es);
- equally_split(__sd->_M_starts[__iam + 1] - __sd->_M_starts[__iam],
- __num_samples + 1, __es);
+ for (_DifferenceType __i = 0; __i < __num_samples; ++__i)
+ ::new(&(__sd->_M_samples[__iam * __num_samples + __i]))
+ _ValueType(__sd->_M_source[__sd->_M_starts[__iam]
+ + __es[__i + 1]]);
- for (_DifferenceType __i = 0; __i < __num_samples; ++__i)
- ::new(&(__sd->_M_samples[__iam * __num_samples + __i]))
- _ValueType(__sd->_M_source[__sd->_M_starts[__iam] + __es[__i + 1]]);
+ delete[] __es;
+ }
- delete[] __es;
- }
+ /** @brief Split consistently. */
+ template<bool __exact, typename _RAIter,
+ typename _Compare, typename _SortingPlacesIterator>
+ struct _SplitConsistently
+ { };
-/** @brief Split consistently. */
-template<bool __exact, typename _RAIter,
- typename _Compare, typename _SortingPlacesIterator>
- struct _SplitConsistently
- {
- };
+ /** @brief Split by exact splitting. */
+ template<typename _RAIter, typename _Compare,
+ typename _SortingPlacesIterator>
+ struct _SplitConsistently<true, _RAIter,
+ _Compare, _SortingPlacesIterator>
+ {
+ void
+ operator()(const _ThreadIndex __iam,
+ _PMWMSSortingData<_RAIter>* __sd,
+ _Compare& __comp,
+ const typename
+ std::iterator_traits<_RAIter>::difference_type
+ __num_samples) const
+ {
+# pragma omp barrier
-/** @brief Split by exact splitting. */
-template<typename _RAIter, typename _Compare,
- typename _SortingPlacesIterator>
- struct _SplitConsistently
- <true, _RAIter, _Compare, _SortingPlacesIterator>
- {
- void operator()(
- const _ThreadIndex __iam,
- _PMWMSSortingData<_RAIter>* __sd,
- _Compare& __comp,
- const typename
- std::iterator_traits<_RAIter>::difference_type
- __num_samples)
- const
- {
-# pragma omp barrier
+ std::vector<std::pair<_SortingPlacesIterator,
+ _SortingPlacesIterator> >
+ seqs(__sd->_M_num_threads);
+ for (_ThreadIndex __s = 0; __s < __sd->_M_num_threads; __s++)
+ seqs[__s] = std::make_pair(__sd->_M_temporary[__s],
+ __sd->_M_temporary[__s]
+ + (__sd->_M_starts[__s + 1]
+ - __sd->_M_starts[__s]));
- std::vector<std::pair<_SortingPlacesIterator, _SortingPlacesIterator> >
- seqs(__sd->_M_num_threads);
- for (_ThreadIndex __s = 0; __s < __sd->_M_num_threads; __s++)
- seqs[__s] = std::make_pair(__sd->_M_temporary[__s],
- __sd->_M_temporary[__s]
- + (__sd->_M_starts[__s + 1]
- - __sd->_M_starts[__s]));
+ std::vector<_SortingPlacesIterator> _M_offsets(__sd->_M_num_threads);
- std::vector<_SortingPlacesIterator> _M_offsets(__sd->_M_num_threads);
+ // if not last thread
+ if (__iam < __sd->_M_num_threads - 1)
+ multiseq_partition(seqs.begin(), seqs.end(),
+ __sd->_M_starts[__iam + 1], _M_offsets.begin(),
+ __comp);
- // if not last thread
- if (__iam < __sd->_M_num_threads - 1)
- multiseq_partition(seqs.begin(), seqs.end(),
- __sd->_M_starts[__iam + 1], _M_offsets.begin(),
- __comp);
+ for (int __seq = 0; __seq < __sd->_M_num_threads; __seq++)
+ {
+ // for each sequence
+ if (__iam < (__sd->_M_num_threads - 1))
+ __sd->_M_pieces[__iam][__seq]._M_end
+ = _M_offsets[__seq] - seqs[__seq].first;
+ else
+ // very end of this sequence
+ __sd->_M_pieces[__iam][__seq]._M_end =
+ __sd->_M_starts[__seq + 1] - __sd->_M_starts[__seq];
+ }
- for (int __seq = 0; __seq < __sd->_M_num_threads; __seq++)
- {
- // for each sequence
- if (__iam < (__sd->_M_num_threads - 1))
- __sd->_M_pieces[__iam][__seq]._M_end
- = _M_offsets[__seq] - seqs[__seq].first;
- else
- // very end of this sequence
- __sd->_M_pieces[__iam][__seq]._M_end =
- __sd->_M_starts[__seq + 1] - __sd->_M_starts[__seq];
- }
+# pragma omp barrier
-# pragma omp barrier
-
- for (_ThreadIndex __seq = 0; __seq < __sd->_M_num_threads; __seq++)
- {
- // For each sequence.
- if (__iam > 0)
- __sd->_M_pieces[__iam][__seq]._M_begin =
- __sd->_M_pieces[__iam - 1][__seq]._M_end;
- else
- // Absolute beginning.
- __sd->_M_pieces[__iam][__seq]._M_begin = 0;
+ for (_ThreadIndex __seq = 0; __seq < __sd->_M_num_threads; __seq++)
+ {
+ // For each sequence.
+ if (__iam > 0)
+ __sd->_M_pieces[__iam][__seq]._M_begin =
+ __sd->_M_pieces[__iam - 1][__seq]._M_end;
+ else
+ // Absolute beginning.
+ __sd->_M_pieces[__iam][__seq]._M_begin = 0;
+ }
}
- }
};
-/** @brief Split by sampling. */
-template<typename _RAIter, typename _Compare,
- typename _SortingPlacesIterator>
- struct _SplitConsistently<false, _RAIter, _Compare,
- _SortingPlacesIterator>
- {
- void operator()(
- const _ThreadIndex __iam,
- _PMWMSSortingData<_RAIter>* __sd,
- _Compare& __comp,
- const typename
- std::iterator_traits<_RAIter>::difference_type
- __num_samples)
- const
+ /** @brief Split by sampling. */
+ template<typename _RAIter, typename _Compare,
+ typename _SortingPlacesIterator>
+ struct _SplitConsistently<false, _RAIter, _Compare,
+ _SortingPlacesIterator>
{
- typedef std::iterator_traits<_RAIter> _TraitsType;
- typedef typename _TraitsType::value_type _ValueType;
- typedef typename _TraitsType::difference_type _DifferenceType;
+ void
+ operator()(const _ThreadIndex __iam,
+ _PMWMSSortingData<_RAIter>* __sd,
+ _Compare& __comp,
+ const typename
+ std::iterator_traits<_RAIter>::difference_type
+ __num_samples) const
+ {
+ typedef std::iterator_traits<_RAIter> _TraitsType;
+ typedef typename _TraitsType::value_type _ValueType;
+ typedef typename _TraitsType::difference_type _DifferenceType;
- __determine_samples(__sd, __num_samples);
+ __determine_samples(__sd, __num_samples);
-# pragma omp barrier
+# pragma omp barrier
-# pragma omp single
- __gnu_sequential::sort(__sd->_M_samples,
- __sd->_M_samples
- + (__num_samples * __sd->_M_num_threads),
- __comp);
+# pragma omp single
+ __gnu_sequential::sort(__sd->_M_samples,
+ __sd->_M_samples
+ + (__num_samples * __sd->_M_num_threads),
+ __comp);
-# pragma omp barrier
+# pragma omp barrier
- for (_ThreadIndex __s = 0; __s < __sd->_M_num_threads; ++__s)
- {
- // For each sequence.
- if (__num_samples * __iam > 0)
- __sd->_M_pieces[__iam][__s]._M_begin =
+ for (_ThreadIndex __s = 0; __s < __sd->_M_num_threads; ++__s)
+ {
+ // For each sequence.
+ if (__num_samples * __iam > 0)
+ __sd->_M_pieces[__iam][__s]._M_begin =
std::lower_bound(__sd->_M_temporary[__s],
- __sd->_M_temporary[__s]
- + (__sd->_M_starts[__s + 1] - __sd->_M_starts[__s]),
- __sd->_M_samples[__num_samples * __iam],
- __comp)
+ __sd->_M_temporary[__s]
+ + (__sd->_M_starts[__s + 1]
+ - __sd->_M_starts[__s]),
+ __sd->_M_samples[__num_samples * __iam],
+ __comp)
- __sd->_M_temporary[__s];
- else
- // Absolute beginning.
- __sd->_M_pieces[__iam][__s]._M_begin = 0;
+ else
+ // Absolute beginning.
+ __sd->_M_pieces[__iam][__s]._M_begin = 0;
- if ((__num_samples * (__iam + 1)) <
- (__num_samples * __sd->_M_num_threads))
- __sd->_M_pieces[__iam][__s]._M_end =
+ if ((__num_samples * (__iam + 1)) <
+ (__num_samples * __sd->_M_num_threads))
+ __sd->_M_pieces[__iam][__s]._M_end =
std::lower_bound(__sd->_M_temporary[__s],
- __sd->_M_temporary[__s]
- + (__sd->_M_starts[__s + 1] - __sd->_M_starts[__s]),
- __sd->_M_samples[__num_samples * (__iam + 1)],
- __comp)
+ __sd->_M_temporary[__s]
+ + (__sd->_M_starts[__s + 1]
+ - __sd->_M_starts[__s]),
+ __sd->_M_samples[__num_samples * (__iam + 1)],
+ __comp)
- __sd->_M_temporary[__s];
- else
- // Absolute end.
- __sd->_M_pieces[__iam][__s]._M_end = __sd->_M_starts[__s + 1]
- - __sd->_M_starts[__s];
- }
- }
+ else
+ // Absolute end.
+ __sd->_M_pieces[__iam][__s]._M_end = (__sd->_M_starts[__s + 1]
+ - __sd->_M_starts[__s]);
+ }
+ }
};
-template<bool __stable, typename _RAIter, typename _Compare>
- struct __possibly_stable_sort
- {
- };
+ template<bool __stable, typename _RAIter, typename _Compare>
+ struct __possibly_stable_sort
+ { };
-template<typename _RAIter, typename _Compare>
- struct __possibly_stable_sort<true, _RAIter, _Compare>
- {
- void operator()(const _RAIter& __begin,
- const _RAIter& __end, _Compare& __comp) const
+ template<typename _RAIter, typename _Compare>
+ struct __possibly_stable_sort<true, _RAIter, _Compare>
{
- __gnu_sequential::stable_sort(__begin, __end, __comp);
- }
- };
+ void operator()(const _RAIter& __begin,
+ const _RAIter& __end, _Compare& __comp) const
+ { __gnu_sequential::stable_sort(__begin, __end, __comp); }
+ };
-template<typename _RAIter, typename _Compare>
- struct __possibly_stable_sort<false, _RAIter, _Compare>
- {
- void operator()(const _RAIter __begin,
- const _RAIter __end, _Compare& __comp) const
+ template<typename _RAIter, typename _Compare>
+ struct __possibly_stable_sort<false, _RAIter, _Compare>
{
- __gnu_sequential::sort(__begin, __end, __comp);
- }
- };
+ void operator()(const _RAIter __begin,
+ const _RAIter __end, _Compare& __comp) const
+ { __gnu_sequential::sort(__begin, __end, __comp); }
+ };
-template<bool __stable, typename Seq_RAIter,
- typename _RAIter, typename _Compare,
- typename DiffType>
- struct __possibly_stable_multiway_merge
- {
- };
+ template<bool __stable, typename Seq_RAIter,
+ typename _RAIter, typename _Compare,
+ typename DiffType>
+ struct __possibly_stable_multiway_merge
+ { };
-template<typename Seq_RAIter, typename _RAIter,
- typename _Compare, typename DiffType>
- struct __possibly_stable_multiway_merge
- <true, Seq_RAIter, _RAIter, _Compare,
- DiffType>
- {
- void operator()(const Seq_RAIter& __seqs_begin,
- const Seq_RAIter& __seqs_end,
- const _RAIter& __target,
- _Compare& __comp,
- DiffType __length_am) const
+ template<typename Seq_RAIter, typename _RAIter,
+ typename _Compare, typename _DiffType>
+ struct __possibly_stable_multiway_merge<true, Seq_RAIter,
+ _RAIter, _Compare, _DiffType>
{
- stable_multiway_merge(__seqs_begin, __seqs_end, __target, __length_am,
- __comp, sequential_tag());
- }
- };
+ void operator()(const Seq_RAIter& __seqs_begin,
+ const Seq_RAIter& __seqs_end,
+ const _RAIter& __target,
+ _Compare& __comp,
+ _DiffType __length_am) const
+ {
+ stable_multiway_merge(__seqs_begin, __seqs_end, __target, __length_am,
+ __comp, sequential_tag());
+ }
+ };
-template<typename Seq_RAIter, typename _RAIter,
- typename _Compare, typename DiffType>
- struct __possibly_stable_multiway_merge
- <false, Seq_RAIter, _RAIter, _Compare,
- DiffType>
- {
- void operator()(const Seq_RAIter& __seqs_begin,
+ template<typename Seq_RAIter, typename _RAIter,
+ typename _Compare, typename _DiffType>
+ struct __possibly_stable_multiway_merge<false, Seq_RAIter,
+ _RAIter, _Compare, _DiffType>
+ {
+ void operator()(const Seq_RAIter& __seqs_begin,
const Seq_RAIter& __seqs_end,
const _RAIter& __target,
_Compare& __comp,
- DiffType __length_am) const
- {
- multiway_merge(__seqs_begin, __seqs_end, __target, __length_am, __comp,
+ _DiffType __length_am) const
+ {
+ multiway_merge(__seqs_begin, __seqs_end, __target, __length_am, __comp,
sequential_tag());
- }
- };
+ }
+ };
-/** @brief PMWMS code executed by each thread.
- * @param __sd Pointer to algorithm data.
- * @param __comp Comparator.
- */
-template<bool __stable, bool __exact, typename _RAIter,
- typename _Compare>
- void
- parallel_sort_mwms_pu(_PMWMSSortingData<_RAIter>* __sd,
- _Compare& __comp)
- {
- typedef std::iterator_traits<_RAIter> _TraitsType;
- typedef typename _TraitsType::value_type _ValueType;
- typedef typename _TraitsType::difference_type _DifferenceType;
+ /** @brief PMWMS code executed by each thread.
+ * @param __sd Pointer to algorithm data.
+ * @param __comp Comparator.
+ */
+ template<bool __stable, bool __exact, typename _RAIter,
+ typename _Compare>
+ void
+ parallel_sort_mwms_pu(_PMWMSSortingData<_RAIter>* __sd,
+ _Compare& __comp)
+ {
+ typedef std::iterator_traits<_RAIter> _TraitsType;
+ typedef typename _TraitsType::value_type _ValueType;
+ typedef typename _TraitsType::difference_type _DifferenceType;
- _ThreadIndex __iam = omp_get_thread_num();
+ _ThreadIndex __iam = omp_get_thread_num();
- // Length of this thread's chunk, before merging.
- _DifferenceType __length_local
- = __sd->_M_starts[__iam + 1] - __sd->_M_starts[__iam];
+ // Length of this thread's chunk, before merging.
+ _DifferenceType __length_local
+ = __sd->_M_starts[__iam + 1] - __sd->_M_starts[__iam];
- // Sort in temporary storage, leave space for sentinel.
+ // Sort in temporary storage, leave space for sentinel.
- typedef _ValueType* _SortingPlacesIterator;
+ typedef _ValueType* _SortingPlacesIterator;
- __sd->_M_temporary[__iam] =
- static_cast<_ValueType*>(
- ::operator new(sizeof(_ValueType) * (__length_local + 1)));
+ __sd->_M_temporary[__iam] =
+ static_cast<_ValueType*>(::operator new(sizeof(_ValueType)
+ * (__length_local + 1)));
- // Copy there.
- std::uninitialized_copy(
- __sd->_M_source + __sd->_M_starts[__iam],
- __sd->_M_source + __sd->_M_starts[__iam] + __length_local,
- __sd->_M_temporary[__iam]);
+ // Copy there.
+ std::uninitialized_copy(__sd->_M_source + __sd->_M_starts[__iam],
+ __sd->_M_source + __sd->_M_starts[__iam]
+ + __length_local,
+ __sd->_M_temporary[__iam]);
- __possibly_stable_sort<__stable, _SortingPlacesIterator, _Compare>()
+ __possibly_stable_sort<__stable, _SortingPlacesIterator, _Compare>()
(__sd->_M_temporary[__iam],
- __sd->_M_temporary[__iam] + __length_local,
+ __sd->_M_temporary[__iam] + __length_local,
__comp);
- // Invariant: locally sorted subsequence in sd->_M_temporary[__iam],
- // __sd->_M_temporary[__iam] + __length_local.
+ // Invariant: locally sorted subsequence in sd->_M_temporary[__iam],
+ // __sd->_M_temporary[__iam] + __length_local.
- // No barrier here: Synchronization is done by the splitting routine.
+ // No barrier here: Synchronization is done by the splitting routine.
- _DifferenceType __num_samples =
+ _DifferenceType __num_samples =
_Settings::get().sort_mwms_oversampling * __sd->_M_num_threads - 1;
- _SplitConsistently
- <__exact, _RAIter, _Compare, _SortingPlacesIterator>()
+ _SplitConsistently
+ <__exact, _RAIter, _Compare, _SortingPlacesIterator>()
(__iam, __sd, __comp, __num_samples);
- // Offset from __target __begin, __length after merging.
- _DifferenceType __offset = 0, __length_am = 0;
- for (_ThreadIndex __s = 0; __s < __sd->_M_num_threads; __s++)
- {
- __length_am += __sd->_M_pieces[__iam][__s]._M_end
- - __sd->_M_pieces[__iam][__s]._M_begin;
- __offset += __sd->_M_pieces[__iam][__s]._M_begin;
- }
+ // Offset from __target __begin, __length after merging.
+ _DifferenceType __offset = 0, __length_am = 0;
+ for (_ThreadIndex __s = 0; __s < __sd->_M_num_threads; __s++)
+ {
+ __length_am += (__sd->_M_pieces[__iam][__s]._M_end
+ - __sd->_M_pieces[__iam][__s]._M_begin);
+ __offset += __sd->_M_pieces[__iam][__s]._M_begin;
+ }
- typedef std::vector<
+ typedef std::vector<
std::pair<_SortingPlacesIterator, _SortingPlacesIterator> >
_SeqVector;
- _SeqVector seqs(__sd->_M_num_threads);
+ _SeqVector seqs(__sd->_M_num_threads);
- for (int __s = 0; __s < __sd->_M_num_threads; ++__s)
- {
- seqs[__s] =
- std::make_pair(
- __sd->_M_temporary[__s] + __sd->_M_pieces[__iam][__s]._M_begin,
- __sd->_M_temporary[__s] + __sd->_M_pieces[__iam][__s]._M_end);
- }
+ for (int __s = 0; __s < __sd->_M_num_threads; ++__s)
+ {
+ seqs[__s] =
+ std::make_pair
+ (__sd->_M_temporary[__s] + __sd->_M_pieces[__iam][__s]._M_begin,
+ __sd->_M_temporary[__s] + __sd->_M_pieces[__iam][__s]._M_end);
+ }
- __possibly_stable_multiway_merge<
+ __possibly_stable_multiway_merge<
__stable,
typename _SeqVector::iterator,
_RAIter,
_Compare, _DifferenceType>()
(seqs.begin(), seqs.end(),
- __sd->_M_source + __offset, __comp,
+ __sd->_M_source + __offset, __comp,
__length_am);
-# pragma omp barrier
+# pragma omp barrier
- ::operator delete(__sd->_M_temporary[__iam]);
- }
+ ::operator delete(__sd->_M_temporary[__iam]);
+ }
-/** @brief PMWMS main call.
- * @param __begin Begin iterator of sequence.
- * @param __end End iterator of sequence.
- * @param __comp Comparator.
- * @param __n Length of sequence.
- * @param __num_threads Number of threads to use.
- */
-template<bool __stable, bool __exact, typename _RAIter,
+ /** @brief PMWMS main call.
+ * @param __begin Begin iterator of sequence.
+ * @param __end End iterator of sequence.
+ * @param __comp Comparator.
+ * @param __n Length of sequence.
+ * @param __num_threads Number of threads to use.
+ */
+ template<bool __stable, bool __exact, typename _RAIter,
typename _Compare>
- void
- parallel_sort_mwms(_RAIter __begin, _RAIter __end,
- _Compare __comp,
- _ThreadIndex __num_threads)
- {
- _GLIBCXX_CALL(__end - __begin)
+ void
+ parallel_sort_mwms(_RAIter __begin, _RAIter __end,
+ _Compare __comp,
+ _ThreadIndex __num_threads)
+ {
+ _GLIBCXX_CALL(__end - __begin)
- typedef std::iterator_traits<_RAIter> _TraitsType;
- typedef typename _TraitsType::value_type _ValueType;
- typedef typename _TraitsType::difference_type _DifferenceType;
+ typedef std::iterator_traits<_RAIter> _TraitsType;
+ typedef typename _TraitsType::value_type _ValueType;
+ typedef typename _TraitsType::difference_type _DifferenceType;
- _DifferenceType __n = __end - __begin;
+ _DifferenceType __n = __end - __begin;
- if (__n <= 1)
- return;
+ if (__n <= 1)
+ return;
- // at least one element per thread
- if (__num_threads > __n)
- __num_threads = static_cast<_ThreadIndex>(__n);
+ // at least one element per thread
+ if (__num_threads > __n)
+ __num_threads = static_cast<_ThreadIndex>(__n);
- // shared variables
- _PMWMSSortingData<_RAIter> __sd;
- _DifferenceType* _M_starts;
+ // shared variables
+ _PMWMSSortingData<_RAIter> __sd;
+ _DifferenceType* _M_starts;
-# pragma omp parallel num_threads(__num_threads)
+# pragma omp parallel num_threads(__num_threads)
{
__num_threads = omp_get_num_threads(); //no more threads than requested
# pragma omp single
- {
- __sd._M_num_threads = __num_threads;
- __sd._M_source = __begin;
+ {
+ __sd._M_num_threads = __num_threads;
+ __sd._M_source = __begin;
+
+ __sd._M_temporary = new _ValueType*[__num_threads];
- __sd._M_temporary = new _ValueType*[__num_threads];
+ if (!__exact)
+ {
+ _DifferenceType __size =
+ (_Settings::get().sort_mwms_oversampling * __num_threads - 1)
+ * __num_threads;
+ __sd._M_samples = static_cast<_ValueType*>
+ (::operator new(__size * sizeof(_ValueType)));
+ }
+ else
+ __sd._M_samples = NULL;
- if (!__exact)
- {
- _DifferenceType __size =
- (_Settings::get().sort_mwms_oversampling * __num_threads - 1)
- * __num_threads;
- __sd._M_samples = static_cast<_ValueType*>(
- ::operator new(__size * sizeof(_ValueType)));
- }
- else
- __sd._M_samples = NULL;
+ __sd._M_offsets = new _DifferenceType[__num_threads - 1];
+ __sd._M_pieces
+ = new std::vector<_Piece<_DifferenceType> >[__num_threads];
+ for (int __s = 0; __s < __num_threads; ++__s)
+ __sd._M_pieces[__s].resize(__num_threads);
+ _M_starts = __sd._M_starts
+ = new _DifferenceType[__num_threads + 1];
- __sd._M_offsets = new _DifferenceType[__num_threads - 1];
- __sd._M_pieces
- = new std::vector<_Piece<_DifferenceType> >[__num_threads];
- for (int __s = 0; __s < __num_threads; ++__s)
- __sd._M_pieces[__s].resize(__num_threads);
- _M_starts = __sd._M_starts
- = new _DifferenceType[__num_threads + 1];
+ _DifferenceType __chunk_length = __n / __num_threads;
+ _DifferenceType __split = __n % __num_threads;
+ _DifferenceType __pos = 0;
+ for (int __i = 0; __i < __num_threads; ++__i)
+ {
+ _M_starts[__i] = __pos;
+ __pos += (__i < __split)
+ ? (__chunk_length + 1) : __chunk_length;
+ }
+ _M_starts[__num_threads] = __pos;
+ } //single
- _DifferenceType __chunk_length = __n / __num_threads;
- _DifferenceType __split = __n % __num_threads;
- _DifferenceType __pos = 0;
- for (int __i = 0; __i < __num_threads; ++__i)
- {
- _M_starts[__i] = __pos;
- __pos += (__i < __split)
- ? (__chunk_length + 1) : __chunk_length;
- }
- _M_starts[__num_threads] = __pos;
- } //single
-
// Now sort in parallel.
parallel_sort_mwms_pu<__stable, __exact>(&__sd, __comp);
} //parallel
- delete[] _M_starts;
- delete[] __sd._M_temporary;
+ delete[] _M_starts;
+ delete[] __sd._M_temporary;
- if (!__exact)
+ if (!__exact)
::operator delete(__sd._M_samples);
- delete[] __sd._M_offsets;
- delete[] __sd._M_pieces;
- }
+ delete[] __sd._M_offsets;
+ delete[] __sd._M_pieces;
+ }
+
} //namespace __gnu_parallel
#endif /* _GLIBCXX_PARALLEL_MULTIWAY_MERGESORT_H */
Index: include/parallel/partial_sum.h
===================================================================
--- include/parallel/partial_sum.h (revision 153933)
+++ include/parallel/partial_sum.h (working copy)
@@ -43,106 +43,107 @@
{
// Problem: there is no 0-element given.
-/** @brief Base case prefix sum routine.
- * @param __begin Begin iterator of input sequence.
- * @param __end End iterator of input sequence.
- * @param __result Begin iterator of output sequence.
- * @param __bin_op Associative binary function.
- * @param __value Start value. Must be passed since the neutral
- * element is unknown in general.
- * @return End iterator of output sequence. */
-template<typename _IIter,
- typename _OutputIterator,
- typename _BinaryOperation>
- _OutputIterator
- __parallel_partial_sum_basecase(
- _IIter __begin, _IIter __end, _OutputIterator __result,
- _BinaryOperation __bin_op,
- typename std::iterator_traits <_IIter>::value_type __value)
- {
- if (__begin == __end)
+ /** @brief Base case prefix sum routine.
+ * @param __begin Begin iterator of input sequence.
+ * @param __end End iterator of input sequence.
+ * @param __result Begin iterator of output sequence.
+ * @param __bin_op Associative binary function.
+ * @param __value Start value. Must be passed since the neutral
+ * element is unknown in general.
+ * @return End iterator of output sequence. */
+ template<typename _IIter,
+ typename _OutputIterator,
+ typename _BinaryOperation>
+ _OutputIterator
+ __parallel_partial_sum_basecase(_IIter __begin, _IIter __end,
+ _OutputIterator __result,
+ _BinaryOperation __bin_op,
+ typename std::iterator_traits <_IIter>::value_type __value)
+ {
+ if (__begin == __end)
+ return __result;
+
+ while (__begin != __end)
+ {
+ __value = __bin_op(__value, *__begin);
+ *__result = __value;
+ ++__result;
+ ++__begin;
+ }
return __result;
+ }
- while (__begin != __end)
- {
- __value = __bin_op(__value, *__begin);
- *__result = __value;
- ++__result;
- ++__begin;
- }
- return __result;
- }
+ /** @brief Parallel partial sum implementation, two-phase approach,
+ no recursion.
+ * @param __begin Begin iterator of input sequence.
+ * @param __end End iterator of input sequence.
+ * @param __result Begin iterator of output sequence.
+ * @param __bin_op Associative binary function.
+ * @param __n Length of sequence.
+ * @param __num_threads Number of threads to use.
+ * @return End iterator of output sequence.
+ */
+ template<typename _IIter,
+ typename _OutputIterator,
+ typename _BinaryOperation>
+ _OutputIterator
+ __parallel_partial_sum_linear(_IIter __begin, _IIter __end,
+ _OutputIterator __result,
+ _BinaryOperation __bin_op,
+ typename std::iterator_traits<_IIter>::difference_type __n)
+ {
+ typedef std::iterator_traits<_IIter> _TraitsType;
+ typedef typename _TraitsType::value_type _ValueType;
+ typedef typename _TraitsType::difference_type _DifferenceType;
-/** @brief Parallel partial sum implementation, two-phase approach,
- no recursion.
- * @param __begin Begin iterator of input sequence.
- * @param __end End iterator of input sequence.
- * @param __result Begin iterator of output sequence.
- * @param __bin_op Associative binary function.
- * @param __n Length of sequence.
- * @param __num_threads Number of threads to use.
- * @return End iterator of output sequence.
- */
-template<typename _IIter,
- typename _OutputIterator,
- typename _BinaryOperation>
- _OutputIterator
- __parallel_partial_sum_linear(
- _IIter __begin, _IIter __end, _OutputIterator __result,
- _BinaryOperation __bin_op,
- typename std::iterator_traits<_IIter>::difference_type __n)
- {
- typedef std::iterator_traits<_IIter> _TraitsType;
- typedef typename _TraitsType::value_type _ValueType;
- typedef typename _TraitsType::difference_type _DifferenceType;
+ if (__begin == __end)
+ return __result;
- if (__begin == __end)
- return __result;
-
- _ThreadIndex __num_threads =
+ _ThreadIndex __num_threads =
std::min<_DifferenceType>(__get_max_threads(), __n - 1);
- if (__num_threads < 2)
- {
- *__result = *__begin;
- return __parallel_partial_sum_basecase(
- __begin + 1, __end, __result + 1, __bin_op, *__begin);
- }
+ if (__num_threads < 2)
+ {
+ *__result = *__begin;
+ return __parallel_partial_sum_basecase(__begin + 1, __end,
+ __result + 1, __bin_op,
+ *__begin);
+ }
- _DifferenceType* __borders;
- _ValueType* __sums;
+ _DifferenceType* __borders;
+ _ValueType* __sums;
- const _Settings& __s = _Settings::get();
+ const _Settings& __s = _Settings::get();
-# pragma omp parallel num_threads(__num_threads)
+# pragma omp parallel num_threads(__num_threads)
{
# pragma omp single
- {
- __num_threads = omp_get_num_threads();
+ {
+ __num_threads = omp_get_num_threads();
+
+ __borders = new _DifferenceType[__num_threads + 2];
- __borders = new _DifferenceType[__num_threads + 2];
+ if (__s.partial_sum_dilation == 1.0f)
+ equally_split(__n, __num_threads + 1, __borders);
+ else
+ {
+ _DifferenceType __chunk_length =
+ ((double)__n
+ / ((double)__num_threads + __s.partial_sum_dilation)),
+ __borderstart = __n - __num_threads * __chunk_length;
+ __borders[0] = 0;
+ for (int __i = 1; __i < (__num_threads + 1); ++__i)
+ {
+ __borders[__i] = __borderstart;
+ __borderstart += __chunk_length;
+ }
+ __borders[__num_threads + 1] = __n;
+ }
- if (__s.partial_sum_dilation == 1.0f)
- equally_split(__n, __num_threads + 1, __borders);
- else
- {
- _DifferenceType __chunk_length =
- ((double)__n
- / ((double)__num_threads + __s.partial_sum_dilation)),
- __borderstart = __n - __num_threads * __chunk_length;
- __borders[0] = 0;
- for (int __i = 1; __i < (__num_threads + 1); ++__i)
- {
- __borders[__i] = __borderstart;
- __borderstart += __chunk_length;
- }
- __borders[__num_threads + 1] = __n;
- }
-
- __sums = static_cast<_ValueType*>(::operator new(sizeof(_ValueType)
+ __sums = static_cast<_ValueType*>(::operator new(sizeof(_ValueType)
* __num_threads));
- _OutputIterator __target_end;
- } //single
+ _OutputIterator __target_end;
+ } //single
_ThreadIndex __iam = omp_get_thread_num();
if (__iam == 0)
@@ -166,58 +167,57 @@
# pragma omp barrier
# pragma omp single
- __parallel_partial_sum_basecase(__sums + 1, __sums + __num_threads,
+ __parallel_partial_sum_basecase(__sums + 1, __sums + __num_threads,
__sums + 1, __bin_op, __sums[0]);
# pragma omp barrier
- // Still same team.
- __parallel_partial_sum_basecase(
- __begin + __borders[__iam + 1],
- __begin + __borders[__iam + 2],
- __result + __borders[__iam + 1],
- __bin_op, __sums[__iam]);
+ // Still same team.
+ __parallel_partial_sum_basecase(__begin + __borders[__iam + 1],
+ __begin + __borders[__iam + 2],
+ __result + __borders[__iam + 1],
+ __bin_op, __sums[__iam]);
} //parallel
- ::operator delete(__sums);
- delete[] __borders;
+ ::operator delete(__sums);
+ delete[] __borders;
- return __result + __n;
- }
+ return __result + __n;
+ }
-/** @brief Parallel partial sum front-__end.
- * @param __begin Begin iterator of input sequence.
- * @param __end End iterator of input sequence.
- * @param __result Begin iterator of output sequence.
- * @param __bin_op Associative binary function.
- * @return End iterator of output sequence. */
-template<typename _IIter,
- typename _OutputIterator,
- typename _BinaryOperation>
- _OutputIterator
- __parallel_partial_sum(_IIter __begin, _IIter __end,
- _OutputIterator __result, _BinaryOperation __bin_op)
- {
- _GLIBCXX_CALL(__begin - __end)
+ /** @brief Parallel partial sum front-__end.
+ * @param __begin Begin iterator of input sequence.
+ * @param __end End iterator of input sequence.
+ * @param __result Begin iterator of output sequence.
+ * @param __bin_op Associative binary function.
+ * @return End iterator of output sequence. */
+ template<typename _IIter,
+ typename _OutputIterator,
+ typename _BinaryOperation>
+ _OutputIterator
+ __parallel_partial_sum(_IIter __begin, _IIter __end,
+ _OutputIterator __result, _BinaryOperation __bin_op)
+ {
+ _GLIBCXX_CALL(__begin - __end)
- typedef std::iterator_traits<_IIter> _TraitsType;
- typedef typename _TraitsType::value_type _ValueType;
- typedef typename _TraitsType::difference_type _DifferenceType;
+ typedef std::iterator_traits<_IIter> _TraitsType;
+ typedef typename _TraitsType::value_type _ValueType;
+ typedef typename _TraitsType::difference_type _DifferenceType;
- _DifferenceType __n = __end - __begin;
+ _DifferenceType __n = __end - __begin;
- switch (_Settings::get().partial_sum_algorithm)
- {
- case LINEAR:
- // Need an initial offset.
- return __parallel_partial_sum_linear(
- __begin, __end, __result, __bin_op, __n);
- default:
- // Partial_sum algorithm not implemented.
- _GLIBCXX_PARALLEL_ASSERT(0);
- return __result + __n;
- }
- }
+ switch (_Settings::get().partial_sum_algorithm)
+ {
+ case LINEAR:
+ // Need an initial offset.
+ return __parallel_partial_sum_linear(__begin, __end, __result,
+ __bin_op, __n);
+ default:
+ // Partial_sum algorithm not implemented.
+ _GLIBCXX_PARALLEL_ASSERT(0);
+ return __result + __n;
+ }
+ }
}
#endif /* _GLIBCXX_PARALLEL_PARTIAL_SUM_H */
Index: include/parallel/omp_loop.h
===================================================================
--- include/parallel/omp_loop.h (revision 153933)
+++ include/parallel/omp_loop.h (working copy)
@@ -41,74 +41,74 @@
namespace __gnu_parallel
{
-/** @brief Embarrassingly parallel algorithm for random access
- * iterators, using an OpenMP for loop.
- *
- * @param __begin Begin iterator of element sequence.
- * @param __end End iterator of element sequence.
- * @param __o User-supplied functor (comparator, predicate, adding
- * functor, etc.).
- * @param __f Functor to "process" an element with __op (depends on
- * desired functionality, e. g. for std::for_each(), ...).
- * @param __r Functor to "add" a single __result to the already
- * processed elements (depends on functionality).
- * @param __base Base value for reduction.
- * @param __output Pointer to position where final result is written to
- * @param __bound Maximum number of elements processed (e. g. for
- * std::count_n()).
- * @return User-supplied functor (that may contain a part of the result).
- */
-template<typename _RAIter,
- typename _Op,
- typename _Fu,
- typename _Red,
- typename _Result>
- _Op
- __for_each_template_random_access_omp_loop(
- _RAIter __begin, _RAIter __end, _Op __o, _Fu& __f, _Red __r,
- _Result __base, _Result& __output,
- typename std::iterator_traits<_RAIter>::difference_type __bound)
- {
- typedef typename
- std::iterator_traits<_RAIter>::difference_type
+ /** @brief Embarrassingly parallel algorithm for random access
+ * iterators, using an OpenMP for loop.
+ *
+ * @param __begin Begin iterator of element sequence.
+ * @param __end End iterator of element sequence.
+ * @param __o User-supplied functor (comparator, predicate, adding
+ * functor, etc.).
+ * @param __f Functor to "process" an element with __op (depends on
+ * desired functionality, e. g. for std::for_each(), ...).
+ * @param __r Functor to "add" a single __result to the already
+ * processed elements (depends on functionality).
+ * @param __base Base value for reduction.
+ * @param __output Pointer to position where final result is written to
+ * @param __bound Maximum number of elements processed (e. g. for
+ * std::count_n()).
+ * @return User-supplied functor (that may contain a part of the result).
+ */
+ template<typename _RAIter,
+ typename _Op,
+ typename _Fu,
+ typename _Red,
+ typename _Result>
+ _Op
+ __for_each_template_random_access_omp_loop(_RAIter __begin, _RAIter __end,
+ _Op __o, _Fu& __f, _Red __r,
+ _Result __base,
+ _Result& __output,
+ typename std::iterator_traits<_RAIter>::difference_type __bound)
+ {
+ typedef typename std::iterator_traits<_RAIter>::difference_type
_DifferenceType;
- _DifferenceType __length = __end - __begin;
- _ThreadIndex __num_threads =
- __gnu_parallel::min<_DifferenceType>(__get_max_threads(), __length);
+ _DifferenceType __length = __end - __begin;
+ _ThreadIndex __num_threads =
+ __gnu_parallel::min<_DifferenceType>(__get_max_threads(), __length);
- _Result *__thread_results;
+ _Result *__thread_results;
-# pragma omp parallel num_threads(__num_threads)
+# pragma omp parallel num_threads(__num_threads)
{
# pragma omp single
- {
- __num_threads = omp_get_num_threads();
- __thread_results = new _Result[__num_threads];
+ {
+ __num_threads = omp_get_num_threads();
+ __thread_results = new _Result[__num_threads];
- for (_ThreadIndex __i = 0; __i < __num_threads; ++__i)
- __thread_results[__i] = _Result();
- }
+ for (_ThreadIndex __i = 0; __i < __num_threads; ++__i)
+ __thread_results[__i] = _Result();
+ }
_ThreadIndex __iam = omp_get_thread_num();
#pragma omp for schedule(dynamic, _Settings::get().workstealing_chunk_size)
for (_DifferenceType __pos = 0; __pos < __length; ++__pos)
__thread_results[__iam] =
- __r(__thread_results[__iam], __f(__o, __begin+__pos));
+ __r(__thread_results[__iam], __f(__o, __begin+__pos));
} //parallel
- for (_ThreadIndex __i = 0; __i < __num_threads; ++__i)
+ for (_ThreadIndex __i = 0; __i < __num_threads; ++__i)
__output = __r(__output, __thread_results[__i]);
- delete [] __thread_results;
+ delete [] __thread_results;
- // Points to last element processed (needed as return value for
- // some algorithms like transform).
- __f._M_finish_iterator = __begin + __length;
+ // Points to last element processed (needed as return value for
+ // some algorithms like transform).
+ __f._M_finish_iterator = __begin + __length;
- return __o;
- }
+ return __o;
+ }
} // end namespace