@@ -314,19 +314,6 @@ template <typename Type, int NumElements> class vec {
314
314
315
315
#if defined(__INTEL_PREVIEW_BREAKING_CHANGES)
316
316
317
- // This represents HOW we will approach the underlying value, so as to
318
- // benefit from vector speed improvements
319
- using VectorDataType =
320
- typename detail::VecStorage<DataT, NumElements>::VectorDataType;
321
-
322
- VectorDataType &getAsVector () {
323
- return *reinterpret_cast <VectorDataType *>(m_Data.data ());
324
- }
325
-
326
- const VectorDataType &getAsVector () const {
327
- return *reinterpret_cast <const VectorDataType *>(m_Data.data ());
328
- }
329
-
330
317
static constexpr size_t AdjustedNum = (NumElements == 3 ) ? 4 : NumElements;
331
318
static constexpr size_t Sz = sizeof (DataT) * AdjustedNum;
332
319
static constexpr bool IsSizeGreaterThanMaxAlign =
@@ -516,7 +503,8 @@ template <typename Type, int NumElements> class vec {
516
503
517
504
#ifdef __SYCL_DEVICE_ONLY__
518
505
#if defined(__INTEL_PREVIEW_BREAKING_CHANGES)
519
- using vector_t = VectorDataType;
506
+ using vector_t =
507
+ typename detail::VecStorage<DataT, NumElements>::VectorDataType;
520
508
#else
521
509
using vector_t = DataType;
522
510
#endif // __INTEL_PREVIEW_BREAKING_CHANGES
@@ -713,7 +701,7 @@ template <typename Type, int NumElements> class vec {
713
701
if constexpr (!IsUsingArrayOnDevice) {
714
702
return m_Data;
715
703
} else {
716
- auto ptr = bit_cast<const VectorDataType *>((&m_Data)->data ());
704
+ auto ptr = bit_cast<const vector_t *>((&m_Data)->data ());
717
705
return *ptr;
718
706
}
719
707
}
@@ -788,32 +776,32 @@ template <typename Type, int NumElements> class vec {
788
776
" Unsupported convertT" );
789
777
using T = vec_data_t <DataT>;
790
778
using R = vec_data_t <convertT>;
779
+ using OpenCLT = detail::ConvertToOpenCLType_t<T>;
780
+ using OpenCLR = detail::ConvertToOpenCLType_t<R>;
791
781
vec<convertT, NumElements> Result;
792
- #if defined(__INTEL_PREVIEW_BREAKING_CHANGES)
793
- if constexpr (NativeVec && vec<convertT, NumElements>::NativeVec) {
794
- #ifdef __SYCL_DEVICE_ONLY__
795
- // If both vectors are representable as native vectors, then we can use
796
- // a single vector-wide operation to do a conversion:
797
- Result.m_Data = detail::convertImpl<
798
- T, R, roundingMode, NumElements, VectorDataType,
799
- typename vec<convertT, NumElements>::VectorDataType>(m_Data);
800
- #endif // __SYCL_DEVICE_ONLY
801
- } else {
802
- #endif // __INTEL_PREVIEW_BREAKING_CHANGES
803
-
782
+ #if defined(__INTEL_PREVIEW_BREAKING_CHANGES) && defined(__SYCL_DEVICE_ONLY__)
783
+ using OpenCLVecT = OpenCLT __attribute__ ((ext_vector_type (NumElements)));
784
+ using OpenCLVecR = OpenCLR __attribute__ ((ext_vector_type (NumElements)));
785
+ if constexpr (NativeVec && vec<convertT, NumElements>::NativeVec &&
786
+ std::is_convertible_v<decltype (m_Data), OpenCLVecT> &&
787
+ std::is_convertible_v<decltype (Result.m_Data ), OpenCLR>) {
788
+ // If both vectors are representable as native vectors and these native
789
+ // vectors can be converted to valid OpenCL representations, then we can
790
+ // use a single vector-wide operation to do a conversion:
791
+ Result.m_Data = detail::convertImpl<T, R, roundingMode, NumElements,
792
+ OpenCLVecT, OpenCLVecR>(m_Data);
793
+ } else
794
+ #endif // defined(__INTEL_PREVIEW_BREAKING_CHANGES) &&
795
+ // defined(__SYCL_DEVICE_ONLY__)
796
+ {
804
797
// Otherwise, we fallback to per-element conversion:
805
- using OpenCLT = detail::ConvertToOpenCLType_t<vec_data_t <DataT>>;
806
- using OpenCLR = detail::ConvertToOpenCLType_t<vec_data_t <convertT>>;
807
798
for (size_t I = 0 ; I < NumElements; ++I) {
808
799
Result.setValue (
809
800
I, vec_data<convertT>::get (
810
801
detail::convertImpl<T, R, roundingMode, 1 , OpenCLT, OpenCLR>(
811
802
vec_data<DataT>::get (getValue (I)))));
812
803
}
813
-
814
- #if defined(__INTEL_PREVIEW_BREAKING_CHANGES)
815
804
}
816
- #endif // defined(__INTEL_PREVIEW_BREAKING_CHANGES)
817
805
818
806
if constexpr (std::is_same_v<convertT, bool >) {
819
807
Result.ConvertToDataT ();
@@ -982,7 +970,7 @@ template <typename Type, int NumElements> class vec {
982
970
vec operator BINOP (const vec &Rhs) const { \
983
971
vec Ret{}; \
984
972
if constexpr (NativeVec) \
985
- Ret.getAsVector () = getAsVector () BINOP Rhs.getAsVector (); \
973
+ Ret.m_Data = m_Data BINOP Rhs.m_Data ; \
986
974
else \
987
975
for (size_t I = 0 ; I < NumElements; ++I) \
988
976
Ret.setValue (I, (DataT)(vec_data<DataT>::get (getValue ( \
@@ -2258,14 +2246,10 @@ template <typename T, int N> struct VecStorageImpl {
2258
2246
using VectorDataType = T __attribute__ ((ext_vector_type(N)));
2259
2247
};
2260
2248
#else // __SYCL_DEVICE_ONLY__
2261
-
2262
- template <typename T, int N> struct VecStorageImpl ;
2263
- #define __SYCL_DEFINE_VECSTORAGE_IMPL (type, cl_type, num ) \
2264
- template <> struct VecStorageImpl <type, num> { \
2265
- using DataType = std::array<type, (num == 3 ) ? 4 : num>; \
2266
- using VectorDataType = ::cl_##cl_type##num; \
2267
- };
2268
- #endif // SYCL_DEVICE_ONLY
2249
+ template <typename T, int N> struct VecStorageImpl {
2250
+ using DataType = std::array<T, (N == 3 ) ? 4 : N>;
2251
+ };
2252
+ #endif // __SYCL_DEVICE_ONLY__
2269
2253
#endif // defined(__INTEL_PREVIEW_BREAKING_CHANGES)
2270
2254
2271
2255
#if !defined(__INTEL_PREVIEW_BREAKING_CHANGES)
@@ -2283,7 +2267,6 @@ template <typename T, int N> struct VecStorageImpl;
2283
2267
using DataType = ::cl_##cl_type##num; \
2284
2268
};
2285
2269
#endif // __SYCL_USE_EXT_VECTOR_TYPE__
2286
- #endif // !defined(__INTEL_PREVIEW_BREAKING_CHANGES)
2287
2270
2288
2271
#ifndef __SYCL_USE_EXT_VECTOR_TYPE__
2289
2272
#define __SYCL_DEFINE_VECSTORAGE_IMPL_FOR_TYPE (type, cl_type ) \
@@ -2307,12 +2290,15 @@ __SYCL_DEFINE_VECSTORAGE_IMPL_FOR_TYPE(double, double)
2307
2290
#undef __SYCL_DEFINE_VECSTORAGE_IMPL_FOR_TYPE
2308
2291
#undef __SYCL_DEFINE_VECSTORAGE_IMPL
2309
2292
#endif // ifndef __SYCL_USE_EXT_VECTOR_TYPE__
2293
+ #endif // !defined(__INTEL_PREVIEW_BREAKING_CHANGES)
2310
2294
2311
2295
// Single element bool
2312
2296
template <> struct VecStorage <bool , 1 , void > {
2313
2297
using DataType = bool ;
2314
2298
#ifdef __INTEL_PREVIEW_BREAKING_CHANGES
2299
+ #ifdef __SYCL_DEVICE_ONLY__
2315
2300
using VectorDataType = bool ;
2301
+ #endif // __SYCL_DEVICE_ONLY__
2316
2302
#endif // __INTEL_PREVIEW_BREAKING_CHANGES
2317
2303
};
2318
2304
@@ -2324,41 +2310,65 @@ struct VecStorage<bool, N, typename std::enable_if_t<isValidVectorSize(N)>> {
2324
2310
std::int32_t , std::int64_t >,
2325
2311
N>::DataType;
2326
2312
#ifdef __INTEL_PREVIEW_BREAKING_CHANGES
2313
+ #ifdef __SYCL_DEVICE_ONLY__
2327
2314
using VectorDataType =
2328
2315
typename VecStorageImpl<select_apply_cl_t <bool , std::int8_t , std::int16_t ,
2329
2316
std::int32_t , std::int64_t >,
2330
2317
N>::VectorDataType;
2318
+ #endif // __SYCL_DEVICE_ONLY__
2319
+ #endif // __INTEL_PREVIEW_BREAKING_CHANGES
2320
+ };
2321
+
2322
+ #if (!defined(_HAS_STD_BYTE) || _HAS_STD_BYTE != 0)
2323
+ // Single element byte. Multiple elements will propagate through a later
2324
+ // specialization.
2325
+ template <> struct VecStorage <std::byte, 1 , void > {
2326
+ using DataType = std::int8_t ;
2327
+ #ifdef __INTEL_PREVIEW_BREAKING_CHANGES
2328
+ #ifdef __SYCL_DEVICE_ONLY__
2329
+ using VectorDataType = std::int8_t ;
2330
+ #endif // __SYCL_DEVICE_ONLY__
2331
2331
#endif // __INTEL_PREVIEW_BREAKING_CHANGES
2332
2332
};
2333
+ #endif // (!defined(_HAS_STD_BYTE) || _HAS_STD_BYTE != 0)
2333
2334
2334
2335
// Single element signed integers
2335
2336
template <typename T>
2336
2337
struct VecStorage <T, 1 , typename std::enable_if_t <is_sigeninteger_v<T>>> {
2338
+ #ifndef __INTEL_PREVIEW_BREAKING_CHANGES
2337
2339
using DataType = select_apply_cl_t <T, std::int8_t , std::int16_t , std::int32_t ,
2338
2340
std::int64_t >;
2339
- #ifdef __INTEL_PREVIEW_BREAKING_CHANGES
2341
+ #else // __INTEL_PREVIEW_BREAKING_CHANGES
2342
+ using DataType = T;
2343
+ #ifdef __SYCL_DEVICE_ONLY__
2340
2344
using VectorDataType = DataType;
2345
+ #endif // __SYCL_DEVICE_ONLY__
2341
2346
#endif // __INTEL_PREVIEW_BREAKING_CHANGES
2342
2347
};
2343
2348
2344
2349
// Single element unsigned integers
2345
2350
template <typename T>
2346
2351
struct VecStorage <T, 1 , typename std::enable_if_t <is_sugeninteger_v<T>>> {
2352
+ #ifndef __INTEL_PREVIEW_BREAKING_CHANGES
2347
2353
using DataType = select_apply_cl_t <T, std::uint8_t , std::uint16_t ,
2348
2354
std::uint32_t , std::uint64_t >;
2349
- #ifdef __INTEL_PREVIEW_BREAKING_CHANGES
2355
+ #else // __INTEL_PREVIEW_BREAKING_CHANGES
2356
+ using DataType = T;
2357
+ #ifdef __SYCL_DEVICE_ONLY__
2350
2358
using VectorDataType = DataType;
2359
+ #endif // __SYCL_DEVICE_ONLY__
2351
2360
#endif // __INTEL_PREVIEW_BREAKING_CHANGES
2352
2361
};
2353
2362
2354
2363
// Single element floating-point (except half)
2355
2364
template <typename T>
2356
2365
struct VecStorage <
2357
2366
T, 1 , typename std::enable_if_t <!is_half_v<T> && is_sgenfloat_v<T>>> {
2358
- using DataType =
2359
- select_apply_cl_t <T, std::false_type, std::false_type, float , double >;
2367
+ using DataType = T;
2360
2368
#ifdef __INTEL_PREVIEW_BREAKING_CHANGES
2369
+ #ifdef __SYCL_DEVICE_ONLY__
2361
2370
using VectorDataType = DataType;
2371
+ #endif // __SYCL_DEVICE_ONLY__
2362
2372
#endif // __INTEL_PREVIEW_BREAKING_CHANGES
2363
2373
};
2364
2374
// Multiple elements signed/unsigned integers and floating-point (except half)
@@ -2371,32 +2381,39 @@ struct VecStorage<
2371
2381
using DataType =
2372
2382
typename VecStorageImpl<typename VecStorage<T, 1 >::DataType, N>::DataType;
2373
2383
#ifdef __INTEL_PREVIEW_BREAKING_CHANGES
2384
+ #ifdef __SYCL_DEVICE_ONLY__
2374
2385
using VectorDataType =
2375
2386
typename VecStorageImpl<typename VecStorage<T, 1 >::DataType,
2376
2387
N>::VectorDataType;
2388
+ #endif // __SYCL_DEVICE_ONLY__
2377
2389
#endif // __INTEL_PREVIEW_BREAKING_CHANGES
2378
2390
};
2379
2391
2380
2392
// Single element half
2381
2393
template <> struct VecStorage <half, 1 , void > {
2382
2394
using DataType = sycl::detail::half_impl::StorageT;
2383
2395
#ifdef __INTEL_PREVIEW_BREAKING_CHANGES
2396
+ #ifdef __SYCL_DEVICE_ONLY__
2384
2397
using VectorDataType = sycl::detail::half_impl::StorageT;
2398
+ #endif // __SYCL_DEVICE_ONLY__
2385
2399
#endif // __INTEL_PREVIEW_BREAKING_CHANGES
2386
2400
};
2401
+
2387
2402
// Multiple elements half
2388
- #ifdef __INTEL_PREVIEW_BREAKING_CHANGES
2403
+ #if defined( __INTEL_PREVIEW_BREAKING_CHANGES) && defined(__SYCL_DEVICE_ONLY__)
2389
2404
#define __SYCL_DEFINE_HALF_VECSTORAGE (Num ) \
2390
2405
template <> struct VecStorage <half, Num, void > { \
2391
2406
using DataType = sycl::detail::half_impl::Vec##Num##StorageT; \
2392
2407
using VectorDataType = sycl::detail::half_impl::Vec##Num##StorageT; \
2393
2408
};
2394
- #else // __INTEL_PREVIEW_BREAKING_CHANGES
2409
+ #else // defined(__INTEL_PREVIEW_BREAKING_CHANGES) &&
2410
+ // defined(__SYCL_DEVICE_ONLY__)
2395
2411
#define __SYCL_DEFINE_HALF_VECSTORAGE (Num ) \
2396
2412
template <> struct VecStorage <half, Num, void > { \
2397
2413
using DataType = sycl::detail::half_impl::Vec##Num##StorageT; \
2398
2414
};
2399
- #endif
2415
+ #endif // defined(__INTEL_PREVIEW_BREAKING_CHANGES) &&
2416
+ // defined(__SYCL_DEVICE_ONLY__)
2400
2417
2401
2418
__SYCL_DEFINE_HALF_VECSTORAGE (2 )
2402
2419
__SYCL_DEFINE_HALF_VECSTORAGE(3 )
0 commit comments