21 #ifndef EIGEN_INTEROP_HEADERS_SYCL_H 22 #define EIGEN_INTEROP_HEADERS_SYCL_H 25 #include "../../InternalHeaderCheck.h" 29 #if !defined(EIGEN_DONT_VECTORIZE_SYCL) 33 template <
int has_blend,
int lengths>
34 struct sycl_packet_traits : default_packet_traits {
80 #ifdef SYCL_DEVICE_ONLY 81 #define SYCL_PACKET_TRAITS(packet_type, has_blend, unpacket_type, lengths) \ 83 struct packet_traits<unpacket_type> : sycl_packet_traits<has_blend, lengths> { \ 84 typedef packet_type type; \ 85 typedef packet_type half; \ 88 SYCL_PACKET_TRAITS(cl::sycl::cl_half8, 1, Eigen::half, 8)
89 SYCL_PACKET_TRAITS(cl::sycl::cl_half8, 1, const
Eigen::half, 8)
90 SYCL_PACKET_TRAITS(cl::sycl::cl_float4, 1,
float, 4)
91 SYCL_PACKET_TRAITS(cl::sycl::cl_float4, 1, const
float, 4)
92 SYCL_PACKET_TRAITS(cl::sycl::cl_double2, 0,
double, 2)
93 SYCL_PACKET_TRAITS(cl::sycl::cl_double2, 0, const
double, 2)
94 #undef SYCL_PACKET_TRAITS 99 #define SYCL_ARITHMETIC(packet_type) \ 101 struct is_arithmetic<packet_type> { \ 102 enum { value = true }; \ 104 SYCL_ARITHMETIC(cl::sycl::cl_half8)
105 SYCL_ARITHMETIC(cl::sycl::cl_float4)
106 SYCL_ARITHMETIC(cl::sycl::cl_double2)
107 #undef SYCL_ARITHMETIC 109 #define SYCL_UNPACKET_TRAITS(packet_type, unpacket_type, lengths) \ 111 struct unpacket_traits<packet_type> { \ 112 typedef unpacket_type type; \ 113 enum { size = lengths, vectorizable = true, alignment = Aligned16 }; \ 114 typedef packet_type half; \ 116 SYCL_UNPACKET_TRAITS(cl::sycl::cl_half8, Eigen::half, 8)
117 SYCL_UNPACKET_TRAITS(cl::sycl::cl_float4,
float, 4)
118 SYCL_UNPACKET_TRAITS(cl::sycl::cl_double2,
double, 2)
120 #undef SYCL_UNPACKET_TRAITS 127 namespace TensorSycl {
130 template <
typename PacketReturnType,
int PacketSize>
131 struct PacketWrapper;
133 #ifndef SYCL_DEVICE_ONLY 134 template <
typename PacketReturnType,
int PacketSize>
135 struct PacketWrapper {
136 typedef typename ::Eigen::internal::unpacket_traits<PacketReturnType>::type Scalar;
137 template <
typename Index>
138 EIGEN_DEVICE_FUNC
static Scalar scalarize(
Index, PacketReturnType &) {
139 eigen_assert(
false &&
"THERE IS NO PACKETIZE VERSION FOR THE CHOSEN TYPE");
142 EIGEN_DEVICE_FUNC
static PacketReturnType convert_to_packet_type(Scalar in, Scalar) {
143 return ::Eigen::internal::template plset<PacketReturnType>(in);
145 EIGEN_DEVICE_FUNC
static void set_packet(PacketReturnType, Scalar *) {
146 eigen_assert(
false &&
"THERE IS NO PACKETIZE VERSION FOR THE CHOSEN TYPE");
151 #elif defined(SYCL_DEVICE_ONLY) 152 template <
typename PacketReturnType>
153 struct PacketWrapper<PacketReturnType, 4> {
154 typedef typename ::Eigen::internal::unpacket_traits<PacketReturnType>::type Scalar;
155 template <
typename Index>
156 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
static Scalar scalarize(
Index index, PacketReturnType &in) {
169 __builtin_unreachable();
171 __builtin_unreachable();
174 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
static PacketReturnType convert_to_packet_type(Scalar in, Scalar other) {
175 return PacketReturnType(in, other, other, other);
177 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
static void set_packet(PacketReturnType &lhs, Scalar *rhs) {
178 lhs = PacketReturnType(rhs[0], rhs[1], rhs[2], rhs[3]);
182 template <
typename PacketReturnType>
183 struct PacketWrapper<PacketReturnType, 1> {
184 typedef typename ::Eigen::internal::unpacket_traits<PacketReturnType>::type Scalar;
185 template <
typename Index>
186 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
static Scalar scalarize(
Index, PacketReturnType &in) {
189 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
static PacketReturnType convert_to_packet_type(Scalar in, Scalar) {
190 return PacketReturnType(in);
192 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
static void set_packet(PacketReturnType &lhs, Scalar *rhs) { lhs = rhs[0]; }
195 template <
typename PacketReturnType>
196 struct PacketWrapper<PacketReturnType, 2> {
197 typedef typename ::Eigen::internal::unpacket_traits<PacketReturnType>::type Scalar;
198 template <
typename Index>
199 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
static Scalar scalarize(
Index index, PacketReturnType &in) {
208 __builtin_unreachable();
210 __builtin_unreachable();
213 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
static PacketReturnType convert_to_packet_type(Scalar in, Scalar other) {
214 return PacketReturnType(in, other);
216 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
static void set_packet(PacketReturnType &lhs, Scalar *rhs) {
217 lhs = PacketReturnType(rhs[0], rhs[1]);
227 #endif // EIGEN_INTEROP_HEADERS_SYCL_H Namespace containing all symbols from the Eigen library.
Definition: B01_Experimental.dox:1
EIGEN_DEFAULT_DENSE_INDEX_TYPE Index
The Index type as used for the API.
Definition: Meta.h:82