24 #ifndef __SYCL_DEVICE_ONLY__
26 #endif // __SYCL_DEVICE_ONLY__
30 namespace ext::intel::esimd {
54 template <
typename Ty,
int N>
55 class simd :
public detail::simd_obj_impl<
56 detail::__raw_t<Ty>, N, simd<Ty, N>,
57 std::enable_if_t<detail::is_valid_simd_elem_type_v<Ty>>> {
58 using base_type = detail::simd_obj_impl<detail::__raw_t<Ty>, N,
simd<Ty, N>>;
61 using base_type::base_type;
65 static constexpr
int length = N;
74 template <
typename SimdT,
75 class = std::enable_if_t<__ESIMD_DNS::is_simd_type_v<SimdT> &&
76 (length == SimdT::length)>>
78 :
base_type(detail::convert_vector<Ty, detail::element_type_t<SimdT>, N>(
85 int N1 = N,
class Ty1 = Ty,
86 class SFINAE = std::enable_if_t<
88 Ty>)&&!detail::is_wrapper_elem_type_v<Ty1>>>
89 simd(
const sycl::ext::oneapi::experimental::simd<Ty, N1> &v)
97 template <
typename T1,
98 class = std::enable_if_t<detail::is_valid_simd_elem_type_v<T1>>>
108 template <
class To,
class T =
simd,
109 class = std::enable_if_t<(T::length == 1) &&
110 detail::is_valid_simd_elem_type_v<To>>>
111 operator To()
const {
113 return detail::convert_scalar<To, element_type>(base_type::data()[0]);
121 int N1,
class Ty1 = Ty,
122 class SFINAE = std::enable_if_t<
124 Ty>)&&!detail::is_wrapper_elem_type_v<Ty1>>>
125 operator sycl::ext::oneapi::experimental::simd<Ty, N1>() {
126 return sycl::ext::oneapi::experimental::simd<Ty, N1>(base_type::data());
140 simd Ret(base_type::data());
156 simd Ret(base_type::data());
161 #define __ESIMD_DEF_SIMD_ARITH_UNARY_OP(ARITH_UNARY_OP, ID) \
162 template <class T1 = Ty> simd operator ARITH_UNARY_OP() const { \
163 static_assert(!std::is_unsigned_v<T1>, \
164 #ARITH_UNARY_OP "doesn't apply to unsigned types"); \
165 return simd{detail::vector_unary_op<detail::UnaryOp::ID, T1, N>( \
166 base_type::data())}; \
173 #undef __ESIMD_DEF_SIMD_ARITH_UNARY_OP
183 template <
typename To,
typename From,
int N>
185 if constexpr (std::is_same_v<std::remove_const_t<To>,
186 std::remove_const_t<From>>)
189 return detail::convert_vector<To, From, N>(val.data());
198 template <
int N>
using simd_mask = detail::simd_mask_type<N>;
209 template <
typename Ty,
int N>
210 std::ostream &
operator<<(std::ostream &OS,
const __ESIMD_NS::simd<Ty, N> &V)
211 #ifdef __SYCL_DEVICE_ONLY__
216 for (
int I = 0; I < N; I++) {
224 #endif // __SYCL_DEVICE_ONLY__