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