23#ifndef EIGEN_PACKET_MATH_SYCL_H
24#define EIGEN_PACKET_MATH_SYCL_H
28#include "../../InternalHeaderCheck.h"
33#ifdef SYCL_DEVICE_ONLY
34#define SYCL_PLOAD(packet_type, AlignedType) \
36 EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE packet_type pload##AlignedType<packet_type>( \
37 const typename unpacket_traits<packet_type>::type* from) { \
39 cl::sycl::address_space_cast<cl::sycl::access::address_space::generic_space, cl::sycl::access::decorated::no>( \
46SYCL_PLOAD(cl::sycl::cl_float4, u)
47SYCL_PLOAD(cl::sycl::cl_float4, )
48SYCL_PLOAD(cl::sycl::cl_double2, u)
49SYCL_PLOAD(cl::sycl::cl_double2, )
53EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE cl::sycl::cl_half8 pload<cl::sycl::cl_half8>(
54 const typename unpacket_traits<cl::sycl::cl_half8>::type* from) {
56 cl::sycl::address_space_cast<cl::sycl::access::address_space::generic_space, cl::sycl::access::decorated::no>(
57 reinterpret_cast<const cl::sycl::cl_half*
>(from));
58 cl::sycl::cl_half8 res{};
64EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE cl::sycl::cl_half8 ploadu<cl::sycl::cl_half8>(
65 const typename unpacket_traits<cl::sycl::cl_half8>::type* from) {
67 cl::sycl::address_space_cast<cl::sycl::access::address_space::generic_space, cl::sycl::access::decorated::no>(
68 reinterpret_cast<const cl::sycl::cl_half*
>(from));
69 cl::sycl::cl_half8 res{};
74#define SYCL_PSTORE(scalar, packet_type, alignment) \
76 EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void pstore##alignment(scalar* to, const packet_type& from) { \
78 cl::sycl::address_space_cast<cl::sycl::access::address_space::generic_space, cl::sycl::access::decorated::no>( \
83SYCL_PSTORE(
float, cl::sycl::cl_float4, )
84SYCL_PSTORE(
float, cl::sycl::cl_float4, u)
85SYCL_PSTORE(
double, cl::sycl::cl_double2, )
86SYCL_PSTORE(
double, cl::sycl::cl_double2, u)
90EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
void pstoreu(Eigen::half* to,
const cl::sycl::cl_half8& from) {
92 cl::sycl::address_space_cast<cl::sycl::access::address_space::generic_space, cl::sycl::access::decorated::no>(
93 reinterpret_cast<cl::sycl::cl_half*
>(to));
98EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
void pstore(Eigen::half* to,
const cl::sycl::cl_half8& from) {
100 cl::sycl::address_space_cast<cl::sycl::access::address_space::generic_space, cl::sycl::access::decorated::no>(
101 reinterpret_cast<cl::sycl::cl_half*
>(to));
105#define SYCL_PSET1(packet_type) \
107 EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE packet_type pset1<packet_type>( \
108 const typename unpacket_traits<packet_type>::type& from) { \
109 return packet_type(from); \
113SYCL_PSET1(cl::sycl::cl_half8)
114SYCL_PSET1(cl::sycl::cl_float4)
115SYCL_PSET1(cl::sycl::cl_double2)
119template <
typename packet_type>
120struct get_base_packet {
121 template <
typename sycl_multi_po
inter>
122 static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE packet_type get_ploaddup(sycl_multi_pointer) {}
124 template <
typename sycl_multi_po
inter>
125 static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE packet_type get_pgather(sycl_multi_pointer, Index) {}
129struct get_base_packet<cl::sycl::cl_half8> {
130 template <
typename sycl_multi_po
inter>
131 static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE cl::sycl::cl_half8 get_ploaddup(sycl_multi_pointer from) {
132 return cl::sycl::cl_half8(
static_cast<cl::sycl::half
>(from[0]),
static_cast<cl::sycl::half
>(from[0]),
133 static_cast<cl::sycl::half
>(from[1]),
static_cast<cl::sycl::half
>(from[1]),
134 static_cast<cl::sycl::half
>(from[2]),
static_cast<cl::sycl::half
>(from[2]),
135 static_cast<cl::sycl::half
>(from[3]),
static_cast<cl::sycl::half
>(from[3]));
137 template <
typename sycl_multi_po
inter>
138 static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE cl::sycl::cl_half8 get_pgather(sycl_multi_pointer from, Index stride) {
139 return cl::sycl::cl_half8(
140 static_cast<cl::sycl::half
>(from[0 * stride]),
static_cast<cl::sycl::half
>(from[1 * stride]),
141 static_cast<cl::sycl::half
>(from[2 * stride]),
static_cast<cl::sycl::half
>(from[3 * stride]),
142 static_cast<cl::sycl::half
>(from[4 * stride]),
static_cast<cl::sycl::half
>(from[5 * stride]),
143 static_cast<cl::sycl::half
>(from[6 * stride]),
static_cast<cl::sycl::half
>(from[7 * stride]));
146 template <
typename sycl_multi_po
inter>
147 static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
void set_pscatter(sycl_multi_pointer to,
const cl::sycl::cl_half8& from,
150 to[0] = Eigen::half(from.s0());
151 to[tmp] = Eigen::half(from.s1());
152 to[tmp += stride] = Eigen::half(from.s2());
153 to[tmp += stride] = Eigen::half(from.s3());
154 to[tmp += stride] = Eigen::half(from.s4());
155 to[tmp += stride] = Eigen::half(from.s5());
156 to[tmp += stride] = Eigen::half(from.s6());
157 to[tmp += stride] = Eigen::half(from.s7());
159 static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE cl::sycl::cl_half8 set_plset(
const cl::sycl::half& a) {
160 return cl::sycl::cl_half8(
static_cast<cl::sycl::half
>(a),
static_cast<cl::sycl::half
>(a + 1),
161 static_cast<cl::sycl::half
>(a + 2),
static_cast<cl::sycl::half
>(a + 3),
162 static_cast<cl::sycl::half
>(a + 4),
static_cast<cl::sycl::half
>(a + 5),
163 static_cast<cl::sycl::half
>(a + 6),
static_cast<cl::sycl::half
>(a + 7));
168struct get_base_packet<cl::sycl::cl_float4> {
169 template <
typename sycl_multi_po
inter>
170 static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE cl::sycl::cl_float4 get_ploaddup(sycl_multi_pointer from) {
171 return cl::sycl::cl_float4(from[0], from[0], from[1], from[1]);
173 template <
typename sycl_multi_po
inter>
174 static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE cl::sycl::cl_float4 get_pgather(sycl_multi_pointer from, Index stride) {
175 return cl::sycl::cl_float4(from[0 * stride], from[1 * stride], from[2 * stride], from[3 * stride]);
178 template <
typename sycl_multi_po
inter>
179 static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
void set_pscatter(sycl_multi_pointer to,
const cl::sycl::cl_float4& from,
184 to[tmp += stride] = from.z();
185 to[tmp += stride] = from.w();
187 static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE cl::sycl::cl_float4 set_plset(
const float& a) {
188 return cl::sycl::cl_float4(
static_cast<float>(a),
static_cast<float>(a + 1),
static_cast<float>(a + 2),
189 static_cast<float>(a + 3));
194struct get_base_packet<cl::sycl::cl_double2> {
195 template <
typename sycl_multi_po
inter>
196 static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE cl::sycl::cl_double2 get_ploaddup(
const sycl_multi_pointer from) {
197 return cl::sycl::cl_double2(from[0], from[0]);
200 template <
typename sycl_multi_po
inter,
typename Index>
201 static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE cl::sycl::cl_double2 get_pgather(
const sycl_multi_pointer from,
203 return cl::sycl::cl_double2(from[0 * stride], from[1 * stride]);
206 template <
typename sycl_multi_po
inter>
207 static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
void set_pscatter(sycl_multi_pointer to,
208 const cl::sycl::cl_double2& from, Index stride) {
210 to[stride] = from.y();
213 static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE cl::sycl::cl_double2 set_plset(
const double& a) {
214 return cl::sycl::cl_double2(
static_cast<double>(a),
static_cast<double>(a + 1));
218#define SYCL_PLOAD_DUP_SPECILIZE(packet_type) \
220 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE packet_type ploaddup<packet_type>( \
221 const typename unpacket_traits<packet_type>::type* from) { \
222 return get_base_packet<packet_type>::get_ploaddup(from); \
225SYCL_PLOAD_DUP_SPECILIZE(cl::sycl::cl_half8)
226SYCL_PLOAD_DUP_SPECILIZE(cl::sycl::cl_float4)
227SYCL_PLOAD_DUP_SPECILIZE(cl::sycl::cl_double2)
229#undef SYCL_PLOAD_DUP_SPECILIZE
231#define SYCL_PLSET(packet_type) \
233 EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE packet_type plset<packet_type>( \
234 const typename unpacket_traits<packet_type>::type& a) { \
235 return get_base_packet<packet_type>::set_plset(a); \
237SYCL_PLSET(cl::sycl::cl_float4)
238SYCL_PLSET(cl::sycl::cl_double2)
242EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE cl::sycl::cl_half8 plset<cl::sycl::cl_half8>(
243 const typename unpacket_traits<cl::sycl::cl_half8>::type& a) {
244 return get_base_packet<cl::sycl::cl_half8>::set_plset((
const cl::sycl::half&)a);
247#define SYCL_PGATHER_SPECILIZE(scalar, packet_type) \
249 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE packet_type pgather<scalar, packet_type>( \
250 const typename unpacket_traits<packet_type>::type* from, Index stride) { \
251 return get_base_packet<packet_type>::get_pgather(from, stride); \
254SYCL_PGATHER_SPECILIZE(Eigen::half, cl::sycl::cl_half8)
255SYCL_PGATHER_SPECILIZE(
float, cl::sycl::cl_float4)
256SYCL_PGATHER_SPECILIZE(
double, cl::sycl::cl_double2)
257#undef SYCL_PGATHER_SPECILIZE
259#define SYCL_PSCATTER_SPECILIZE(scalar, packet_type) \
261 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void pscatter<scalar, packet_type>( \
262 typename unpacket_traits<packet_type>::type * to, const packet_type& from, Index stride) { \
263 get_base_packet<packet_type>::set_pscatter(to, from, stride); \
266SYCL_PSCATTER_SPECILIZE(Eigen::half, cl::sycl::cl_half8)
267SYCL_PSCATTER_SPECILIZE(
float, cl::sycl::cl_float4)
268SYCL_PSCATTER_SPECILIZE(
double, cl::sycl::cl_double2)
270#undef SYCL_PSCATTER_SPECILIZE
272#define SYCL_PMAD(packet_type) \
274 EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE packet_type pmadd(const packet_type& a, const packet_type& b, \
275 const packet_type& c) { \
276 return cl::sycl::mad(a, b, c); \
279SYCL_PMAD(cl::sycl::cl_half8)
280SYCL_PMAD(cl::sycl::cl_float4)
281SYCL_PMAD(cl::sycl::cl_double2)
285EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE Eigen::half pfirst<cl::sycl::cl_half8>(
const cl::sycl::cl_half8& a) {
286 return Eigen::half(a.s0());
289EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
float pfirst<cl::sycl::cl_float4>(
const cl::sycl::cl_float4& a) {
293EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
double pfirst<cl::sycl::cl_double2>(
const cl::sycl::cl_double2& a) {
298EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE Eigen::half predux<cl::sycl::cl_half8>(
const cl::sycl::cl_half8& a) {
299 return Eigen::half(a.s0() + a.s1() + a.s2() + a.s3() + a.s4() + a.s5() + a.s6() + a.s7());
303EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
float predux<cl::sycl::cl_float4>(
const cl::sycl::cl_float4& a) {
304 return a.x() + a.y() + a.z() + a.w();
308EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
double predux<cl::sycl::cl_double2>(
const cl::sycl::cl_double2& a) {
309 return a.x() + a.y();
313EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
bool predux_any(
const cl::sycl::cl_half8& a) {
314 return cl::sycl::any(a.template as<cl::sycl::cl_short8>() != cl::sycl::cl_short8(0));
318EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
bool predux_any(
const cl::sycl::cl_float4& a) {
319 return cl::sycl::any(a.template as<cl::sycl::cl_int4>() != cl::sycl::cl_int4(0));
323EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
bool predux_any(
const cl::sycl::cl_double2& a) {
324 return cl::sycl::any(a.template as<cl::sycl::cl_long2>() != cl::sycl::cl_long2(0));
328EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE Eigen::half predux_max<cl::sycl::cl_half8>(
const cl::sycl::cl_half8& a) {
329 return Eigen::half(cl::sycl::fmax(cl::sycl::fmax(cl::sycl::fmax(a.s0(), a.s1()), cl::sycl::fmax(a.s2(), a.s3())),
330 cl::sycl::fmax(cl::sycl::fmax(a.s4(), a.s5()), cl::sycl::fmax(a.s6(), a.s7()))));
333EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
float predux_max<cl::sycl::cl_float4>(
const cl::sycl::cl_float4& a) {
334 return cl::sycl::fmax(cl::sycl::fmax(a.x(), a.y()), cl::sycl::fmax(a.z(), a.w()));
337EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
double predux_max<cl::sycl::cl_double2>(
const cl::sycl::cl_double2& a) {
338 return cl::sycl::fmax(a.x(), a.y());
342EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE Eigen::half predux_min<cl::sycl::cl_half8>(
const cl::sycl::cl_half8& a) {
343 return Eigen::half(cl::sycl::fmin(cl::sycl::fmin(cl::sycl::fmin(a.s0(), a.s1()), cl::sycl::fmin(a.s2(), a.s3())),
344 cl::sycl::fmin(cl::sycl::fmin(a.s4(), a.s5()), cl::sycl::fmin(a.s6(), a.s7()))));
347EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
float predux_min<cl::sycl::cl_float4>(
const cl::sycl::cl_float4& a) {
348 return cl::sycl::fmin(cl::sycl::fmin(a.x(), a.y()), cl::sycl::fmin(a.z(), a.w()));
351EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
double predux_min<cl::sycl::cl_double2>(
const cl::sycl::cl_double2& a) {
352 return cl::sycl::fmin(a.x(), a.y());
356EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE Eigen::half predux_mul<cl::sycl::cl_half8>(
const cl::sycl::cl_half8& a) {
357 return Eigen::half(a.s0() * a.s1() * a.s2() * a.s3() * a.s4() * a.s5() * a.s6() * a.s7());
360EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
float predux_mul<cl::sycl::cl_float4>(
const cl::sycl::cl_float4& a) {
361 return a.x() * a.y() * a.z() * a.w();
364EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
double predux_mul<cl::sycl::cl_double2>(
const cl::sycl::cl_double2& a) {
365 return a.x() * a.y();
369EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE cl::sycl::cl_half8 pabs<cl::sycl::cl_half8>(
const cl::sycl::cl_half8& a) {
370 return cl::sycl::cl_half8(cl::sycl::fabs(a.s0()), cl::sycl::fabs(a.s1()), cl::sycl::fabs(a.s2()),
371 cl::sycl::fabs(a.s3()), cl::sycl::fabs(a.s4()), cl::sycl::fabs(a.s5()),
372 cl::sycl::fabs(a.s6()), cl::sycl::fabs(a.s7()));
375EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE cl::sycl::cl_float4 pabs<cl::sycl::cl_float4>(
const cl::sycl::cl_float4& a) {
376 return cl::sycl::cl_float4(cl::sycl::fabs(a.x()), cl::sycl::fabs(a.y()), cl::sycl::fabs(a.z()),
377 cl::sycl::fabs(a.w()));
380EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE cl::sycl::cl_double2 pabs<cl::sycl::cl_double2>(
const cl::sycl::cl_double2& a) {
381 return cl::sycl::cl_double2(cl::sycl::fabs(a.x()), cl::sycl::fabs(a.y()));
384template <
typename Packet>
385EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE Packet sycl_pcmp_le(
const Packet& a,
const Packet& b) {
386 return (a <= b).template as<Packet>();
389template <
typename Packet>
390EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE Packet sycl_pcmp_lt(
const Packet& a,
const Packet& b) {
391 return (a < b).template as<Packet>();
394template <
typename Packet>
395EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE Packet sycl_pcmp_eq(
const Packet& a,
const Packet& b) {
396 return (a == b).template as<Packet>();
399#define SYCL_PCMP(OP, TYPE) \
401 EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE TYPE pcmp_##OP<TYPE>(const TYPE& a, const TYPE& b) { \
402 return sycl_pcmp_##OP<TYPE>(a, b); \
405SYCL_PCMP(le, cl::sycl::cl_half8)
406SYCL_PCMP(lt, cl::sycl::cl_half8)
407SYCL_PCMP(eq, cl::sycl::cl_half8)
408SYCL_PCMP(le, cl::sycl::cl_float4)
409SYCL_PCMP(lt, cl::sycl::cl_float4)
410SYCL_PCMP(eq, cl::sycl::cl_float4)
411SYCL_PCMP(le, cl::sycl::cl_double2)
412SYCL_PCMP(lt, cl::sycl::cl_double2)
413SYCL_PCMP(eq, cl::sycl::cl_double2)
416EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
void ptranspose(PacketBlock<cl::sycl::cl_half8, 8>& kernel) {
417 cl::sycl::cl_half tmp = kernel.packet[0].s1();
418 kernel.packet[0].s1() = kernel.packet[1].s0();
419 kernel.packet[1].s0() = tmp;
421 tmp = kernel.packet[0].s2();
422 kernel.packet[0].s2() = kernel.packet[2].s0();
423 kernel.packet[2].s0() = tmp;
425 tmp = kernel.packet[0].s3();
426 kernel.packet[0].s3() = kernel.packet[3].s0();
427 kernel.packet[3].s0() = tmp;
429 tmp = kernel.packet[0].s4();
430 kernel.packet[0].s4() = kernel.packet[4].s0();
431 kernel.packet[4].s0() = tmp;
433 tmp = kernel.packet[0].s5();
434 kernel.packet[0].s5() = kernel.packet[5].s0();
435 kernel.packet[5].s0() = tmp;
437 tmp = kernel.packet[0].s6();
438 kernel.packet[0].s6() = kernel.packet[6].s0();
439 kernel.packet[6].s0() = tmp;
441 tmp = kernel.packet[0].s7();
442 kernel.packet[0].s7() = kernel.packet[7].s0();
443 kernel.packet[7].s0() = tmp;
445 tmp = kernel.packet[1].s2();
446 kernel.packet[1].s2() = kernel.packet[2].s1();
447 kernel.packet[2].s1() = tmp;
449 tmp = kernel.packet[1].s3();
450 kernel.packet[1].s3() = kernel.packet[3].s1();
451 kernel.packet[3].s1() = tmp;
453 tmp = kernel.packet[1].s4();
454 kernel.packet[1].s4() = kernel.packet[4].s1();
455 kernel.packet[4].s1() = tmp;
457 tmp = kernel.packet[1].s5();
458 kernel.packet[1].s5() = kernel.packet[5].s1();
459 kernel.packet[5].s1() = tmp;
461 tmp = kernel.packet[1].s6();
462 kernel.packet[1].s6() = kernel.packet[6].s1();
463 kernel.packet[6].s1() = tmp;
465 tmp = kernel.packet[1].s7();
466 kernel.packet[1].s7() = kernel.packet[7].s1();
467 kernel.packet[7].s1() = tmp;
469 tmp = kernel.packet[2].s3();
470 kernel.packet[2].s3() = kernel.packet[3].s2();
471 kernel.packet[3].s2() = tmp;
473 tmp = kernel.packet[2].s4();
474 kernel.packet[2].s4() = kernel.packet[4].s2();
475 kernel.packet[4].s2() = tmp;
477 tmp = kernel.packet[2].s5();
478 kernel.packet[2].s5() = kernel.packet[5].s2();
479 kernel.packet[5].s2() = tmp;
481 tmp = kernel.packet[2].s6();
482 kernel.packet[2].s6() = kernel.packet[6].s2();
483 kernel.packet[6].s2() = tmp;
485 tmp = kernel.packet[2].s7();
486 kernel.packet[2].s7() = kernel.packet[7].s2();
487 kernel.packet[7].s2() = tmp;
489 tmp = kernel.packet[3].s4();
490 kernel.packet[3].s4() = kernel.packet[4].s3();
491 kernel.packet[4].s3() = tmp;
493 tmp = kernel.packet[3].s5();
494 kernel.packet[3].s5() = kernel.packet[5].s3();
495 kernel.packet[5].s3() = tmp;
497 tmp = kernel.packet[3].s6();
498 kernel.packet[3].s6() = kernel.packet[6].s3();
499 kernel.packet[6].s3() = tmp;
501 tmp = kernel.packet[3].s7();
502 kernel.packet[3].s7() = kernel.packet[7].s3();
503 kernel.packet[7].s3() = tmp;
505 tmp = kernel.packet[4].s5();
506 kernel.packet[4].s5() = kernel.packet[5].s4();
507 kernel.packet[5].s4() = tmp;
509 tmp = kernel.packet[4].s6();
510 kernel.packet[4].s6() = kernel.packet[6].s4();
511 kernel.packet[6].s4() = tmp;
513 tmp = kernel.packet[4].s7();
514 kernel.packet[4].s7() = kernel.packet[7].s4();
515 kernel.packet[7].s4() = tmp;
517 tmp = kernel.packet[5].s6();
518 kernel.packet[5].s6() = kernel.packet[6].s5();
519 kernel.packet[6].s5() = tmp;
521 tmp = kernel.packet[5].s7();
522 kernel.packet[5].s7() = kernel.packet[7].s5();
523 kernel.packet[7].s5() = tmp;
525 tmp = kernel.packet[6].s7();
526 kernel.packet[6].s7() = kernel.packet[7].s6();
527 kernel.packet[7].s6() = tmp;
530EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
void ptranspose(PacketBlock<cl::sycl::cl_float4, 4>& kernel) {
531 float tmp = kernel.packet[0].y();
532 kernel.packet[0].y() = kernel.packet[1].x();
533 kernel.packet[1].x() = tmp;
535 tmp = kernel.packet[0].z();
536 kernel.packet[0].z() = kernel.packet[2].x();
537 kernel.packet[2].x() = tmp;
539 tmp = kernel.packet[0].w();
540 kernel.packet[0].w() = kernel.packet[3].x();
541 kernel.packet[3].x() = tmp;
543 tmp = kernel.packet[1].z();
544 kernel.packet[1].z() = kernel.packet[2].y();
545 kernel.packet[2].y() = tmp;
547 tmp = kernel.packet[1].w();
548 kernel.packet[1].w() = kernel.packet[3].y();
549 kernel.packet[3].y() = tmp;
551 tmp = kernel.packet[2].w();
552 kernel.packet[2].w() = kernel.packet[3].z();
553 kernel.packet[3].z() = tmp;
556EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
void ptranspose(PacketBlock<cl::sycl::cl_double2, 2>& kernel) {
557 double tmp = kernel.packet[0].y();
558 kernel.packet[0].y() = kernel.packet[1].x();
559 kernel.packet[1].x() = tmp;