@@ -423,7 +423,20 @@ struct Identity<Op, T, std::enable_if_t<UseBuiltInIdentity<Op, T>::value>>
423423
424424// Sub-group load/store
425425
426- #if defined(SYCL_EXT_ONEAPI_GROUP_LOAD_STORE)
426+ #ifndef USE_GROUP_LOAD_STORE
427+ #if defined(SYCL_EXT_ONEAPI_GROUP_LOAD_STORE) && \
428+ SYCL_EXT_ONEAPI_GROUP_LOAD_STORE
429+ #define USE_GROUP_LOAD_STORE 1
430+ #else
431+ #if defined(__INTEL_LLVM_COMPILER) && (__INTEL_LLVM_COMIPLER > 20250000u)
432+ #define USE_GROUP_LOAD_STORE 1
433+ #else
434+ #define USE_GROUP_LOAD_STORE 0
435+ #endif
436+ #endif
437+ #endif
438+
439+ #if (USE_GROUP_LOAD_STORE)
427440namespace ls_ns = sycl::ext::oneapi::experimental;
428441#endif
429442
@@ -434,8 +447,9 @@ template <std::uint8_t vec_sz,
434447auto sub_group_load (const sycl::sub_group &sg,
435448 sycl::multi_ptr<ElementType, Space, DecorateAddress> m_ptr)
436449{
437- #if defined(SYCL_EXT_ONEAPI_GROUP_LOAD_STORE)
438- sycl::vec<ElementType, vec_sz> x;
450+ #if (USE_GROUP_LOAD_STORE)
451+ using ValueT = typename std::remove_cv_t <ElementType>;
452+ sycl::vec<ValueT, vec_sz> x{};
439453 ls_ns::group_load (sg, m_ptr, x);
440454 return x;
441455#else
@@ -449,8 +463,9 @@ template <sycl::access::address_space Space,
449463auto sub_group_load (const sycl::sub_group &sg,
450464 sycl::multi_ptr<ElementType, Space, DecorateAddress> m_ptr)
451465{
452- #if defined(SYCL_EXT_ONEAPI_GROUP_LOAD_STORE)
453- ElementType x;
466+ #if (USE_GROUP_LOAD_STORE)
467+ using ValueT = typename std::remove_cv_t <ElementType>;
468+ ValueT x{};
454469 ls_ns::group_load (sg, m_ptr, x);
455470 return x;
456471#else
@@ -461,29 +476,41 @@ auto sub_group_load(const sycl::sub_group &sg,
461476template <std::uint8_t vec_sz,
462477 sycl::access::address_space Space,
463478 sycl::access::decorated DecorateAddress,
479+ typename VecT,
464480 typename ElementType>
465- void sub_group_store (const sycl::sub_group &sg,
466- const sycl::vec<ElementType, vec_sz> &val,
467- sycl::multi_ptr<ElementType, Space, DecorateAddress> m_ptr)
468- {
469- #if defined(SYCL_EXT_ONEAPI_GROUP_LOAD_STORE)
481+ std::enable_if_t <
482+ std::is_same_v<std::remove_cv_t <ElementType>, std::remove_cv_t <VecT>>,
483+ void >
484+ sub_group_store (const sycl::sub_group &sg,
485+ const sycl::vec<VecT, vec_sz> &val,
486+ sycl::multi_ptr<ElementType, Space, DecorateAddress> m_ptr)
487+ {
488+ #if (USE_GROUP_LOAD_STORE)
470489 ls_ns::group_store (sg, val, m_ptr);
490+ return ;
471491#else
472492 sg.store <vec_sz>(m_ptr, val);
493+ return ;
473494#endif
474495}
475496
476497template <sycl::access::address_space Space,
477498 sycl::access::decorated DecorateAddress,
499+ typename VecT,
478500 typename ElementType>
479- void sub_group_store (const sycl::sub_group &sg,
480- const ElementType &val,
481- sycl::multi_ptr<ElementType, Space, DecorateAddress> m_ptr)
482- {
483- #if defined(SYCL_EXT_ONEAPI_GROUP_LOAD_STORE)
501+ std::enable_if_t <
502+ std::is_same_v<std::remove_cv_t <ElementType>, std::remove_cv_t <VecT>>,
503+ void >
504+ sub_group_store (const sycl::sub_group &sg,
505+ const VecT &val,
506+ sycl::multi_ptr<ElementType, Space, DecorateAddress> m_ptr)
507+ {
508+ #if (USE_GROUP_LOAD_STORE)
484509 ls_ns::group_store (sg, val, m_ptr);
510+ return ;
485511#else
486512 sg.store (m_ptr, val);
513+ return ;
487514#endif
488515}
489516
0 commit comments