DPC++ Runtime
Runtime libraries for oneAPI DPC++
group_sort.hpp
Go to the documentation of this file.
1 //==--------- group_sort.hpp --- SYCL extension group sorting algorithm-----==//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 
9 #pragma once
10 
11 #if (!defined(_HAS_STD_BYTE) || _HAS_STD_BYTE != 0)
15 #include <type_traits>
16 
18 
19 namespace sycl {
21 namespace ext::oneapi::experimental {
22 namespace detail {
23 
24 // ---- traits
25 template <typename T, typename = void> struct has_difference_type {};
26 
27 template <typename T>
28 struct has_difference_type<T, sycl::detail::void_t<typename T::difference_type>>
29  : std::true_type {};
30 
31 template <typename T> struct has_difference_type<T *> : std::true_type {};
32 
33 template <typename Sorter, typename Group, typename Val, typename = void>
35  template <typename G>
37  typename std::is_same<Val, decltype(std::declval<Sorter>()(
38  std::declval<G>(), std::declval<Val>()))>;
39 
40  template <typename G = Group>
41  static decltype(std::integral_constant<bool,
43  sycl::is_group_v<G>>{})
44  test(int);
45 
46  template <typename = Group> static std::false_type test(...);
47 };
48 
49 template <typename Sorter, typename Group,
50  typename Ptr> // multi_ptr has difference_type and don't have other
51  // iterator's fields
53  Sorter, Group, Ptr,
54  sycl::detail::void_t<typename has_difference_type<Ptr>::type>> {
55  template <typename G = Group>
56  static decltype(std::declval<Sorter>()(std::declval<G>(), std::declval<Ptr>(),
57  std::declval<Ptr>()),
58  sycl::detail::is_generic_group<G>{})
59  test(int);
60 
61  template <typename = Group> static std::false_type test(...);
62 };
63 
64 template <typename Sorter, typename Group, typename ValOrPtr>
65 struct is_sorter : decltype(is_sorter_impl<Sorter, Group, ValOrPtr>::test(0)) {
66 };
67 } // namespace detail
68 
69 // ---- sort_over_group
70 template <typename Group, typename T, typename Sorter>
71 typename std::enable_if<detail::is_sorter<Sorter, Group, T>::value, T>::type
72 sort_over_group(Group group, T value, Sorter sorter) {
73 #ifdef __SYCL_DEVICE_ONLY__
74  return sorter(group, value);
75 #else
76  (void)group;
77  (void)value;
78  (void)sorter;
79  throw sycl::exception(
80  std::error_code(PI_ERROR_INVALID_DEVICE, sycl::sycl_category()),
81  "Group algorithms are not supported on host device.");
82 #endif
83 }
84 
85 template <typename Group, typename T, typename Compare, size_t Extent>
86 typename std::enable_if<!detail::is_sorter<Compare, Group, T>::value, T>::type
88  T value, Compare comp) {
89  return sort_over_group(
90  exec.get_group(), value,
92 }
93 
94 template <typename Group, typename T, size_t Extent>
95 typename std::enable_if<sycl::is_group_v<std::decay_t<Group>>, T>::type
97  T value) {
98  return sort_over_group(exec.get_group(), value,
100 }
101 
102 // ---- joint_sort
103 template <typename Group, typename Iter, typename Sorter>
104 typename std::enable_if<detail::is_sorter<Sorter, Group, Iter>::value,
105  void>::type
106 joint_sort(Group group, Iter first, Iter last, Sorter sorter) {
107 #ifdef __SYCL_DEVICE_ONLY__
108  sorter(group, first, last);
109 #else
110  (void)group;
111  (void)first;
112  (void)last;
113  (void)sorter;
114  throw sycl::exception(
115  std::error_code(PI_ERROR_INVALID_DEVICE, sycl::sycl_category()),
116  "Group algorithms are not supported on host device.");
117 #endif
118 }
119 
120 template <typename Group, typename Iter, typename Compare, size_t Extent>
121 typename std::enable_if<!detail::is_sorter<Compare, Group, Iter>::value,
122  void>::type
124  Iter last, Compare comp) {
125  joint_sort(exec.get_group(), first, last,
127 }
128 
129 template <typename Group, typename Iter, size_t Extent>
130 typename std::enable_if<sycl::is_group_v<std::decay_t<Group>>, void>::type
132  Iter last) {
133  joint_sort(exec.get_group(), first, last,
135 }
136 
137 } // namespace ext::oneapi::experimental
138 } // __SYCL_INLINE_VER_NAMESPACE(_V1)
139 } // namespace sycl
140 #endif
sycl::_V1::ext::oneapi::experimental::detail::is_sorter_impl
Definition: group_sort.hpp:34
sycl::_V1::ext::oneapi::experimental::detail::is_sorter
Definition: group_sort.hpp:65
sycl::_V1::sycl_category
const std::error_category & sycl_category() noexcept
Definition: exception.cpp:87
T
type_traits.hpp
sycl::_V1::ext::oneapi::experimental::group_with_scratchpad
Definition: type_traits.hpp:28
sycl::_V1::ext::oneapi::experimental::detail::is_sorter_impl::test
static decltype(std::integral_constant< bool, is_expected_return_type< G >::value &&sycl::is_group_v< G >>{}) test(int)
Definition: group_sort.hpp:44
__SYCL_INLINE_VER_NAMESPACE
#define __SYCL_INLINE_VER_NAMESPACE(X)
Definition: defines_elementary.hpp:11
sycl::_V1::ext::oneapi::experimental::joint_sort
std::enable_if< sycl::is_group_v< std::decay_t< Group > >, void >::type joint_sort(experimental::group_with_scratchpad< Group, Extent > exec, Iter first, Iter last)
Definition: group_sort.hpp:131
sycl::_V1::ext::oneapi::experimental::detail::has_difference_type
Definition: group_sort.hpp:25
sycl
---— Error handling, matching OpenCL plugin semantics.
Definition: access.hpp:14
group_helpers_sorters.hpp
group_sort_impl.hpp
sycl::_V1::ext::oneapi::experimental::default_sorter
Definition: group_helpers_sorters.hpp:32
defines_elementary.hpp
sycl::_V1::ext::oneapi::experimental::group_with_scratchpad::get_memory
sycl::span< std::byte, Extent > get_memory() const
Definition: group_helpers_sorters.hpp:28
sycl::_V1::ext::oneapi::experimental::sort_over_group
std::enable_if< sycl::is_group_v< std::decay_t< Group > >, T >::type sort_over_group(experimental::group_with_scratchpad< Group, Extent > exec, T value)
Definition: group_sort.hpp:96
sycl::_V1::ext::oneapi::experimental::detail::is_sorter_impl::is_expected_return_type
typename std::is_same< Val, decltype(std::declval< Sorter >()(std::declval< G >(), std::declval< Val >()))> is_expected_return_type
Definition: group_sort.hpp:38
sycl::_V1::ext::oneapi::experimental::group_with_scratchpad::get_group
Group get_group() const
Definition: group_helpers_sorters.hpp:27
sycl::_V1::group
Definition: helpers.hpp:30
sycl::_V1::detail::void_t
void void_t
Definition: stl_type_traits.hpp:42