Please use GitHub pull requests for new patches. Phabricator shutdown timeline
Changeset View
Changeset View
Standalone View
Standalone View
pstl/include/pstl/internal/omp/parallel_reduce.h
Show All 17 Lines | |||||
namespace __omp_backend | namespace __omp_backend | ||||
{ | { | ||||
template <class _RandomAccessIterator, class _Value, typename _RealBody, typename _Reduction> | template <class _RandomAccessIterator, class _Value, typename _RealBody, typename _Reduction> | ||||
_Value | _Value | ||||
__parallel_reduce_body(_RandomAccessIterator __first, _RandomAccessIterator __last, _Value __identity, | __parallel_reduce_body(_RandomAccessIterator __first, _RandomAccessIterator __last, _Value __identity, | ||||
_RealBody __real_body, _Reduction __reduce) | _RealBody __real_body, _Reduction __reduce) | ||||
{ | { | ||||
if (__should_run_serial(__first, __last)) | |||||
{ | |||||
return __real_body(__first, __last, __identity); | |||||
} | |||||
auto __middle = __first + ((__last - __first) / 2); | auto __middle = __first + ((__last - __first) / 2); | ||||
_Value __v1(__identity), __v2(__identity); | _Value __v1(__identity), __v2(__identity); | ||||
__parallel_invoke_body( | __parallel_invoke_body( | ||||
[&]() { __v1 = __parallel_reduce_body(__first, __middle, __identity, __real_body, __reduce); }, | [&]() { __v1 = __parallel_reduce_body(__first, __middle, __identity, __real_body, __reduce); }, | ||||
[&]() { __v2 = __parallel_reduce_body(__middle, __last, __identity, __real_body, __reduce); }); | [&]() { __v2 = __parallel_reduce_body(__middle, __last, __identity, __real_body, __reduce); }); | ||||
return __reduce(__v1, __v2); | return __reduce(__v1, __v2); | ||||
} | } | ||||
Show All 35 Lines |