19 #include <type_traits>
23 inline namespace _V1 {
24 namespace ext::oneapi::experimental {
28 static constexpr
bool value =
true;
30 template <
size_t X,
size_t... Xs>
struct AllNonZero<X, Xs...> {
39 template <
size_t... Dims>
41 std::integral_constant<size_t, Dims>...>;
46 template <
size_t... Dims>
48 std::integral_constant<size_t, Dims>...>;
53 template <u
int32_t Size>
55 std::integral_constant<uint32_t, Size>>;
59 template <aspect... Aspects>
61 std::integral_constant<aspect, Aspects>...>;
64 template <
size_t Dim0,
size_t... Dims>
66 std::integral_constant<size_t, Dims>...> {
68 sizeof...(Dims) + 1 <= 3,
69 "work_group_size property currently only supports up to three values.");
71 "work_group_size property must only contain non-zero values.");
76 return std::array<size_t,
sizeof...(Dims) + 1>{Dim0, Dims...}[Dim];
80 template <
size_t Dim0,
size_t... Dims>
82 std::integral_constant<size_t, Dim0>,
83 std::integral_constant<size_t, Dims>...> {
84 static_assert(
sizeof...(Dims) + 1 <= 3,
85 "work_group_size_hint property currently "
86 "only supports up to three values.");
89 "work_group_size_hint property must only contain non-zero values.");
94 return std::array<size_t,
sizeof...(Dims) + 1>{Dim0, Dims...}[Dim];
98 template <u
int32_t Size>
100 std::integral_constant<uint32_t, Size>> {
101 static_assert(Size != 0,
102 "sub_group_size_key property must contain a non-zero value.");
105 using value_t = std::integral_constant<uint32_t, Size>;
106 static constexpr uint32_t value = Size;
109 template <aspect... Aspects>
111 std::integral_constant<aspect, Aspects>...> {
113 static constexpr std::array<aspect,
sizeof...(Aspects)> value{Aspects...};
116 template <
size_t Dim0,
size_t... Dims>
119 template <
size_t Dim0,
size_t... Dims>
123 template <u
int32_t Size>
126 template <aspect... Aspects>
130 template <
size_t Dim0,
size_t... Dims>
132 static constexpr
const char *
name =
"sycl-work-group-size";
133 static constexpr
const char *
value = SizeListToStr<Dim0, Dims...>
::value;
135 template <
size_t Dim0,
size_t... Dims>
137 static constexpr
const char *
name =
"sycl-work-group-size-hint";
138 static constexpr
const char *
value = SizeListToStr<Dim0, Dims...>
::value;
140 template <u
int32_t Size>
142 static constexpr
const char *
name =
"sycl-sub-group-size";
143 static constexpr uint32_t
value = Size;
145 template <aspect... Aspects>
147 static constexpr
const char *
name =
"sycl-device-has";
148 static constexpr
const char *
value =
149 SizeListToStr<static_cast<size_t>(Aspects)...>
::value;
152 template <
typename T,
typename =
void>
155 template <
typename T>
157 std::void_t<decltype(std::declval<T>().get(
158 std::declval<properties_tag>()))>>
161 decltype(std::declval<T>().
get(std::declval<properties_tag>()));
169 #ifdef __SYCL_DEVICE_ONLY__
170 #define SYCL_EXT_ONEAPI_FUNCTION_PROPERTY(PROP) \
171 [[__sycl_detail__::add_ir_attributes_function( \
172 {"sycl-device-has"}, \
173 sycl::ext::oneapi::experimental::detail::PropertyMetaInfo< \
174 std::remove_cv_t<std::remove_reference_t<decltype(PROP)>>>::name, \
175 sycl::ext::oneapi::experimental::detail::PropertyMetaInfo< \
176 std::remove_cv_t<std::remove_reference_t<decltype(PROP)>>>::value)]]
178 #define SYCL_EXT_ONEAPI_FUNCTION_PROPERTY(PROP)
constexpr sub_group_size_key::value_t< Size > sub_group_size
constexpr work_group_size_key::value_t< Dim0, Dims... > work_group_size
constexpr device_has_key::value_t< Aspects... > device_has
constexpr work_group_size_hint_key::value_t< Dim0, Dims... > work_group_size_hint
static constexpr bool value
decltype(std::declval< T >().get(std::declval< properties_tag >())) properties_t
std::integral_constant< uint32_t, Size > value_t
constexpr size_t operator[](int Dim) const
constexpr size_t operator[](int Dim) const