25 #include <type_traits>
28 inline namespace _V1 {
30 template <
int N>
struct Boolean;
34 is_contained_v<T, gtl::scalar_vector_float_list>;
38 is_contained_v<T, gtl::scalar_vector_double_list>;
41 inline constexpr
bool is_half_v = is_contained_v<T, gtl::scalar_half_list>;
45 is_contained_v<T, gtl::scalar_bfloat16_list>;
49 is_contained_v<T, gtl::half_bfloat16_list>;
53 is_contained_v<T, gtl::scalar_vector_half_list>;
56 inline constexpr
bool is_genfloat_v = is_contained_v<T, gtl::floating_list>;
60 is_contained_v<T, gtl::scalar_floating_list>;
64 is_contained_v<T, gtl::vector_floating_list>;
68 is_contained_v<T, gtl::scalar_vector_floating_list>;
72 is_marray_v<T> && is_svgenfloat_v<get_elem_type_t<T>>;
79 is_contained_v<T, gtl::geo_double_list>;
83 is_contained_v<T, gtl::marray_geo_float_list>;
87 is_contained_v<T, gtl::marray_geo_list>;
94 is_contained_v<T, gtl::vector_geo_float_list>;
98 is_contained_v<T, gtl::vector_geo_double_list>;
100 template <
typename T>
102 is_contained_v<T, gtl::vector_geo_half_list>;
104 template <
typename T>
105 inline constexpr
bool is_sgengeo_v = is_contained_v<T, gtl::scalar_geo_list>;
107 template <
typename T>
108 inline constexpr
bool is_vgengeo_v = is_contained_v<T, gtl::vector_geo_list>;
110 template <
typename T>
112 is_contained_v<T, gtl::cross_float_list>;
114 template <
typename T>
116 is_contained_v<T, gtl::cross_double_list>;
118 template <
typename T>
120 is_contained_v<T, gtl::cross_half_list>;
122 template <
typename T>
124 is_contained_v<T, gtl::cross_floating_list>;
126 template <
typename T>
128 is_contained_v<T, gtl::cross_marray_list>;
130 template <
typename T>
131 inline constexpr
bool is_ugenint_v = is_contained_v<T, gtl::unsigned_int_list>;
133 template <
typename T>
135 is_contained_v<T, gtl::vector_signed_int_list>;
137 template <
typename T>
138 inline constexpr
bool is_genint_v = is_contained_v<T, gtl::signed_int_list>;
140 template <
typename T>
143 template <
typename T>
146 template <
typename T>
148 is_contained_v<T, gtl::signed_integer_list>;
150 template <
typename T>
153 template <
typename T>
155 is_contained_v<T, gtl::unsigned_integer_list>;
157 template <
typename T>
160 template <
typename T>
162 is_contained_v<T, gtl::scalar_integer_list>;
164 template <
typename T>
166 is_contained_v<T, gtl::vector_integer_list>;
168 template <
typename T>
170 is_contained_v<T, gtl::scalar_signed_integer_list>;
172 template <
typename T>
174 is_contained_v<T, gtl::scalar_unsigned_integer_list>;
176 template <
typename T>
178 is_contained_v<T, gtl::vector_signed_integer_list>;
180 template <
typename T>
182 is_contained_v<T, gtl::vector_unsigned_integer_list>;
184 template <
typename T>
185 inline constexpr
bool is_genbool_v = is_contained_v<T, gtl::bool_list>;
187 template <
typename T>
188 inline constexpr
bool is_gentype_v = is_contained_v<T, gtl::basic_list>;
190 template <
typename T>
191 inline constexpr
bool is_vgentype_v = is_contained_v<T, gtl::vector_basic_list>;
193 template <
typename T>
194 inline constexpr
bool is_sgentype_v = is_contained_v<T, gtl::scalar_basic_list>;
196 template <
typename T>
198 is_gen_based_on_type_sizeof_v<T, 1, is_igeninteger>;
200 template <
typename T>
202 is_gen_based_on_type_sizeof_v<T, 2, is_igeninteger>;
204 template <
typename T>
206 is_gen_based_on_type_sizeof_v<T, 4, is_igeninteger>;
208 template <
typename T>
210 is_gen_based_on_type_sizeof_v<T, 8, is_igeninteger>;
212 template <
typename T>
214 is_gen_based_on_type_sizeof_v<T, 1, is_ugeninteger>;
216 template <
typename T>
218 is_gen_based_on_type_sizeof_v<T, 2, is_ugeninteger>;
220 template <
typename T>
222 is_gen_based_on_type_sizeof_v<T, 4, is_ugeninteger>;
224 template <
typename T>
226 is_gen_based_on_type_sizeof_v<T, 8, is_ugeninteger>;
228 template <
typename T>
230 is_pointer_v<T> && is_genint_v<remove_pointer_t<T>> &&
231 is_address_space_compliant_v<T, gvl::nonconst_address_space_list>;
236 std::is_same_v<T, sycl::marray<marray_element_t<T>, T::size()>> &&
237 is_genint_v<marray_element_t<remove_pointer_t<T>>> &&
238 is_address_space_compliant_v<multi_ptr<T, AddressSpace, IsDecorated>,
243 template <
typename T>
245 is_pointer_v<T> && is_genfloat_v<remove_pointer_t<T>> &&
246 is_address_space_compliant_v<T, gvl::nonconst_address_space_list>;
252 is_address_space_compliant_v<multi_ptr<T, AddressSpace, IsDecorated>,
257 template <
typename T>
259 #if (!defined(_HAS_STD_BYTE) || _HAS_STD_BYTE != 0)
260 std::is_same<T, std::byte>;
267 template <
typename T>
270 template <
typename T>
273 template <
typename T>
282 std::conditional_t<Size == 4, opencl::cl_uint, opencl::cl_ulong>>>;
286 template <
typename T,
typename T8,
typename T16,
typename T32,
typename T64>
289 std::conditional_t<
sizeof(T) == 2, T16,
290 std::conditional_t<
sizeof(T) == 4, T32, T64>>>;
293 template <
typename T>
298 template <
typename T>
312 template <
typename T>
317 using no_ref = std::remove_reference_t<T>;
318 if constexpr (is_multi_ptr_v<no_ref>) {
320 }
else if constexpr (std::is_pointer_v<no_ref>) {
324 std::declval<std::remove_const_t<elem_type>>()));
325 using converted_elem_type =
326 std::conditional_t<std::is_const_v<elem_type>,
327 const converted_elem_type_no_cv,
328 converted_elem_type_no_cv>;
329 #ifdef __SYCL_DEVICE_ONLY__
332 deduce_AS<no_ref>::value>::type *;
334 using result_type = converted_elem_type *;
336 return reinterpret_cast<result_type
>(
x);
337 }
else if constexpr (is_vec_v<no_ref>) {
338 using ElemTy =
typename no_ref::element_type;
344 std::declval<ElemTy>()))>,
346 #ifdef __SYCL_DEVICE_ONLY__
347 return sycl::bit_cast<typename MatchingVec::vector_t>(
x);
349 return x.template as<MatchingVec>();
351 }
else if constexpr (is_boolean_v<no_ref>) {
352 #ifdef __SYCL_DEVICE_ONLY__
353 if constexpr (std::is_same_v<
Boolean<1>, no_ref>) {
355 return std::forward<T>(
x);
357 return static_cast<typename no_ref::vector_t
>(
x);
360 return std::forward<T>(
x);
362 #if (!defined(_HAS_STD_BYTE) || _HAS_STD_BYTE != 0)
363 }
else if constexpr (std::is_same_v<no_ref, std::byte>) {
364 return static_cast<uint8_t
>(
x);
366 }
else if constexpr (std::is_integral_v<no_ref>) {
368 std::conditional_t<std::is_signed_v<no_ref>,
371 static_assert(
sizeof(OpenCLType) ==
sizeof(T));
372 return static_cast<OpenCLType
>(
x);
373 }
else if constexpr (is_half_v<no_ref>) {
375 static_assert(
sizeof(OpenCLType) ==
sizeof(T));
376 return static_cast<OpenCLType
>(
x);
377 }
else if constexpr (is_bfloat16_v<no_ref>) {
379 #ifdef __SYCL_DEVICE_ONLY__
381 return sycl::bit_cast<OpenCLType>(
x);
383 return std::forward<T>(
x);
385 }
else if constexpr (std::is_floating_point_v<no_ref>) {
386 static_assert(std::is_same_v<no_ref, float> ||
387 std::is_same_v<no_ref, double>,
388 "Other FP types are not expected/supported (yet?)");
389 static_assert(std::is_same_v<float, sycl::opencl::cl_float> &&
390 std::is_same_v<double, sycl::opencl::cl_double>);
391 return std::forward<T>(
x);
394 static_assert(
sizeof(OpenCLType) ==
sizeof(T));
395 return static_cast<OpenCLType
>(
x);
399 template <
typename T>
403 if constexpr (std::is_same_v<To, bool> &&
404 std::is_same_v<std::remove_reference_t<From>,
bool>) {
409 static_assert(std::is_same_v<std::remove_reference_t<From>, OpenCLType>);
410 static_assert(
sizeof(OpenCLType) ==
sizeof(To));
411 using To_noref = std::remove_reference_t<To>;
412 using From_noref = std::remove_reference_t<From>;
413 if constexpr (is_vec_v<To_noref> && is_vec_v<From_noref>)
414 return x.template as<To_noref>();
415 else if constexpr (is_vec_v<To_noref> && is_ext_vector_v<From_noref>)
416 return To_noref{bit_cast<typename To_noref::vector_t>(
x)};
418 return static_cast<To
>(
x);
423 template <
typename T>
inline constexpr T
msbMask(T) {
425 return T(UT(1) << (
sizeof(T) * 8 - 1));
428 template <
typename T>
inline constexpr
bool msbIsSet(
const T x) {
436 template <
typename Type,
int NumElements>
438 static constexpr
int value = NumElements;
448 template <
typename A>
static typename A::element_type check(
const A &);
449 template <
typename A,
typename = std::enable_if_t<!std::is_same_v<
454 using type = decltype(check(T()));
455 static constexpr
bool value = !std::is_same_v<T, type>;
458 template <
typename T>
static constexpr T
max_v() {
462 template <
typename T>
static constexpr T
min_v() {
decltype(check(T())) type
static constexpr bool value
auto convertToOpenCLType(T &&x)
constexpr bool is_vgengeo_v
constexpr bool is_sgeninteger_v
constexpr bool is_ugeninteger8bit_v
constexpr bool is_svgenfloatd_v
constexpr bool is_gentype_v
std::bool_constant< is_ugeninteger_v< T > > is_ugeninteger
constexpr bool is_ugeninteger16bit_v
constexpr bool is_ugeninteger64bit_v
constexpr bool is_sugeninteger_v
constexpr bool is_ugeninteger_v
make_type_t< T, gtl::scalar_unsigned_integer_list > make_unsinged_integer_t
constexpr bool is_mgenfloat_v
constexpr bool is_igeninteger8bit_v
constexpr bool is_gengeofloat_v
static constexpr T min_v()
constexpr bool is_vugeninteger_v
constexpr bool is_sgengeo_v
std::conditional_t< sizeof(T)==1, T8, std::conditional_t< sizeof(T)==2, T16, std::conditional_t< sizeof(T)==4, T32, T64 > >> select_apply_cl_scalar_t
std::conditional_t< Size==1, opencl::cl_uchar, std::conditional_t< Size==2, opencl::cl_ushort, std::conditional_t< Size==4, opencl::cl_uint, opencl::cl_ulong > >> cl_unsigned
typename make_unsigned< T >::type make_unsigned_t
constexpr bool is_genfloat_v
constexpr bool is_vgengeofloat_v
constexpr bool is_igeninteger_v
make_type_t< T, gtl::scalar_signed_integer_list > make_singed_integer_t
constexpr bool is_ugenint_v
constexpr bool is_bfloat16_v
auto convertFromOpenCLTypeFor(From &&x)
select_apply_cl_scalar_t< T, sycl::opencl::cl_uchar, sycl::opencl::cl_ushort, sycl::opencl::cl_uint, sycl::opencl::cl_ulong > select_cl_scalar_integral_unsigned_t
constexpr bool is_genfloatptr_v
constexpr bool is_svgenfloath_v
constexpr bool is_sgenfloat_v
constexpr bool is_vgeninteger_v
constexpr bool is_sgentype_v
constexpr bool is_vgentype_v
constexpr bool is_gencrossmarray_v
constexpr bool is_ugeninteger32bit_v
constexpr bool is_igeninteger32bit_v
constexpr bool is_gencrosshalf_v
static constexpr T max_v()
constexpr bool is_igeninteger64bit_v
constexpr bool is_gengeodouble_v
constexpr bool is_gencross_v
constexpr bool is_svgenfloatf_v
constexpr bool is_vgenfloat_v
std::bool_constant< is_geninteger_v< T > > is_geninteger
constexpr bool is_geninteger_v
constexpr bool msbIsSet(const T x)
decltype(convertToOpenCLType(std::declval< T >())) ConvertToOpenCLType_t
constexpr bool is_gencrossfloat_v
constexpr bool is_genintptr_v
constexpr bool is_genintptr_marray_v
constexpr bool is_vgengeohalf_v
constexpr bool is_svgenfloat_v
typename std::is_same< T, std::byte > is_byte
constexpr bool is_vigeninteger_v
constexpr bool is_half_or_bf16_v
constexpr bool is_gengeomarray_v
std::bool_constant< is_igeninteger_v< T > > is_igeninteger
make_type_t< T, gtl::scalar_floating_list > make_floating_point_t
constexpr bool is_genfloatptr_marray_v
typename select_cl_scalar_complex_or_T< T >::type select_cl_scalar_complex_or_T_t
constexpr bool is_vgengeodouble_v
constexpr bool is_gengeohalf_v
constexpr bool is_gencrossdouble_v
typename make_type_impl< T, TL >::type make_type_t
select_apply_cl_scalar_t< T, sycl::opencl::cl_char, sycl::opencl::cl_short, sycl::opencl::cl_int, sycl::opencl::cl_long > select_cl_scalar_integral_signed_t
constexpr bool is_genint_v
constexpr bool is_gengeomarrayfloat_v
constexpr bool is_igeninteger16bit_v
constexpr bool is_sigeninteger_v
constexpr bool is_genbool_v
uint16_t Bfloat16StorageT
typename remove_decoration< T >::type remove_decoration_t
static constexpr int value