Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
47 commits
Select commit Hold shift + click to select a range
ec2d9db
refactor away redundant fill functor;
danhoeflinger Dec 19, 2025
d2e7ad7
fixing typo uninitialized_value_construct
danhoeflinger Dec 31, 2025
e2a89f1
revert formatting only changes
danhoeflinger Dec 31, 2025
9bd6615
fixing rebase
danhoeflinger Feb 20, 2026
f0c541c
formatting
danhoeflinger Feb 20, 2026
e14d992
formatting
danhoeflinger Feb 20, 2026
5b845ec
formatting
danhoeflinger Feb 25, 2026
c899892
move from algorithm to memory
danhoeflinger Feb 25, 2026
d94e5b9
reverting formatting only change
danhoeflinger Feb 25, 2026
854a06a
formatting fixes
danhoeflinger Feb 25, 2026
f1e0cd1
formatting
danhoeflinger Feb 25, 2026
4364736
adding memory_impl_hetero.h
danhoeflinger Feb 25, 2026
9f4e504
formatting, naming
danhoeflinger Feb 25, 2026
3a67d40
fix header
danhoeflinger Feb 25, 2026
9b8191b
refactor sycl_iter resolver (remove make_iter_mode)
danhoeflinger Dec 29, 2025
0fd8e76
fix trait (maintain good error msg)
danhoeflinger Dec 29, 2025
f2b2e7d
remove unused trait, rework comments
danhoeflinger Dec 31, 2025
b33e770
connecting no_init to accessors
danhoeflinger Dec 31, 2025
ddec100
formatting changes
danhoeflinger Dec 31, 2025
c894054
removing unnecessary comment
danhoeflinger Jan 2, 2026
7bfe401
adding static assertion for read + no_init
danhoeflinger Jan 2, 2026
1e123bd
fix rebase mistake
danhoeflinger Feb 25, 2026
22627b8
adjusting the SFINAE to allow user-friendly static assertions to trigger
danhoeflinger Feb 25, 2026
67cd47b
refactor away redundant fill functor;
danhoeflinger Dec 19, 2025
7f178b0
fixing typo uninitialized_value_construct
danhoeflinger Dec 31, 2025
724fb32
revert formatting only changes
danhoeflinger Dec 31, 2025
62db354
fixing rebase
danhoeflinger Feb 20, 2026
516b995
formatting
danhoeflinger Feb 20, 2026
c315942
formatting
danhoeflinger Feb 20, 2026
fc3af7f
formatting
danhoeflinger Feb 25, 2026
a9f4a9a
move from algorithm to memory
danhoeflinger Feb 25, 2026
39972a9
reverting formatting only change
danhoeflinger Feb 25, 2026
76cdfd3
formatting fixes
danhoeflinger Feb 25, 2026
0f229d5
formatting
danhoeflinger Feb 25, 2026
ed00490
adding memory_impl_hetero.h
danhoeflinger Feb 25, 2026
36f57e0
formatting, naming
danhoeflinger Feb 25, 2026
5364964
fix header
danhoeflinger Feb 25, 2026
47cffba
remove stale sycl_traits
danhoeflinger Feb 25, 2026
89aec8e
using fully qualified name
danhoeflinger Feb 25, 2026
0a56ec7
fix header copyright
danhoeflinger Mar 2, 2026
394ea4a
Merge branch 'dev/dhoeflin/unitialized_refactors' into dev/dhoeflin/r…
danhoeflinger Mar 4, 2026
1e5cbe7
Merge remote-tracking branch 'origin/main' into dev/dhoeflin/remove_m…
danhoeflinger Mar 11, 2026
c1efdff
::std -> std
danhoeflinger Mar 11, 2026
b20b931
address feedback
danhoeflinger Mar 12, 2026
a11e729
removing useless comments
danhoeflinger Mar 13, 2026
2a2396a
update to restore previous funcitonality from iter_mode_resolver
danhoeflinger Mar 13, 2026
bafe7f0
formatting
danhoeflinger Mar 13, 2026
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
Original file line number Diff line number Diff line change
Expand Up @@ -219,9 +219,9 @@ __rng_data(const _Rng& __rng)
// sycl::accessor::operator[] are supported only with -fsycl-esimd-force-stateless-mem.
// Otherwise, all memory accesses through an accessor are done via explicit APIs
// TODO: rely on begin() once -fsycl-esimd-force-stateless-mem has been enabled by default
template <typename _T, sycl::access::mode _M>
template <typename _T, sycl::access::mode _M, bool _NoInit>
auto
__rng_data(const oneapi::dpl::__ranges::all_view<_T, _M>& __view)
__rng_data(const oneapi::dpl::__ranges::all_view<_T, _M, _NoInit>& __view)
{
return __view.accessor();
}
Expand Down
4 changes: 1 addition & 3 deletions include/oneapi/dpl/internal/async_impl/async_impl_hetero.h
Original file line number Diff line number Diff line change
Expand Up @@ -169,9 +169,7 @@ __pattern_fill_async(__hetero_tag<_BackendTag> __tag, _ExecutionPolicy&& __exec,
_ForwardIterator __last, const _T& __value)
{
return __pattern_walk1_async<__par_backend_hetero::access_mode::write, /*_IsNoInitRequested=*/true>(
__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),
__tag, std::forward<_ExecutionPolicy>(__exec), __first, __last,
oneapi::dpl::__internal::__brick_fill<__hetero_tag<_BackendTag>, _T>{__value});
}

Expand Down
33 changes: 8 additions & 25 deletions include/oneapi/dpl/pstl/hetero/algorithm_impl_hetero.h
Original file line number Diff line number Diff line change
Expand Up @@ -302,9 +302,7 @@ __pattern_fill(__hetero_tag<_BackendTag> __tag, _ExecutionPolicy&& __exec, _Forw
_ForwardIterator __last, const _T& __value)
{
__pattern_hetero_walk1<__par_backend_hetero::access_mode::write, /*_IsNoInitRequested=*/true>(
__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),
__tag, std::forward<_ExecutionPolicy>(__exec), __first, __last,
__brick_fill<__hetero_tag<_BackendTag>, _T>{__value});
return __last;
}
Expand Down Expand Up @@ -340,10 +338,7 @@ __pattern_generate(__hetero_tag<_BackendTag> __tag, _ExecutionPolicy&& __exec, _
_ForwardIterator __last, _Generator __g)
{
__pattern_hetero_walk1<__par_backend_hetero::access_mode::write, /*_IsNoInitRequested=*/true>(
__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),
generate_functor<_Generator>{__g});
__tag, std::forward<_ExecutionPolicy>(__exec), __first, __last, generate_functor<_Generator>{__g});
return __last;
}

Expand Down Expand Up @@ -919,9 +914,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,
/*_IsNoInitRequested=*/true>();
Expand Down Expand Up @@ -1222,12 +1215,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

Expand Down Expand Up @@ -1468,11 +1456,8 @@ __pattern_partial_sort(__hetero_tag<_BackendTag>, _ExecutionPolicy&& __exec, _It
if (__last - __first < 2)
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)
__par_backend_hetero::__parallel_partial_sort(_BackendTag{}, std::forward<_ExecutionPolicy>(__exec), __first, __mid,
__last, __comp)
.__checked_deferrable_wait();
}

Expand Down Expand Up @@ -1569,10 +1554,8 @@ __pattern_partial_sort_copy(__hetero_tag<_BackendTag> __tag, _ExecutionPolicy&&
// the patterns: __pattern_hetero_walk2, __parallel_partial_sort and __pattern_hetero_walk2.

__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);
_BackendTag{}, __par_backend_hetero::make_wrapped_policy<__partial_sort_2>(__exec), __buf_first, __buf_mid,
__buf_last, __comp);

return __pattern_hetero_walk2<__par_backend_hetero::__deferrable_mode, __par_backend_hetero::access_mode::write,
/*_IsOutNoInitRequested=*/true>(
Expand Down
130 changes: 0 additions & 130 deletions include/oneapi/dpl/pstl/hetero/dpcpp/parallel_backend_sycl.h
Original file line number Diff line number Diff line change
Expand Up @@ -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 <access_mode inMode, access_mode outMode>
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<access_mode::read, access_mode::read_write>
{
static constexpr access_mode value = access_mode::read;
};

template <>
struct iter_mode_resolver<access_mode::write, access_mode::read_write>
{
static constexpr access_mode value = access_mode::write;
};

template <>
struct iter_mode_resolver<access_mode::read_write, access_mode::read>
{
//TODO: warn user that the access mode is changed
static constexpr access_mode value = access_mode::read;
};

template <>
struct iter_mode_resolver<access_mode::read_write, access_mode::write>
{
//TODO: warn user that the access mode is changed
static constexpr access_mode value = access_mode::write;
};

template <>
struct iter_mode_resolver<access_mode::discard_write, access_mode::write>
{
static constexpr access_mode value = access_mode::discard_write;
};

template <>
struct iter_mode_resolver<access_mode::discard_read_write, access_mode::write>
{
//TODO: warn user that the access mode is changed
static constexpr access_mode value = access_mode::write;
};

template <>
struct iter_mode_resolver<access_mode::discard_read_write, access_mode::read_write>
{
static constexpr access_mode value = access_mode::discard_read_write;
};

//-----------------------------------------------------------------------------
//- iter_mode
//-----------------------------------------------------------------------------

// create iterator with different access mode
template <access_mode outMode>
struct iter_mode
{
// for common heterogeneous iterator
template <template <access_mode, typename...> class Iter, access_mode inMode, typename... Types>
Iter<iter_mode_resolver<inMode, outMode>::value, Types...>
operator()(const Iter<inMode, Types...>& it)
{
constexpr access_mode preferredMode = iter_mode_resolver<inMode, outMode>::value;
if (inMode == preferredMode)
return it;
return Iter<preferredMode, Types...>(it);
}
// for counting_iterator
template <typename T>
oneapi::dpl::counting_iterator<T>
operator()(const oneapi::dpl::counting_iterator<T>& it)
{
return it;
}
// for zip_iterator
template <typename... Iters>
auto
operator()(const oneapi::dpl::zip_iterator<Iters...>& it)
-> decltype(oneapi::dpl::__internal::map_zip(*this, it.base()))
{
return oneapi::dpl::__internal::map_zip(*this, it.base());
}
// for common iterator
template <typename Iter>
Iter
operator()(const Iter& it1)
{
return it1;
}
// for raw pointers
template <typename T>
T*
operator()(T* ptr)
{
// it does not have any iter mode because of two factors:
// - since it is a raw pointer, kernel can read/write despite of access_mode
// - access_mode also serves for implicit synchronization for buffers to build graph dependency
// and since usm have only explicit synchronization and does not provide dependency resolution mechanism
// it does not require access_mode
return ptr;
}

template <typename T>
const T*
operator()(const T* ptr)
{
return ptr;
}
};

template <access_mode outMode, typename _Iterator>
auto
make_iter_mode(const _Iterator& __it) -> decltype(iter_mode<outMode>()(__it))
{
return iter_mode<outMode>()(__it);
}

// set of class templates to name kernels

Expand Down
Loading
Loading