59 _OutputIterator __result,
60 _BinaryOperation __bin_op,
61 typename std::iterator_traits <_IIter>::value_type __value)
66 while (__begin != __end)
68 __value = __bin_op(__value, *__begin);
90 _OutputIterator __result,
91 _BinaryOperation __bin_op,
95 typedef typename _TraitsType::value_type _ValueType;
96 typedef typename _TraitsType::difference_type _DifferenceType;
104 if (__num_threads < 2)
106 *__result = *__begin;
108 __result + 1, __bin_op,
112 _DifferenceType* __borders;
117# pragma omp parallel num_threads(__num_threads)
121 __num_threads = omp_get_num_threads();
123 __borders =
new _DifferenceType[__num_threads + 2];
129 _DifferenceType __first_part_length =
132 _DifferenceType __chunk_length =
133 (__n - __first_part_length) / __num_threads;
134 _DifferenceType __borderstart =
135 __n - __num_threads * __chunk_length;
137 for (
_ThreadIndex __i = 1; __i < (__num_threads + 1); ++__i)
139 __borders[__i] = __borderstart;
140 __borderstart += __chunk_length;
142 __borders[__num_threads + 1] = __n;
145 __sums =
static_cast<_ValueType*
>(::operator
new(
sizeof(_ValueType)
147 _OutputIterator __target_end;
153 *__result = *__begin;
155 __begin + __borders[1],
158 ::new(&(__sums[__iam])) _ValueType(*(__result + __borders[1] - 1));
162 ::new(&(__sums[__iam]))
163 _ValueType(__gnu_parallel::accumulate(
164 __begin + __borders[__iam] + 1,
165 __begin + __borders[__iam + 1],
166 *(__begin + __borders[__iam]),
175 __sums + 1, __bin_op, __sums[0]);
181 __begin + __borders[__iam + 2],
182 __result + __borders[__iam + 1],
183 __bin_op, __sums[__iam]);
187 __sums[__i].~_ValueType();
188 ::operator
delete(__sums);
192 return __result + __n;
206 _OutputIterator __result, _BinaryOperation __bin_op)
211 typedef typename _TraitsType::value_type _ValueType;
212 typedef typename _TraitsType::difference_type _DifferenceType;
214 _DifferenceType __n = __end - __begin;
224 _GLIBCXX_PARALLEL_ASSERT(0);
225 return __result + __n;
_OutputIterator __parallel_partial_sum(_IIter __begin, _IIter __end, _OutputIterator __result, _BinaryOperation __bin_op)
Parallel partial sum front-__end.
_OutputIterator __parallel_partial_sum_linear(_IIter __begin, _IIter __end, _OutputIterator __result, _BinaryOperation __bin_op, typename std::iterator_traits< _IIter >::difference_type __n)
Parallel partial sum implementation, two-phase approach, no recursion.
_OutputIterator __parallel_partial_sum_basecase(_IIter __begin, _IIter __end, _OutputIterator __result, _BinaryOperation __bin_op, typename std::iterator_traits< _IIter >::value_type __value)
Base case prefix sum routine.