From 371b123513d72c38e7490d66e0ee477215d1d2e8 Mon Sep 17 00:00:00 2001 From: Dan Hoeflinger Date: Fri, 19 Dec 2025 17:00:35 -0500 Subject: [PATCH 01/11] refactor away redundant fill functor; fix access modes for uninitialized apis remove unnecessary pattern Signed-off-by: Dan Hoeflinger --- include/oneapi/dpl/pstl/algorithm_impl.h | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/include/oneapi/dpl/pstl/algorithm_impl.h b/include/oneapi/dpl/pstl/algorithm_impl.h index 20d7043f30f..06c5645502e 100644 --- a/include/oneapi/dpl/pstl/algorithm_impl.h +++ b/include/oneapi/dpl/pstl/algorithm_impl.h @@ -428,8 +428,8 @@ __pattern_walk2_brick_n(__parallel_tag<_IsVector>, _ExecutionPolicy&& __exec, _R template _ForwardIterator2 -__pattern_walk2_brick_n(_Tag, _ExecutionPolicy&&, _ForwardIterator1 __first1, _Size __n, - _ForwardIterator2 __first2, _Brick __brick) noexcept +__pattern_walk2_brick_n(_Tag, _ExecutionPolicy&&, _ForwardIterator1 __first1, _Size __n, _ForwardIterator2 __first2, + _Brick __brick) noexcept { static_assert(__is_serial_tag_v<_Tag> || __is_parallel_forward_tag_v<_Tag>); @@ -3417,11 +3417,13 @@ __parallel_set_op(__parallel_tag<_IsVector>, _ExecutionPolicy&& __exec, _RandomA //try searching for the first element which not equal to *__b if (__b != __first1) - __b += __internal::__pstl_upper_bound(__b, _DifferenceType1{0}, __last1 - __b, __b, __comp, __proj1, __proj1); + __b += __internal::__pstl_upper_bound(__b, _DifferenceType1{0}, __last1 - __b, __b, __comp, __proj1, + __proj1); //try searching for the first element which not equal to *__e if (__e != __last1) - __e += __internal::__pstl_upper_bound(__e, _DifferenceType1{0}, __last1 - __e, __e, __comp, __proj1, __proj1); + __e += __internal::__pstl_upper_bound(__e, _DifferenceType1{0}, __last1 - __e, __e, __comp, __proj1, + __proj1); //check is [__b; __e) empty if (__e - __b < 1) From a7ecfc28b5aadf343a3596c4e91f330ba7ef076b Mon Sep 17 00:00:00 2001 From: Dan Hoeflinger Date: Fri, 19 Dec 2025 17:00:35 -0500 Subject: [PATCH 02/11] refactor away redundant fill functor; fix access modes for uninitialized apis remove unnecessary pattern Signed-off-by: Dan Hoeflinger From aeda78008211ebd1f3c0c90c20689510d3b80915 Mon Sep 17 00:00:00 2001 From: Dan Hoeflinger Date: Mon, 29 Dec 2025 11:54:19 -0500 Subject: [PATCH 03/11] refactor sycl_iter resolver (remove make_iter_mode) Signed-off-by: Dan Hoeflinger --- .../internal/async_impl/async_impl_hetero.h | 7 +- .../dpl/pstl/hetero/algorithm_impl_hetero.h | 28 +--- .../pstl/hetero/dpcpp/parallel_backend_sycl.h | 130 ------------------ .../dpl/pstl/hetero/dpcpp/utils_ranges_sycl.h | 105 +++++++++++++- .../get_sycl_range.pass.cpp | 44 ++++++ 5 files changed, 155 insertions(+), 159 deletions(-) diff --git a/include/oneapi/dpl/internal/async_impl/async_impl_hetero.h b/include/oneapi/dpl/internal/async_impl/async_impl_hetero.h index faac0b2ff1c..93018aab76a 100644 --- a/include/oneapi/dpl/internal/async_impl/async_impl_hetero.h +++ b/include/oneapi/dpl/internal/async_impl/async_impl_hetero.h @@ -171,11 +171,8 @@ auto __pattern_fill_async(__hetero_tag<_BackendTag> __tag, _ExecutionPolicy&& __exec, _ForwardIterator __first, _ForwardIterator __last, const _T& __value) { - return __pattern_walk1_async( - __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), - oneapi::dpl::__internal::__brick_fill<__hetero_tag<_BackendTag>, _T>{__value}); + return __pattern_walk1_async(__tag, ::std::forward<_ExecutionPolicy>(__exec), __first, __last, + oneapi::dpl::__internal::__brick_fill<__hetero_tag<_BackendTag>, _T>{__value}); } //------------------------------------------------------------------------ diff --git a/include/oneapi/dpl/pstl/hetero/algorithm_impl_hetero.h b/include/oneapi/dpl/pstl/hetero/algorithm_impl_hetero.h index 4ee8acc5a30..ea57ff8609e 100644 --- a/include/oneapi/dpl/pstl/hetero/algorithm_impl_hetero.h +++ b/include/oneapi/dpl/pstl/hetero/algorithm_impl_hetero.h @@ -291,9 +291,7 @@ _ForwardIterator __pattern_fill(__hetero_tag<_BackendTag> __tag, _ExecutionPolicy&& __exec, _ForwardIterator __first, _ForwardIterator __last, const _T& __value) { - __pattern_walk1(__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), + __pattern_walk1(__tag, ::std::forward<_ExecutionPolicy>(__exec), __first, __last, __brick_fill<__hetero_tag<_BackendTag>, _T>{__value}); return __last; } @@ -328,9 +326,7 @@ _ForwardIterator __pattern_generate(__hetero_tag<_BackendTag> __tag, _ExecutionPolicy&& __exec, _ForwardIterator __first, _ForwardIterator __last, _Generator __g) { - __pattern_walk1(__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), + __pattern_walk1(__tag, ::std::forward<_ExecutionPolicy>(__exec), __first, __last, generate_functor<_Generator>{__g}); return __last; } @@ -908,9 +904,7 @@ __pattern_partition_copy(__hetero_tag<_BackendTag>, _ExecutionPolicy&& __exec, _ auto __keep1 = oneapi::dpl::__ranges::__get_sycl_range<__par_backend_hetero::access_mode::read>(); auto __buf1 = __keep1(__first, __last); - auto __zipped_res = __par_backend_hetero::zip( - __par_backend_hetero::make_iter_mode<__par_backend_hetero::access_mode::write>(__result1), - __par_backend_hetero::make_iter_mode<__par_backend_hetero::access_mode::write>(__result2)); + auto __zipped_res = __par_backend_hetero::zip(__result1, __result2); auto __keep2 = oneapi::dpl::__ranges::__get_sycl_range<__par_backend_hetero::access_mode::write, /*_NoInit=*/true>(); @@ -1211,12 +1205,7 @@ __pattern_inplace_merge(__hetero_tag<_BackendTag> __tag, _ExecutionPolicy&& __ex auto __copy_first = __buf.get(); auto __copy_last = __copy_first + __n; - __pattern_merge( - __tag, __exec, __par_backend_hetero::make_iter_mode<__par_backend_hetero::access_mode::read>(__first), - __par_backend_hetero::make_iter_mode<__par_backend_hetero::access_mode::read>(__middle), - __par_backend_hetero::make_iter_mode<__par_backend_hetero::access_mode::read>(__middle), - __par_backend_hetero::make_iter_mode<__par_backend_hetero::access_mode::read>(__last), - __par_backend_hetero::make_iter_mode<__par_backend_hetero::access_mode::write>(__copy_first), __comp); + __pattern_merge(__tag, __exec, __first, __middle, __middle, __last, __copy_first, __comp); //TODO: optimize copy back depending on Iterator, i.e. set_final_data for host iterator/pointer @@ -1455,10 +1444,7 @@ __pattern_partial_sort(__hetero_tag<_BackendTag>, _ExecutionPolicy&& __exec, _It return; __par_backend_hetero::__parallel_partial_sort( - _BackendTag{}, ::std::forward<_ExecutionPolicy>(__exec), - __par_backend_hetero::make_iter_mode<__par_backend_hetero::access_mode::read_write>(__first), - __par_backend_hetero::make_iter_mode<__par_backend_hetero::access_mode::read_write>(__mid), - __par_backend_hetero::make_iter_mode<__par_backend_hetero::access_mode::read_write>(__last), __comp) + _BackendTag{}, ::std::forward<_ExecutionPolicy>(__exec), __first, __mid, __last, __comp) .__checked_deferrable_wait(); } @@ -1552,9 +1538,7 @@ __pattern_partial_sort_copy(__hetero_tag<_BackendTag> __tag, _ExecutionPolicy&& __par_backend_hetero::__parallel_partial_sort( _BackendTag{}, __par_backend_hetero::make_wrapped_policy<__partial_sort_2>(__exec), - __par_backend_hetero::make_iter_mode<__par_backend_hetero::access_mode::read_write>(__buf_first), - __par_backend_hetero::make_iter_mode<__par_backend_hetero::access_mode::read_write>(__buf_mid), - __par_backend_hetero::make_iter_mode<__par_backend_hetero::access_mode::read_write>(__buf_last), __comp); + __buf_first, __buf_mid, __buf_last, __comp); return __pattern_walk2( __tag, __par_backend_hetero::make_wrapped_policy<__copy_back>(::std::forward<_ExecutionPolicy>(__exec)), diff --git a/include/oneapi/dpl/pstl/hetero/dpcpp/parallel_backend_sycl.h b/include/oneapi/dpl/pstl/hetero/dpcpp/parallel_backend_sycl.h index dbb77588847..36dc1a86743 100644 --- a/include/oneapi/dpl/pstl/hetero/dpcpp/parallel_backend_sycl.h +++ b/include/oneapi/dpl/pstl/hetero/dpcpp/parallel_backend_sycl.h @@ -66,136 +66,6 @@ namespace dpl namespace __par_backend_hetero { -//----------------------------------------------------------------------------- -//- iter_mode_resolver -//----------------------------------------------------------------------------- - -// iter_mode_resolver resolves the situations when -// the access mode provided by a user differs (inMode) from -// the access mode required by an algorithm (outMode). -// In general case iter_mode_resolver accepts the only situations -// when inMode == outMode, -// whereas the template specializations describe cases with specific -// inMode and outMode and the preferred access mode between the two. -template -struct iter_mode_resolver -{ - static_assert(inMode == outMode, "Access mode provided by user conflicts with the one required by the algorithm"); - static constexpr access_mode value = inMode; -}; - -template <> -struct iter_mode_resolver -{ - static constexpr access_mode value = access_mode::read; -}; - -template <> -struct iter_mode_resolver -{ - static constexpr access_mode value = access_mode::write; -}; - -template <> -struct iter_mode_resolver -{ - //TODO: warn user that the access mode is changed - static constexpr access_mode value = access_mode::read; -}; - -template <> -struct iter_mode_resolver -{ - //TODO: warn user that the access mode is changed - static constexpr access_mode value = access_mode::write; -}; - -template <> -struct iter_mode_resolver -{ - static constexpr access_mode value = access_mode::discard_write; -}; - -template <> -struct iter_mode_resolver -{ - //TODO: warn user that the access mode is changed - static constexpr access_mode value = access_mode::write; -}; - -template <> -struct iter_mode_resolver -{ - static constexpr access_mode value = access_mode::discard_read_write; -}; - -//----------------------------------------------------------------------------- -//- iter_mode -//----------------------------------------------------------------------------- - -// create iterator with different access mode -template -struct iter_mode -{ - // for common heterogeneous iterator - template