Skip to content

Commit

Permalink
Allow passing a non-trivially-copyable comparator to sort (#1932)
Browse files Browse the repository at this point in the history
Signed-off-by: Dmitriy Sobolev <[email protected]>
  • Loading branch information
dmitriy-sobolev authored Nov 6, 2024
1 parent cbef9b5 commit a037165
Show file tree
Hide file tree
Showing 3 changed files with 25 additions and 0 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
#include <type_traits> // std::decay_t, std::integral_constant

#include "sycl_defs.h" // __dpl_sycl::__local_accessor, __dpl_sycl::__group_barrier
#include "sycl_traits.h" // SYCL traits specialization for some oneDPL types.
#include "../../utils.h" // __dpl_bit_floor, __dpl_bit_ceil
#include "../../utils_ranges.h" // __difference_t
#include "parallel_backend_sycl_merge.h" // __find_start_point, __serial_merge
Expand Down
10 changes: 10 additions & 0 deletions include/oneapi/dpl/pstl/hetero/dpcpp/sycl_traits.h
Original file line number Diff line number Diff line change
Expand Up @@ -257,6 +257,9 @@ struct __write_to_id_if_else;
template <typename _ExecutionPolicy, typename _Pred>
struct __early_exit_find_or;

template <typename _Range, typename _Compare>
struct __leaf_sorter;

} // namespace oneapi::dpl::__par_backend_hetero

template <typename _UnaryOp>
Expand Down Expand Up @@ -313,6 +316,13 @@ struct sycl::is_device_copyable<_ONEDPL_SPECIALIZE_FOR(oneapi::dpl::__par_backen
{
};

template <typename _Range, typename _Compare>
struct sycl::is_device_copyable<_ONEDPL_SPECIALIZE_FOR(oneapi::dpl::__par_backend_hetero::__leaf_sorter, _Range,
_Compare)>
: oneapi::dpl::__internal::__are_all_device_copyable<_Range, _Compare>
{
};

namespace oneapi::dpl::unseq_backend
{

Expand Down
14 changes: 14 additions & 0 deletions test/general/implementation_details/device_copyable.pass.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -190,6 +190,15 @@ test_device_copyable()
oneapi::dpl::__par_backend_hetero::__early_exit_find_or<policy_non_device_copyable, noop_device_copyable>>,
"__early_exit_find_or is not device copyable with device copyable types");

// __leaf_sorter
// Note that the use of noop_device_copyable/noop_non_device_copyable is valid in this context because
// sycl::is_device_copyable specialization for __leaf_sorter does not require instantiation of
// __leaf_sorter with the provided types. See [temp.inst]/1 of C++17 spec for the details.
static_assert(
sycl::is_device_copyable_v<oneapi::dpl::__par_backend_hetero::__leaf_sorter<noop_device_copyable,
noop_device_copyable>>,
"__leaf_sorter is not device copyable with device copyable types");

//__not_pred
static_assert(sycl::is_device_copyable_v<oneapi::dpl::__internal::__not_pred<noop_device_copyable>>,
"__not_pred is not device copyable with device copyable types");
Expand Down Expand Up @@ -423,6 +432,11 @@ test_non_device_copyable()
noop_non_device_copyable>>,
"__early_exit_find_or is device copyable with non device copyable types");

// __leaf_sorter
static_assert(!sycl::is_device_copyable_v<oneapi::dpl::__par_backend_hetero::__leaf_sorter<noop_device_copyable,
noop_non_device_copyable>>,
"__leaf_sorter is device copyable with non device copyable types");

//__not_pred
static_assert(!sycl::is_device_copyable_v<oneapi::dpl::__internal::__not_pred<noop_non_device_copyable>>,
"__not_pred is device copyable with non device copyable types");
Expand Down

0 comments on commit a037165

Please sign in to comment.