Skip to content

Commit 2b585ff

Browse files
committed
[SYCL] Optimize vec class methods.
Make use of clang's extended vector extension. Signed-off-by: Alexey Bader <[email protected]>
1 parent aa0628b commit 2b585ff

File tree

1 file changed

+35
-6
lines changed

1 file changed

+35
-6
lines changed

sycl/include/CL/sycl/types.hpp

Lines changed: 35 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -497,14 +497,14 @@ template <typename Type, int NumElements> class vec {
497497
}
498498

499499
#ifdef __SYCL_DEVICE_ONLY__
500-
501500
template <typename vector_t_ = vector_t,
502501
typename = typename std::enable_if<
503502
std::is_same<vector_t_, vector_t>::value &&
504503
!std::is_same<vector_t_, DataT>::value>::type>
505504
vec(vector_t openclVector) : m_Data(openclVector) {}
506505
operator vector_t() const { return m_Data; }
507506
#endif
507+
508508
// Available only when: NumElements == 1
509509
template <int N = NumElements>
510510
operator typename std::enable_if<N == 1, DataT>::type() const {
@@ -529,11 +529,18 @@ template <typename Type, int NumElements> class vec {
529529
std::is_integral<DataT>::value,
530530
vec<convertT, NumElements>>::type
531531
convert() const {
532+
// Use __SYCL_DEVICE_ONLY__ macro because cast to OpenCL vector type is defined
533+
// by SYCL device compiler only.
534+
#ifdef __SYCL_DEVICE_ONLY__
535+
return vec<convertT, NumElements>{
536+
(typename vec<convertT, NumElements>::DataType)m_Data};
537+
#else
532538
vec<convertT, NumElements> Result;
533539
for (size_t I = 0; I < NumElements; ++I) {
534540
Result.setValue(I, static_cast<convertT>(getValue(I)));
535541
}
536542
return Result;
543+
#endif
537544
}
538545
// From FP to Integer
539546
template <typename convertT, rounding_mode roundingMode>
@@ -542,12 +549,20 @@ template <typename Type, int NumElements> class vec {
542549
std::is_floating_point<DataT>::value,
543550
vec<convertT, NumElements>>::type
544551
convert() const {
552+
// Use __SYCL_DEVICE_ONLY__ macro because cast to OpenCL vector type is defined
553+
// by SYCL device compiler only.
554+
#ifdef __SYCL_DEVICE_ONLY__
555+
return vec<convertT, NumElements>{
556+
detail::convertHelper<vec<convertT, NumElements>::DataType,
557+
roundingMode>(m_Data)};
558+
#else
545559
vec<convertT, NumElements> Result;
546560
for (size_t I = 0; I < NumElements; ++I) {
547561
Result.setValue(
548562
I, detail::convertHelper<convertT, roundingMode>(getValue(I)));
549563
}
550564
return Result;
565+
#endif
551566
}
552567

553568
template <typename asT>
@@ -709,6 +724,20 @@ template <typename Type, int NumElements> class vec {
709724
#ifdef __SYCL_RELLOGOP
710725
#error "Undefine __SYCL_RELLOGOP macro"
711726
#endif
727+
#ifdef __SYCL_USE_EXT_VECTOR_TYPE__
728+
#define __SYCL_RELLOGOP(RELLOGOP) \
729+
vec<rel_t, NumElements> operator RELLOGOP(const vec &Rhs) const { \
730+
return vec<rel_t, NumElements>{m_Data RELLOGOP vector_t(Rhs)}; \
731+
} \
732+
template <typename T> \
733+
typename std::enable_if<std::is_convertible<T, DataT>::value && \
734+
(std::is_fundamental<T>::value || \
735+
std::is_same<T, half>::value), \
736+
vec<rel_t, NumElements>>::type \
737+
operator RELLOGOP(const T &Rhs) const { \
738+
return *this RELLOGOP vec(static_cast<const DataT &>(Rhs)); \
739+
}
740+
#else
712741
#define __SYCL_RELLOGOP(RELLOGOP) \
713742
vec<rel_t, NumElements> operator RELLOGOP(const vec &Rhs) const { \
714743
vec<rel_t, NumElements> Ret; \
@@ -718,14 +747,14 @@ template <typename Type, int NumElements> class vec {
718747
return Ret; \
719748
} \
720749
template <typename T> \
721-
typename std::enable_if< \
722-
std::is_convertible<T, DataT>::value && \
723-
(std::is_fundamental<T>::value || \
724-
std::is_same<typename std::remove_const<T>::type, half>::value), \
725-
vec<rel_t, NumElements>>::type \
750+
typename std::enable_if<std::is_convertible<T, DataT>::value && \
751+
(std::is_fundamental<T>::value || \
752+
std::is_same<T, half>::value), \
753+
vec<rel_t, NumElements>>::type \
726754
operator RELLOGOP(const T &Rhs) const { \
727755
return *this RELLOGOP vec(static_cast<const DataT &>(Rhs)); \
728756
}
757+
#endif
729758

730759
__SYCL_RELLOGOP(==)
731760
__SYCL_RELLOGOP(!=)

0 commit comments

Comments
 (0)