Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Distributed-ranges namespace #1475

Closed
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
35 commits
Select commit Hold shift + click to select a range
9d1cdd1
[oneDPL] Avoid `__brick_reverse` and `__brick_reverse_copy` calls for…
SergeyKopienko Mar 13, 2024
440e673
cleanups
mateuszpn Mar 14, 2024
b66e052
Extend compiler support for the unified USM and buffer storage (#1410)
julianmi Mar 15, 2024
2f4897f
cleanups of include paths
mateuszpn Mar 18, 2024
9189849
cleanups of include paths and error messages
mateuszpn Mar 18, 2024
11fdbe7
Merge branch 'dist-ranges_cleanup' of github.com:mateuszpn/oneDPL int…
mateuszpn Mar 18, 2024
7eae79e
[oneDPL] Implementation of tag dispatching on current codebase (#1239)
SergeyKopienko Mar 20, 2024
cd56589
shp namespace moved to experimental
mateuszpn Mar 21, 2024
9e97305
namespace update
mateuszpn Mar 21, 2024
d492476
update
mateuszpn Mar 21, 2024
d5cfe25
[oneDPL] Pack `__parallel_for` and etc. calls into `__internal::__exc…
SergeyKopienko Mar 21, 2024
477b204
update
mateuszpn Mar 21, 2024
91c3a9a
Removing noexcept to resolve issue reported by static analysis. (#1462)
timmiesmith Mar 22, 2024
0152437
CI updated for distributed-ranges
mateuszpn Mar 25, 2024
f489ff4
[Dynamic Selection] Skipping auto_tune and dynamic load tests when de…
AnuyaWelling2801 Mar 27, 2024
5bac408
[CI] Update DPC++ and oneTBB on Windows (#1473)
dmitriy-sobolev Apr 2, 2024
5e43e65
Merge branch 'oneapi-src:main' into dr_namespace
mateuszpn Apr 4, 2024
6a45be7
Adding std::vector<T, usm_allocator>::iterator to is_passed_directly …
danhoeflinger Apr 4, 2024
2f84319
[oneDPL][hetero] + missed synch between patterns,removed unnecessary …
MikeDvorskiy Apr 5, 2024
bc74b46
Merge branch 'oneapi-src:main' into dr_namespace
mateuszpn Apr 8, 2024
658e465
[oneDPL][sycl] + sycl::is_device_copyable specialization of the SYCL …
MikeDvorskiy Feb 1, 2024
8e943bb
[oneDPL][sycl] + sycl::is_device_copyable specialization fixes
MikeDvorskiy Feb 12, 2024
f31af79
[oneDPL][sycl] sycl::is_device_copyable specialization: + clang format
MikeDvorskiy Feb 13, 2024
35bb6bf
[oneDPL][sycl] sycl::is_device_copyable specialization: + a comment
MikeDvorskiy Feb 13, 2024
80cf60b
[oneDPL][sycl] + #include "sycl_traits.h"
MikeDvorskiy Feb 13, 2024
89c92c3
[oneDPL][sycl] + forward declaration for __early_exit_find_or
MikeDvorskiy Feb 14, 2024
60884a2
[oneDPL][sycl] + necessary includes
MikeDvorskiy Feb 14, 2024
ddaf6fe
Revert "[oneDPL][sycl] + necessary includes"
MikeDvorskiy Feb 14, 2024
797498d
[oneDPL][sycl] + necessary forward declarations
MikeDvorskiy Feb 15, 2024
03c69f1
[oneDPL][sycl] include place changed
MikeDvorskiy Feb 15, 2024
1047d4a
[oneDPL][sycl][dpcpp] #include "sycl_traits.h" //SYCL traits speciali…
MikeDvorskiy Feb 22, 2024
db83006
[oneDPL] removed _ONEDPL_DEVICE_COPYABLE(zip_forward_iterator) due to…
MikeDvorskiy Apr 8, 2024
5e98434
remove matrices and logs
mateuszpn Apr 8, 2024
c2e3911
Merge branch 'dr_namespace' of github.com:mateuszpn/oneDPL into dr_na…
mateuszpn Apr 8, 2024
9fd9ac0
Merge branch 'oneapi-src:main' into dr_namespace
mateuszpn Apr 8, 2024
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 8 additions & 2 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,8 @@ env:
BUILD_CONCURRENCY: 2
MACOS_BUILD_CONCURRENCY: 3
TEST_TIMEOUT: 360
WINDOWS_TBB_DOWNLOAD_LINK: https://registrationcenter-download.intel.com/akdlm/IRC_NAS/64957c0f-37bf-4408-909c-37ff52fe5119/w_tbb_oneapi_p_2021.11.0.49526.exe
WINDOWS_ICPX_DOWNLOAD_LINK: https://registrationcenter-download.intel.com/akdlm/IRC_NAS/94e15cb5-4bcc-4fdd-91cf-0f819a54e42e/w_dpcpp-cpp-compiler_p_2024.0.2.28_offline.exe
WINDOWS_TBB_DOWNLOAD_LINK: https://registrationcenter-download.intel.com/akdlm/IRC_NAS/c0b87e5c-1e1f-431f-b26e-dc250032e586/w_tbb_oneapi_p_2021.12.0.500_offline.exe
WINDOWS_ICPX_DOWNLOAD_LINK: https://registrationcenter-download.intel.com/akdlm/IRC_NAS/a1d6c917-05ab-4883-b67b-4bd60abb74e5/w_dpcpp-cpp-compiler_p_2024.1.0.469_offline.exe
WINDOWS_ONEAPI_PATH: C:\Program Files (x86)\Intel\oneAPI
LINUX_ONEAPI_PATH: /opt/intel/oneapi
# TODO: get rid of a deprecated configuration: Intel® C++ Compiler Classic
Expand Down Expand Up @@ -172,6 +172,12 @@ jobs:
build_type: release
backend: serial
device_type: HOST
- os: ubuntu-20.04
cxx_compiler: icpx
std: 20
build_type: release
backend: dpcpp
device_type: HOST
steps:
- uses: actions/checkout@v3
- name: Set up Intel APT repository
Expand Down
8 changes: 8 additions & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -311,6 +311,14 @@ if (ONEDPL_BACKEND MATCHES "^(tbb|dpcpp|dpcpp_only)$")
$<$<AND:$<BOOL:${ONEDPL_USE_DEVICE_FPGA_HW}>,$<BOOL:${ONEDPL_FPGA_STATIC_REPORT}>>:-fsycl-link>
${ONEDPL_AOT_OPTIONS}
)

# if C++20 or newer, include Distributed Ranges (experimental)
if (CMAKE_CXX_STANDARD GREATER_EQUAL 20)
set(ONEDPL_USE_DR TRUE)
message(STATUS "Adding Distributed Ranges to the project")
else()
message(STATUS "C++20 required to use Distributed Ranges in oneDPL")
endif()
endif()

elseif(ONEDPL_BACKEND MATCHES "^(serial)$")
Expand Down
5 changes: 5 additions & 0 deletions include/oneapi/dpl/distributed-ranges
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,11 @@
#include "oneapi/dpl/internal/common_config.h"
#include "oneapi/dpl/pstl/onedpl_config.h"

// #if _ONEDPL_BACKEND_SYCL != 0 && __INTEL_LLVM_COMPILER >= 20230000
#if defined(ONEDPL_USE_DISTRIBUTED_RANGES)
#include "oneapi/dpl/internal/distributed_ranges_impl/shp.hpp"
#else
#error "C++20 required to use Distributed Ranges"
#endif

#endif /* _ONEDPL_DISTRIBUTED_RANGES */
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@

#include "../../../pstl/hetero/dpcpp/utils_ranges_sycl.h"
#include "../../../pstl/hetero/dpcpp/parallel_backend_sycl_utils.h"
#include "../../../pstl/hetero/dpcpp/sycl_traits.h" //SYCL traits specialization for some oneDPL types.

#include "esimd_radix_sort_kernels.h"
#include "esimd_defs.h"
Expand Down
118 changes: 59 additions & 59 deletions include/oneapi/dpl/internal/async_impl/async_impl_hetero.h
Original file line number Diff line number Diff line change
Expand Up @@ -30,10 +30,10 @@ namespace dpl
namespace __internal
{

template <typename _ExecutionPolicy, typename _ForwardIterator, typename _Function,
oneapi::dpl::__internal::__enable_if_device_execution_policy<_ExecutionPolicy, int> = 0>
template <typename _BackendTag, typename _ExecutionPolicy, typename _ForwardIterator, typename _Function>
auto
__pattern_walk1_async(_ExecutionPolicy&& __exec, _ForwardIterator __first, _ForwardIterator __last, _Function __f)
__pattern_walk1_async(__hetero_tag<_BackendTag>, _ExecutionPolicy&& __exec, _ForwardIterator __first,
_ForwardIterator __last, _Function __f)
{
auto __n = __last - __first;
assert(__n > 0);
Expand All @@ -43,19 +43,19 @@ __pattern_walk1_async(_ExecutionPolicy&& __exec, _ForwardIterator __first, _Forw
auto __buf = __keep(__first, __last);

auto __future_obj = oneapi::dpl::__par_backend_hetero::__parallel_for(
::std::forward<_ExecutionPolicy>(__exec), unseq_backend::walk_n<_ExecutionPolicy, _Function>{__f}, __n,
__buf.all_view());
_BackendTag{}, ::std::forward<_ExecutionPolicy>(__exec),
unseq_backend::walk_n<_ExecutionPolicy, _Function>{__f}, __n, __buf.all_view());
return __future_obj;
}

template <typename _IsSync = ::std::false_type,
__par_backend_hetero::access_mode __acc_mode1 = __par_backend_hetero::access_mode::read,
__par_backend_hetero::access_mode __acc_mode2 = __par_backend_hetero::access_mode::write,
typename _ExecutionPolicy, typename _ForwardIterator1, typename _ForwardIterator2, typename _Function,
oneapi::dpl::__internal::__enable_if_device_execution_policy<_ExecutionPolicy, int> = 0>
typename _BackendTag, typename _ExecutionPolicy, typename _ForwardIterator1, typename _ForwardIterator2,
typename _Function>
auto
__pattern_walk2_async(_ExecutionPolicy&& __exec, _ForwardIterator1 __first1, _ForwardIterator1 __last1,
_ForwardIterator2 __first2, _Function __f)
__pattern_walk2_async(__hetero_tag<_BackendTag>, _ExecutionPolicy&& __exec, _ForwardIterator1 __first1,
_ForwardIterator1 __last1, _ForwardIterator2 __first2, _Function __f)
{
auto __n = __last1 - __first1;
assert(__n > 0);
Expand All @@ -67,20 +67,20 @@ __pattern_walk2_async(_ExecutionPolicy&& __exec, _ForwardIterator1 __first1, _Fo
auto __buf2 = __keep2(__first2, __first2 + __n);

auto __future = oneapi::dpl::__par_backend_hetero::__parallel_for(
::std::forward<_ExecutionPolicy>(__exec), unseq_backend::walk_n<_ExecutionPolicy, _Function>{__f}, __n,
__buf1.all_view(), __buf2.all_view());
_BackendTag{}, ::std::forward<_ExecutionPolicy>(__exec),
unseq_backend::walk_n<_ExecutionPolicy, _Function>{__f}, __n, __buf1.all_view(), __buf2.all_view());

if constexpr (_IsSync::value)
__future.wait();

return __future.__make_future(__first2 + __n);
}

template <typename _ExecutionPolicy, typename _ForwardIterator1, typename _ForwardIterator2, typename _ForwardIterator3,
typename _Function, oneapi::dpl::__internal::__enable_if_device_execution_policy<_ExecutionPolicy, int> = 0>
template <typename _BackendTag, typename _ExecutionPolicy, typename _ForwardIterator1, typename _ForwardIterator2,
typename _ForwardIterator3, typename _Function>
auto
__pattern_walk3_async(_ExecutionPolicy&& __exec, _ForwardIterator1 __first1, _ForwardIterator1 __last1,
_ForwardIterator2 __first2, _ForwardIterator3 __first3, _Function __f)
__pattern_walk3_async(__hetero_tag<_BackendTag>, _ExecutionPolicy&& __exec, _ForwardIterator1 __first1,
_ForwardIterator1 __last1, _ForwardIterator2 __first2, _ForwardIterator3 __first3, _Function __f)
{
auto __n = __last1 - __first1;
assert(__n > 0);
Expand All @@ -95,20 +95,22 @@ __pattern_walk3_async(_ExecutionPolicy&& __exec, _ForwardIterator1 __first1, _Fo
oneapi::dpl::__ranges::__get_sycl_range<__par_backend_hetero::access_mode::write, _ForwardIterator3>();
auto __buf3 = __keep3(__first3, __first3 + __n);

auto __future = oneapi::dpl::__par_backend_hetero::__parallel_for(
::std::forward<_ExecutionPolicy>(__exec), unseq_backend::walk_n<_ExecutionPolicy, _Function>{__f}, __n,
__buf1.all_view(), __buf2.all_view(), __buf3.all_view());
auto __future =
oneapi::dpl::__par_backend_hetero::__parallel_for(_BackendTag{}, ::std::forward<_ExecutionPolicy>(__exec),
unseq_backend::walk_n<_ExecutionPolicy, _Function>{__f}, __n,
__buf1.all_view(), __buf2.all_view(), __buf3.all_view());

return __future.__make_future(__first3 + __n);
}

template <typename _ExecutionPolicy, typename _ForwardIterator1, typename _ForwardIterator2, typename _Brick,
oneapi::dpl::__internal::__enable_if_device_execution_policy<_ExecutionPolicy, int> = 0>
template <typename _BackendTag, typename _ExecutionPolicy, typename _ForwardIterator1, typename _ForwardIterator2,
typename _Brick>
auto
__pattern_walk2_brick_async(_ExecutionPolicy&& __exec, _ForwardIterator1 __first1, _ForwardIterator1 __last1,
_ForwardIterator2 __first2, _Brick __brick)
__pattern_walk2_brick_async(__hetero_tag<_BackendTag> __tag, _ExecutionPolicy&& __exec, _ForwardIterator1 __first1,
_ForwardIterator1 __last1, _ForwardIterator2 __first2, _Brick __brick)
{
return __pattern_walk2_async(
__tag,
__par_backend_hetero::make_wrapped_policy<__walk2_brick_wrapper>(::std::forward<_ExecutionPolicy>(__exec)),
__first1, __last1, __first2, __brick);
}
Expand All @@ -117,11 +119,10 @@ __pattern_walk2_brick_async(_ExecutionPolicy&& __exec, _ForwardIterator1 __first
// transform_reduce (version with two binary functions)
//------------------------------------------------------------------------

template <typename _ExecutionPolicy, typename _RandomAccessIterator1, typename _RandomAccessIterator2, typename _Tp,
typename _BinaryOperation1, typename _BinaryOperation2,
oneapi::dpl::__internal::__enable_if_device_execution_policy<_ExecutionPolicy, int> = 0>
template <typename _BackendTag, typename _ExecutionPolicy, typename _RandomAccessIterator1,
typename _RandomAccessIterator2, typename _Tp, typename _BinaryOperation1, typename _BinaryOperation2>
auto
__pattern_transform_reduce_async(_ExecutionPolicy&& __exec, _RandomAccessIterator1 __first1,
__pattern_transform_reduce_async(__hetero_tag<_BackendTag>, _ExecutionPolicy&& __exec, _RandomAccessIterator1 __first1,
_RandomAccessIterator1 __last1, _RandomAccessIterator2 __first2, _Tp __init,
_BinaryOperation1 __binary_op1, _BinaryOperation2 __binary_op2)
{
Expand All @@ -141,7 +142,7 @@ __pattern_transform_reduce_async(_ExecutionPolicy&& __exec, _RandomAccessIterato

return oneapi::dpl::__par_backend_hetero::__parallel_transform_reduce<_RepackedTp,
::std::true_type /*is_commutative*/>(
::std::forward<_ExecutionPolicy>(__exec), __binary_op1, _Functor{__binary_op2},
_BackendTag{}, ::std::forward<_ExecutionPolicy>(__exec), __binary_op1, _Functor{__binary_op2},
unseq_backend::__init_value<_RepackedTp>{__init}, // initial value
__buf1.all_view(), __buf2.all_view());
}
Expand All @@ -150,12 +151,12 @@ __pattern_transform_reduce_async(_ExecutionPolicy&& __exec, _RandomAccessIterato
// transform_reduce (with unary and binary functions)
//------------------------------------------------------------------------

template <typename _ExecutionPolicy, typename _ForwardIterator, typename _Tp, typename _BinaryOperation,
typename _UnaryOperation,
oneapi::dpl::__internal::__enable_if_device_execution_policy<_ExecutionPolicy, int> = 0>
template <typename _BackendTag, typename _ExecutionPolicy, typename _ForwardIterator, typename _Tp,
typename _BinaryOperation, typename _UnaryOperation>
auto
__pattern_transform_reduce_async(_ExecutionPolicy&& __exec, _ForwardIterator __first, _ForwardIterator __last,
_Tp __init, _BinaryOperation __binary_op, _UnaryOperation __unary_op)
__pattern_transform_reduce_async(__hetero_tag<_BackendTag>, _ExecutionPolicy&& __exec, _ForwardIterator __first,
_ForwardIterator __last, _Tp __init, _BinaryOperation __binary_op,
_UnaryOperation __unary_op)
{
assert(__first < __last);

Expand All @@ -168,18 +169,18 @@ __pattern_transform_reduce_async(_ExecutionPolicy&& __exec, _ForwardIterator __f

return oneapi::dpl::__par_backend_hetero::__parallel_transform_reduce<_RepackedTp,
::std::true_type /*is_commutative*/>(
::std::forward<_ExecutionPolicy>(__exec), __binary_op, _Functor{__unary_op},
_BackendTag{}, ::std::forward<_ExecutionPolicy>(__exec), __binary_op, _Functor{__unary_op},
unseq_backend::__init_value<_RepackedTp>{__init}, // initial value
__buf.all_view());
}

template <typename _ExecutionPolicy, typename _ForwardIterator, typename _T,
oneapi::dpl::__internal::__enable_if_device_execution_policy<_ExecutionPolicy, int> = 0>
template <typename _BackendTag, typename _ExecutionPolicy, typename _ForwardIterator, typename _T>
auto
__pattern_fill_async(_ExecutionPolicy&& __exec, _ForwardIterator __first, _ForwardIterator __last, const _T& __value)
__pattern_fill_async(__hetero_tag<_BackendTag> __tag, _ExecutionPolicy&& __exec, _ForwardIterator __first,
_ForwardIterator __last, const _T& __value)
{
return __pattern_walk1_async(
::std::forward<_ExecutionPolicy>(__exec),
__tag, ::std::forward<_ExecutionPolicy>(__exec),
__par_backend_hetero::make_iter_mode<__par_backend_hetero::access_mode::write>(__first),
__par_backend_hetero::make_iter_mode<__par_backend_hetero::access_mode::write>(__last),
fill_functor<_T>{__value});
Expand All @@ -189,13 +190,12 @@ __pattern_fill_async(_ExecutionPolicy&& __exec, _ForwardIterator __first, _Forwa
// transform_scan
//------------------------------------------------------------------------

template <typename _ExecutionPolicy, typename _Iterator1, typename _Iterator2, typename _UnaryOperation,
typename _InitType, typename _BinaryOperation, typename _Inclusive,
oneapi::dpl::__internal::__enable_if_hetero_execution_policy<_ExecutionPolicy, int> = 0>
template <typename _BackendTag, typename _ExecutionPolicy, typename _Iterator1, typename _Iterator2,
typename _UnaryOperation, typename _InitType, typename _BinaryOperation, typename _Inclusive>
auto
__pattern_transform_scan_base_async(_ExecutionPolicy&& __exec, _Iterator1 __first, _Iterator1 __last,
_Iterator2 __result, _UnaryOperation __unary_op, _InitType __init,
_BinaryOperation __binary_op, _Inclusive)
__pattern_transform_scan_base_async(__hetero_tag<_BackendTag>, _ExecutionPolicy&& __exec, _Iterator1 __first,
_Iterator1 __last, _Iterator2 __result, _UnaryOperation __unary_op,
_InitType __init, _BinaryOperation __binary_op, _Inclusive)
{
assert(__first < __last);

Expand All @@ -206,39 +206,39 @@ __pattern_transform_scan_base_async(_ExecutionPolicy&& __exec, _Iterator1 __firs
auto __buf2 = __keep2(__result, __result + __n);

auto __res = oneapi::dpl::__par_backend_hetero::__parallel_transform_scan(
::std::forward<_ExecutionPolicy>(__exec), __buf1.all_view(), __buf2.all_view(), __n, __unary_op, __init,
__binary_op, _Inclusive{});
_BackendTag{}, ::std::forward<_ExecutionPolicy>(__exec), __buf1.all_view(), __buf2.all_view(), __n, __unary_op,
__init, __binary_op, _Inclusive{});
return __res.__make_future(__result + __n);
}

template <typename _ExecutionPolicy, typename _Iterator1, typename _Iterator2, typename _UnaryOperation, typename _Type,
typename _BinaryOperation, typename _Inclusive,
oneapi::dpl::__internal::__enable_if_hetero_execution_policy<_ExecutionPolicy, int> = 0>
template <typename _BackendTag, typename _ExecutionPolicy, typename _Iterator1, typename _Iterator2,
typename _UnaryOperation, typename _Type, typename _BinaryOperation, typename _Inclusive>
auto
__pattern_transform_scan_async(_ExecutionPolicy&& __exec, _Iterator1 __first, _Iterator1 __last, _Iterator2 __result,
_UnaryOperation __unary_op, _Type __init, _BinaryOperation __binary_op, _Inclusive)
__pattern_transform_scan_async(__hetero_tag<_BackendTag> __tag, _ExecutionPolicy&& __exec, _Iterator1 __first,
_Iterator1 __last, _Iterator2 __result, _UnaryOperation __unary_op, _Type __init,
_BinaryOperation __binary_op, _Inclusive)
{
using _RepackedType = __par_backend_hetero::__repacked_tuple_t<_Type>;
using _InitType = unseq_backend::__init_value<_RepackedType>;

return __pattern_transform_scan_base_async(::std::forward<_ExecutionPolicy>(__exec), __first, __last, __result,
__unary_op, _InitType{__init}, __binary_op, _Inclusive{});
return __pattern_transform_scan_base_async(__tag, ::std::forward<_ExecutionPolicy>(__exec), __first, __last,
__result, __unary_op, _InitType{__init}, __binary_op, _Inclusive{});
}

// scan without initial element
template <typename _ExecutionPolicy, typename _Iterator1, typename _Iterator2, typename _UnaryOperation,
typename _BinaryOperation, typename _Inclusive,
oneapi::dpl::__internal::__enable_if_hetero_execution_policy<_ExecutionPolicy, int> = 0>
template <typename _BackendTag, typename _ExecutionPolicy, typename _Iterator1, typename _Iterator2,
typename _UnaryOperation, typename _BinaryOperation, typename _Inclusive>
auto
__pattern_transform_scan_async(_ExecutionPolicy&& __exec, _Iterator1 __first, _Iterator1 __last, _Iterator2 __result,
_UnaryOperation __unary_op, _BinaryOperation __binary_op, _Inclusive)
__pattern_transform_scan_async(__hetero_tag<_BackendTag> __tag, _ExecutionPolicy&& __exec, _Iterator1 __first,
_Iterator1 __last, _Iterator2 __result, _UnaryOperation __unary_op,
_BinaryOperation __binary_op, _Inclusive)
{
using _ValueType = typename ::std::iterator_traits<_Iterator1>::value_type;
using _RepackedType = __par_backend_hetero::__repacked_tuple_t<_ValueType>;
using _InitType = unseq_backend::__no_init_value<_RepackedType>;

return __pattern_transform_scan_base_async(::std::forward<_ExecutionPolicy>(__exec), __first, __last, __result,
__unary_op, _InitType{}, __binary_op, _Inclusive{});
return __pattern_transform_scan_base_async(__tag, ::std::forward<_ExecutionPolicy>(__exec), __first, __last,
__result, __unary_op, _InitType{}, __binary_op, _Inclusive{});
}

} // namespace __internal
Expand Down
Loading
Loading