@@ -582,17 +582,13 @@ template <typename Type, int NumElements> class vec {
582
582
// vector extension. This is for MSVC compatibility, which has a max alignment
583
583
// of 64 for direct params. If we drop MSVC, we can have alignment the same as
584
584
// size and use vector extensions for all sizes.
585
- static constexpr bool IsUsingArrayOnDevice =
585
+ static constexpr bool IsUsingArray =
586
586
(IsHostHalf || IsSizeGreaterThanMaxAlign);
587
587
588
588
#if defined(__SYCL_DEVICE_ONLY__)
589
- static constexpr bool NativeVec = NumElements > 1 && !IsUsingArrayOnDevice;
590
- static constexpr bool IsUsingArrayOnHost =
591
- false ; // we are not compiling for host.
589
+ static constexpr bool NativeVec = NumElements > 1 && !IsUsingArray;
592
590
#else
593
591
static constexpr bool NativeVec = false ;
594
- static constexpr bool IsUsingArrayOnHost =
595
- true ; // host always uses std::array.
596
592
#endif
597
593
598
594
static constexpr int getNumElements () { return NumElements; }
@@ -773,15 +769,6 @@ template <typename Type, int NumElements> class vec {
773
769
return *this ;
774
770
}
775
771
776
- template <typename T = void >
777
- using EnableIfUsingArray =
778
- typename std::enable_if_t <IsUsingArrayOnDevice || IsUsingArrayOnHost, T>;
779
-
780
- template <typename T = void >
781
- using EnableIfNotUsingArray =
782
- typename std::enable_if_t <!IsUsingArrayOnDevice && !IsUsingArrayOnHost,
783
- T>;
784
-
785
772
#ifdef __SYCL_DEVICE_ONLY__
786
773
template <typename T = void >
787
774
using EnableIfNotHostHalf = typename std::enable_if_t <!IsHostHalf, T>;
@@ -790,29 +777,27 @@ template <typename Type, int NumElements> class vec {
790
777
using EnableIfHostHalf = typename std::enable_if_t <IsHostHalf, T>;
791
778
792
779
template <typename T = void >
793
- using EnableIfUsingArrayOnDevice =
794
- typename std::enable_if_t <IsUsingArrayOnDevice, T>;
780
+ using EnableIfUsingArray = typename std::enable_if_t <IsUsingArray, T>;
795
781
796
782
template <typename T = void >
797
- using EnableIfNotUsingArrayOnDevice =
798
- typename std::enable_if_t <!IsUsingArrayOnDevice, T>;
783
+ using EnableIfNotUsingArray = typename std::enable_if_t <!IsUsingArray, T>;
799
784
800
785
template <typename Ty = DataT>
801
- explicit constexpr vec (const EnableIfNotUsingArrayOnDevice <Ty> &arg)
786
+ explicit constexpr vec (const EnableIfNotUsingArray <Ty> &arg)
802
787
: m_Data{DataType (vec_data<Ty>::get (arg))} {}
803
788
804
789
template <typename Ty = DataT>
805
790
typename std::enable_if_t <
806
791
std::is_fundamental_v<vec_data_t <Ty>> ||
807
792
std::is_same_v<typename std::remove_const_t <Ty>, half>,
808
793
vec &>
809
- operator =(const EnableIfNotUsingArrayOnDevice <Ty> &Rhs) {
794
+ operator =(const EnableIfNotUsingArray <Ty> &Rhs) {
810
795
m_Data = (DataType)vec_data<Ty>::get (Rhs);
811
796
return *this ;
812
797
}
813
798
814
799
template <typename Ty = DataT>
815
- explicit constexpr vec (const EnableIfUsingArrayOnDevice <Ty> &arg)
800
+ explicit constexpr vec (const EnableIfUsingArray <Ty> &arg)
816
801
: vec{detail::RepeatValue<NumElements>(
817
802
static_cast <vec_data_t <DataT>>(arg)),
818
803
std::make_index_sequence<NumElements>()} {}
@@ -822,7 +807,7 @@ template <typename Type, int NumElements> class vec {
822
807
std::is_fundamental_v<vec_data_t <Ty>> ||
823
808
std::is_same_v<typename std::remove_const_t <Ty>, half>,
824
809
vec &>
825
- operator =(const EnableIfUsingArrayOnDevice <Ty> &Rhs) {
810
+ operator =(const EnableIfUsingArray <Ty> &Rhs) {
826
811
for (int i = 0 ; i < NumElements; ++i) {
827
812
setValue (i, Rhs);
828
813
}
@@ -858,22 +843,22 @@ template <typename Type, int NumElements> class vec {
858
843
std::is_convertible_v<T, DataT> && NumElements == IdxNum, DataT>;
859
844
template <typename Ty = DataT>
860
845
constexpr vec (const EnableIfMultipleElems<2 , Ty> Arg0,
861
- const EnableIfNotUsingArrayOnDevice <Ty> Arg1)
846
+ const EnableIfNotUsingArray <Ty> Arg1)
862
847
: m_Data{vec_data<Ty>::get (Arg0), vec_data<Ty>::get (Arg1)} {}
863
848
template <typename Ty = DataT>
864
849
constexpr vec (const EnableIfMultipleElems<3 , Ty> Arg0,
865
- const EnableIfNotUsingArrayOnDevice <Ty> Arg1, const DataT Arg2)
850
+ const EnableIfNotUsingArray <Ty> Arg1, const DataT Arg2)
866
851
: m_Data{vec_data<Ty>::get (Arg0), vec_data<Ty>::get (Arg1),
867
852
vec_data<Ty>::get (Arg2)} {}
868
853
template <typename Ty = DataT>
869
854
constexpr vec (const EnableIfMultipleElems<4 , Ty> Arg0,
870
- const EnableIfNotUsingArrayOnDevice <Ty> Arg1, const DataT Arg2,
855
+ const EnableIfNotUsingArray <Ty> Arg1, const DataT Arg2,
871
856
const Ty Arg3)
872
857
: m_Data{vec_data<Ty>::get (Arg0), vec_data<Ty>::get (Arg1),
873
858
vec_data<Ty>::get (Arg2), vec_data<Ty>::get (Arg3)} {}
874
859
template <typename Ty = DataT>
875
860
constexpr vec (const EnableIfMultipleElems<8 , Ty> Arg0,
876
- const EnableIfNotUsingArrayOnDevice <Ty> Arg1, const DataT Arg2,
861
+ const EnableIfNotUsingArray <Ty> Arg1, const DataT Arg2,
877
862
const DataT Arg3, const DataT Arg4, const DataT Arg5,
878
863
const DataT Arg6, const DataT Arg7)
879
864
: m_Data{vec_data<Ty>::get (Arg0), vec_data<Ty>::get (Arg1),
@@ -882,7 +867,7 @@ template <typename Type, int NumElements> class vec {
882
867
vec_data<Ty>::get (Arg6), vec_data<Ty>::get (Arg7)} {}
883
868
template <typename Ty = DataT>
884
869
constexpr vec (const EnableIfMultipleElems<16 , Ty> Arg0,
885
- const EnableIfNotUsingArrayOnDevice <Ty> Arg1, const DataT Arg2,
870
+ const EnableIfNotUsingArray <Ty> Arg1, const DataT Arg2,
886
871
const DataT Arg3, const DataT Arg4, const DataT Arg5,
887
872
const DataT Arg6, const DataT Arg7, const DataT Arg8,
888
873
const DataT Arg9, const DataT ArgA, const DataT ArgB,
@@ -912,15 +897,15 @@ template <typename Type, int NumElements> class vec {
912
897
std::is_same<vector_t_, vector_t >::value &&
913
898
!std::is_same<vector_t_, DataT>::value>>
914
899
constexpr vec (vector_t openclVector) {
915
- if constexpr (!IsUsingArrayOnDevice ) {
900
+ if constexpr (!IsUsingArray ) {
916
901
m_Data = openclVector;
917
902
} else {
918
903
m_Data = bit_cast<DataType>(openclVector);
919
904
}
920
905
}
921
906
922
907
operator vector_t () const {
923
- if constexpr (!IsUsingArrayOnDevice ) {
908
+ if constexpr (!IsUsingArray ) {
924
909
return m_Data;
925
910
} else {
926
911
auto ptr = bit_cast<const VectorDataType *>((&m_Data)->data ());
@@ -1081,7 +1066,7 @@ template <typename Type, int NumElements> class vec {
1081
1066
#ifdef __SYCL_DEVICE_ONLY__
1082
1067
#define __SYCL_BINOP (BINOP, OPASSIGN, CONVERT ) \
1083
1068
template <typename Ty = vec> \
1084
- vec operator BINOP (const EnableIfNotUsingArrayOnDevice <Ty> &Rhs) const { \
1069
+ vec operator BINOP (const EnableIfNotUsingArray <Ty> &Rhs) const { \
1085
1070
vec Ret; \
1086
1071
Ret.m_Data = m_Data BINOP Rhs.m_Data ; \
1087
1072
if constexpr (std::is_same<Type, bool >::value && CONVERT) { \
@@ -1090,7 +1075,7 @@ template <typename Type, int NumElements> class vec {
1090
1075
return Ret; \
1091
1076
} \
1092
1077
template <typename Ty = vec> \
1093
- vec operator BINOP (const EnableIfUsingArrayOnDevice <Ty> &Rhs) const { \
1078
+ vec operator BINOP (const EnableIfUsingArray <Ty> &Rhs) const { \
1094
1079
vec Ret; \
1095
1080
for (size_t I = 0 ; I < NumElements; ++I) { \
1096
1081
Ret.setValue (I, (getValue (I) BINOP Rhs.getValue (I))); \
@@ -1244,94 +1229,67 @@ template <typename Type, int NumElements> class vec {
1244
1229
__SYCL_UOP(--, -=)
1245
1230
#undef __SYCL_UOP
1246
1231
1247
- // operator~() available only when: dataT != float && dataT != double
1248
- // && dataT != half
1232
+ // Available only when: dataT != cl_float && dataT != cl_double
1233
+ // && dataT != cl_half
1249
1234
template <typename T = DataT>
1250
- typename std::enable_if_t <!std::is_floating_point_v<vec_data_t <T>> &&
1251
- (!IsUsingArrayOnDevice && !IsUsingArrayOnHost),
1252
- vec>
1235
+ typename std::enable_if_t <std::is_integral_v<vec_data_t <T>>, vec>
1253
1236
operator ~() const {
1237
+ // Use __SYCL_DEVICE_ONLY__ macro because cast to OpenCL vector type is defined
1238
+ // by SYCL device compiler only.
1239
+ #ifdef __SYCL_DEVICE_ONLY__
1254
1240
vec Ret{(typename vec::DataType) ~m_Data};
1255
1241
if constexpr (std::is_same<Type, bool >::value) {
1256
1242
Ret.ConvertToDataT ();
1257
1243
}
1258
1244
return Ret;
1259
- }
1260
- template <typename T = DataT>
1261
- typename std::enable_if_t <!std::is_floating_point_v<vec_data_t <T>> &&
1262
- (IsUsingArrayOnDevice || IsUsingArrayOnHost),
1263
- vec>
1264
- operator ~() const {
1245
+ #else
1265
1246
vec Ret{};
1266
1247
for (size_t I = 0 ; I < NumElements; ++I) {
1267
1248
Ret.setValue (I, ~getValue (I));
1268
1249
}
1269
1250
return Ret;
1251
+ #endif
1270
1252
}
1271
1253
1272
- // operator!
1273
- template <typename T = DataT, int N = NumElements>
1274
- EnableIfNotUsingArray<vec<T, N>> operator !() const {
1275
- return vec<T, N>{(typename vec<DataT, NumElements>::DataType) !m_Data};
1276
- }
1277
-
1278
- // std::byte neither supports ! unary op or casting, so special handling is
1279
- // needed. And, worse, Windows has a conflict with 'byte'.
1280
- #if (!defined(_HAS_STD_BYTE) || _HAS_STD_BYTE != 0)
1281
- template <typename T = DataT, int N = NumElements>
1282
- typename std::enable_if_t <std::is_same<std::byte, T>::value &&
1283
- (IsUsingArrayOnDevice || IsUsingArrayOnHost),
1284
- vec<T, N>>
1285
- operator !() const {
1286
- vec Ret{};
1287
- for (size_t I = 0 ; I < NumElements; ++I) {
1288
- Ret.setValue (I, std::byte{!vec_data<DataT>::get (getValue (I))});
1289
- }
1290
- return Ret;
1291
- }
1292
-
1293
- template <typename T = DataT, int N = NumElements>
1294
- typename std::enable_if_t <!std::is_same<std::byte, T>::value &&
1295
- (IsUsingArrayOnDevice || IsUsingArrayOnHost),
1296
- vec<T, N>>
1297
- operator !() const {
1298
- vec Ret{};
1299
- for (size_t I = 0 ; I < NumElements; ++I)
1300
- Ret.setValue (I, !vec_data<DataT>::get (getValue (I)));
1301
- return Ret;
1302
- }
1254
+ vec<rel_t , NumElements> operator !() const {
1255
+ // Use __SYCL_DEVICE_ONLY__ macro because cast to OpenCL vector type is defined
1256
+ // by SYCL device compiler only.
1257
+ #ifdef __SYCL_DEVICE_ONLY__
1258
+ return vec<rel_t , NumElements>{
1259
+ (typename vec<rel_t , NumElements>::DataType) !m_Data};
1303
1260
#else
1304
- template <typename T = DataT, int N = NumElements>
1305
- EnableIfUsingArray<vec<T, N>> operator !() const {
1306
- vec Ret{};
1307
- for (size_t I = 0 ; I < NumElements; ++I)
1261
+ vec<rel_t , NumElements> Ret{};
1262
+ for (size_t I = 0 ; I < NumElements; ++I) {
1308
1263
Ret.setValue (I, !vec_data<DataT>::get (getValue (I)));
1264
+ }
1309
1265
return Ret;
1310
- }
1311
1266
#endif
1312
-
1313
- // operator +
1314
- template <typename T = vec> EnableIfNotUsingArray<T> operator +() const {
1315
- return vec{+m_Data};
1316
1267
}
1317
1268
1318
- template <typename T = vec> EnableIfUsingArray<T> operator +() const {
1269
+ vec operator +() const {
1270
+ // Use __SYCL_DEVICE_ONLY__ macro because cast to OpenCL vector type is defined
1271
+ // by SYCL device compiler only.
1272
+ #ifdef __SYCL_DEVICE_ONLY__
1273
+ return vec{+m_Data};
1274
+ #else
1319
1275
vec Ret{};
1320
1276
for (size_t I = 0 ; I < NumElements; ++I)
1321
1277
Ret.setValue (I, vec_data<DataT>::get (+vec_data<DataT>::get (getValue (I))));
1322
1278
return Ret;
1279
+ #endif
1323
1280
}
1324
1281
1325
- // operator -
1326
- template <typename T = vec> EnableIfNotUsingArray<T> operator -() const {
1282
+ vec operator -() const {
1283
+ // Use __SYCL_DEVICE_ONLY__ macro because cast to OpenCL vector type is defined
1284
+ // by SYCL device compiler only.
1285
+ #ifdef __SYCL_DEVICE_ONLY__
1327
1286
return vec{-m_Data};
1328
- }
1329
-
1330
- template <typename T = vec> EnableIfUsingArray<T> operator -() const {
1287
+ #else
1331
1288
vec Ret{};
1332
1289
for (size_t I = 0 ; I < NumElements; ++I)
1333
1290
Ret.setValue (I, vec_data<DataT>::get (-vec_data<DataT>::get (getValue (I))));
1334
1291
return Ret;
1292
+ #endif
1335
1293
}
1336
1294
1337
1295
// OP is: &&, ||
@@ -1347,7 +1305,7 @@ template <typename Type, int NumElements> class vec {
1347
1305
template <template <typename > class Operation ,
1348
1306
typename Ty = vec<DataT, NumElements>>
1349
1307
vec<DataT, NumElements>
1350
- operatorHelper (const EnableIfNotUsingArrayOnDevice <Ty> &Rhs) const {
1308
+ operatorHelper (const EnableIfNotUsingArray <Ty> &Rhs) const {
1351
1309
vec<DataT, NumElements> Result;
1352
1310
Operation<DataType> Op;
1353
1311
Result.m_Data = Op (m_Data, Rhs.m_Data );
@@ -1357,7 +1315,7 @@ template <typename Type, int NumElements> class vec {
1357
1315
template <template <typename > class Operation ,
1358
1316
typename Ty = vec<DataT, NumElements>>
1359
1317
vec<DataT, NumElements>
1360
- operatorHelper (const EnableIfUsingArrayOnDevice <Ty> &Rhs) const {
1318
+ operatorHelper (const EnableIfUsingArray <Ty> &Rhs) const {
1361
1319
vec<DataT, NumElements> Result;
1362
1320
Operation<DataT> Op;
1363
1321
for (size_t I = 0 ; I < NumElements; ++I) {
0 commit comments