20 namespace ext::oneapi::experimental {
24 static inline constexpr
bool value =
true;
26 template <
size_t X,
size_t... Xs>
struct AllNonZero<X, Xs...> {
27 static inline constexpr
bool value = X > 0 &&
AllNonZero<Xs...>::value;
34 template <
size_t... Dims>
36 std::integral_constant<size_t, Dims>...>;
40 template <
size_t... Dims>
42 std::integral_constant<size_t, Dims>...>;
46 template <u
int32_t Size>
48 std::integral_constant<uint32_t, Size>>;
52 template <aspect... Aspects>
54 std::integral_constant<aspect, Aspects>...>;
57 template <
size_t Dim0,
size_t... Dims>
59 std::integral_constant<size_t, Dims>...> {
61 sizeof...(Dims) + 1 <= 3,
62 "work_group_size property currently only supports up to three values.");
64 "work_group_size property must only contain non-zero values.");
69 return std::array<size_t,
sizeof...(Dims) + 1>{Dim0, Dims...}[Dim];
73 template <
size_t Dim0,
size_t... Dims>
75 std::integral_constant<size_t, Dim0>,
76 std::integral_constant<size_t, Dims>...> {
77 static_assert(
sizeof...(Dims) + 1 <= 3,
78 "work_group_size_hint property currently "
79 "only supports up to three values.");
82 "work_group_size_hint property must only contain non-zero values.");
87 return std::array<size_t,
sizeof...(Dims) + 1>{Dim0, Dims...}[Dim];
91 template <u
int32_t Size>
93 std::integral_constant<uint32_t, Size>> {
94 static_assert(Size != 0,
95 "sub_group_size_key property must contain a non-zero value.");
98 using value_t = std::integral_constant<uint32_t, Size>;
99 static constexpr uint32_t value = Size;
102 template <aspect... Aspects>
104 std::integral_constant<aspect, Aspects>...> {
106 static constexpr std::array<aspect,
sizeof...(Aspects)> value{Aspects...};
109 template <
size_t Dim0,
size_t... Dims>
112 template <
size_t Dim0,
size_t... Dims>
116 template <u
int32_t Size>
119 template <aspect... Aspects>
150 template <
size_t Dim0,
size_t... Dims>
152 static constexpr
const char *name =
"sycl-work-group-size";
153 static constexpr
const char *value = SizeListToStr<Dim0, Dims...>::value;
155 template <
size_t Dim0,
size_t... Dims>
157 static constexpr
const char *name =
"sycl-work-group-size-hint";
158 static constexpr
const char *value = SizeListToStr<Dim0, Dims...>::value;
160 template <u
int32_t Size>
162 static constexpr
const char *name =
"sycl-sub-group-size";
163 static constexpr uint32_t value = Size;
165 template <aspect... Aspects>
167 static constexpr
const char *name =
"sycl-device-has";
168 static constexpr
const char *value =
169 SizeListToStr<static_cast<size_t>(Aspects)...>::value;
172 template <
typename T,
typename =
void>
175 template <
typename T>
178 std::declval<properties_tag>()))>> : std::true_type {
180 decltype(std::declval<T>().
get(std::declval<properties_tag>()));
188 #ifdef __SYCL_DEVICE_ONLY__
189 #define SYCL_EXT_ONEAPI_FUNCTION_PROPERTY(PROP) \
190 [[__sycl_detail__::add_ir_attributes_function( \
191 {"sycl-device-has"}, \
192 sycl::ext::oneapi::experimental::detail::PropertyMetaInfo< \
193 std::remove_cv_t<std::remove_reference_t<decltype(PROP)>>>::name, \
194 sycl::ext::oneapi::experimental::detail::PropertyMetaInfo< \
195 std::remove_cv_t<std::remove_reference_t<decltype(PROP)>>>::value)]]
197 #define SYCL_EXT_ONEAPI_FUNCTION_PROPERTY(PROP)