diff --git a/sycl/include/sycl/__spirv/spirv_ops.hpp b/sycl/include/sycl/__spirv/spirv_ops.hpp index d5e6a62d13a6e..29cb4ffa6aa2f 100644 --- a/sycl/include/sycl/__spirv/spirv_ops.hpp +++ b/sycl/include/sycl/__spirv/spirv_ops.hpp @@ -540,190 +540,6 @@ __SPIRV_ATOMICS(__SPIRV_ATOMIC_MINMAX, Max) #undef __SPIRV_ATOMIC_UNSIGNED #undef __SPIRV_ATOMIC_XOR -template -extern __attribute__((opencl_global)) dataT * -__SYCL_GenericCastToPtrExplicit_ToGlobal(void *Ptr) noexcept { - return (__attribute__((opencl_global)) dataT *) - __spirv_GenericCastToPtrExplicit_ToGlobal( - Ptr, __spv::StorageClass::CrossWorkgroup); -} - -template -extern const __attribute__((opencl_global)) dataT * -__SYCL_GenericCastToPtrExplicit_ToGlobal(const void *Ptr) noexcept { - return (const __attribute__((opencl_global)) dataT *) - __spirv_GenericCastToPtrExplicit_ToGlobal( - Ptr, __spv::StorageClass::CrossWorkgroup); -} - -template -extern volatile __attribute__((opencl_global)) dataT * -__SYCL_GenericCastToPtrExplicit_ToGlobal(volatile void *Ptr) noexcept { - return (volatile __attribute__((opencl_global)) dataT *) - __spirv_GenericCastToPtrExplicit_ToGlobal( - Ptr, __spv::StorageClass::CrossWorkgroup); -} - -template -extern const volatile __attribute__((opencl_global)) dataT * -__SYCL_GenericCastToPtrExplicit_ToGlobal(const volatile void *Ptr) noexcept { - return (const volatile __attribute__((opencl_global)) dataT *) - __spirv_GenericCastToPtrExplicit_ToGlobal( - Ptr, __spv::StorageClass::CrossWorkgroup); -} - -template -extern __attribute__((opencl_local)) dataT * -__SYCL_GenericCastToPtrExplicit_ToLocal(void *Ptr) noexcept { - return (__attribute__((opencl_local)) dataT *) - __spirv_GenericCastToPtrExplicit_ToLocal(Ptr, - __spv::StorageClass::Workgroup); -} - -template -extern const __attribute__((opencl_local)) dataT * -__SYCL_GenericCastToPtrExplicit_ToLocal(const void *Ptr) noexcept { - return (const __attribute__((opencl_local)) dataT *) - __spirv_GenericCastToPtrExplicit_ToLocal(Ptr, - __spv::StorageClass::Workgroup); -} - -template -extern volatile __attribute__((opencl_local)) dataT * -__SYCL_GenericCastToPtrExplicit_ToLocal(volatile void *Ptr) noexcept { - return (volatile __attribute__((opencl_local)) dataT *) - __spirv_GenericCastToPtrExplicit_ToLocal(Ptr, - __spv::StorageClass::Workgroup); -} - -template -extern const volatile __attribute__((opencl_local)) dataT * -__SYCL_GenericCastToPtrExplicit_ToLocal(const volatile void *Ptr) noexcept { - return (const volatile __attribute__((opencl_local)) dataT *) - __spirv_GenericCastToPtrExplicit_ToLocal(Ptr, - __spv::StorageClass::Workgroup); -} - -template -extern __attribute__((opencl_private)) dataT * -__SYCL_GenericCastToPtrExplicit_ToPrivate(void *Ptr) noexcept { - return (__attribute__((opencl_private)) dataT *) - __spirv_GenericCastToPtrExplicit_ToPrivate(Ptr, - __spv::StorageClass::Function); -} - -template -extern const __attribute__((opencl_private)) dataT * -__SYCL_GenericCastToPtrExplicit_ToPrivate(const void *Ptr) noexcept { - return (const __attribute__((opencl_private)) dataT *) - __spirv_GenericCastToPtrExplicit_ToPrivate(Ptr, - __spv::StorageClass::Function); -} - -template -extern volatile __attribute__((opencl_private)) dataT * -__SYCL_GenericCastToPtrExplicit_ToPrivate(volatile void *Ptr) noexcept { - return (volatile __attribute__((opencl_private)) dataT *) - __spirv_GenericCastToPtrExplicit_ToPrivate(Ptr, - __spv::StorageClass::Function); -} - -template -extern const volatile __attribute__((opencl_private)) dataT * -__SYCL_GenericCastToPtrExplicit_ToPrivate(const volatile void *Ptr) noexcept { - return (const volatile __attribute__((opencl_private)) dataT *) - __spirv_GenericCastToPtrExplicit_ToPrivate(Ptr, - __spv::StorageClass::Function); -} - -template -extern __attribute__((opencl_global)) dataT * -__SYCL_GenericCastToPtr_ToGlobal(void *Ptr) noexcept { - return (__attribute__((opencl_global)) dataT *) - __spirv_GenericCastToPtr_ToGlobal(Ptr, - __spv::StorageClass::CrossWorkgroup); -} - -template -extern const __attribute__((opencl_global)) dataT * -__SYCL_GenericCastToPtr_ToGlobal(const void *Ptr) noexcept { - return (const __attribute__((opencl_global)) dataT *) - __spirv_GenericCastToPtr_ToGlobal(Ptr, - __spv::StorageClass::CrossWorkgroup); -} - -template -extern volatile __attribute__((opencl_global)) dataT * -__SYCL_GenericCastToPtr_ToGlobal(volatile void *Ptr) noexcept { - return (volatile __attribute__((opencl_global)) dataT *) - __spirv_GenericCastToPtr_ToGlobal(Ptr, - __spv::StorageClass::CrossWorkgroup); -} - -template -extern const volatile __attribute__((opencl_global)) dataT * -__SYCL_GenericCastToPtr_ToGlobal(const volatile void *Ptr) noexcept { - return (const volatile __attribute__((opencl_global)) dataT *) - __spirv_GenericCastToPtr_ToGlobal(Ptr, - __spv::StorageClass::CrossWorkgroup); -} - -template -extern __attribute__((opencl_local)) dataT * -__SYCL_GenericCastToPtr_ToLocal(void *Ptr) noexcept { - return (__attribute__((opencl_local)) dataT *) - __spirv_GenericCastToPtr_ToLocal(Ptr, __spv::StorageClass::Workgroup); -} - -template -extern const __attribute__((opencl_local)) dataT * -__SYCL_GenericCastToPtr_ToLocal(const void *Ptr) noexcept { - return (const __attribute__((opencl_local)) dataT *) - __spirv_GenericCastToPtr_ToLocal(Ptr, __spv::StorageClass::Workgroup); -} - -template -extern volatile __attribute__((opencl_local)) dataT * -__SYCL_GenericCastToPtr_ToLocal(volatile void *Ptr) noexcept { - return (volatile __attribute__((opencl_local)) dataT *) - __spirv_GenericCastToPtr_ToLocal(Ptr, __spv::StorageClass::Workgroup); -} - -template -extern const volatile __attribute__((opencl_local)) dataT * -__SYCL_GenericCastToPtr_ToLocal(const volatile void *Ptr) noexcept { - return (const volatile __attribute__((opencl_local)) dataT *) - __spirv_GenericCastToPtr_ToLocal(Ptr, __spv::StorageClass::Workgroup); -} - -template -extern __attribute__((opencl_private)) dataT * -__SYCL_GenericCastToPtr_ToPrivate(void *Ptr) noexcept { - return (__attribute__((opencl_private)) dataT *) - __spirv_GenericCastToPtr_ToPrivate(Ptr, __spv::StorageClass::Function); -} - -template -extern const __attribute__((opencl_private)) dataT * -__SYCL_GenericCastToPtr_ToPrivate(const void *Ptr) noexcept { - return (const __attribute__((opencl_private)) dataT *) - __spirv_GenericCastToPtr_ToPrivate(Ptr, __spv::StorageClass::Function); -} - -template -extern volatile __attribute__((opencl_private)) dataT * -__SYCL_GenericCastToPtr_ToPrivate(volatile void *Ptr) noexcept { - return (volatile __attribute__((opencl_private)) dataT *) - __spirv_GenericCastToPtr_ToPrivate(Ptr, __spv::StorageClass::Function); -} - -template -extern const volatile __attribute__((opencl_private)) dataT * -__SYCL_GenericCastToPtr_ToPrivate(const volatile void *Ptr) noexcept { - return (const volatile __attribute__((opencl_private)) dataT *) - __spirv_GenericCastToPtr_ToPrivate(Ptr, __spv::StorageClass::Function); -} - template __SYCL_CONVERGENT__ extern __DPCPP_SYCL_EXTERNAL dataT __spirv_SubgroupShuffleINTEL(dataT Data, uint32_t InvocationId) noexcept; diff --git a/sycl/include/sycl/access/access.hpp b/sycl/include/sycl/access/access.hpp index b35bf36ec7fe1..ad95479e9d885 100644 --- a/sycl/include/sycl/access/access.hpp +++ b/sycl/include/sycl/access/access.hpp @@ -325,58 +325,154 @@ template using remove_decoration_t = typename remove_decoration::type; namespace detail { - -// Helper function for selecting appropriate casts between address spaces. -template inline ToT cast_AS(FromT from) { #ifdef __SYCL_DEVICE_ONLY__ - constexpr access::address_space ToAS = deduce_AS::value; - constexpr access::address_space FromAS = deduce_AS::value; - if constexpr (FromAS == access::address_space::generic_space) { -#if defined(__NVPTX__) || defined(__AMDGCN__) || defined(__SYCL_NATIVE_CPU__) - // TODO: NVPTX and AMDGCN backends do not currently support the - // __spirv_GenericCastToPtrExplicit_* builtins, so to work around this - // we do C-style casting. This may produce warnings when targetting - // these backends. - return (ToT)from; +inline constexpr bool +address_space_cast_is_possible(access::address_space Src, + access::address_space Dst) { + // constant_space is unique and is not interchangeable with any other. + auto constant_space = access::address_space::constant_space; + if (Src == constant_space || Dst == constant_space) + return Src == Dst; + + auto generic_space = access::address_space::generic_space; + if (Src == Dst || Src == generic_space || Dst == generic_space) + return true; + + // global_host/global_device could be casted to/from global + auto global_space = access::address_space::global_space; + auto global_device = access::address_space::ext_intel_global_device_space; + auto global_host = access::address_space::ext_intel_global_host_space; + + if (Src == global_space || Dst == global_space) { + auto Other = Src == global_space ? Dst : Src; + if (Other == global_device || Other == global_host) + return true; + } + + // No more compatible combinations. + return false; +} + +template +auto static_address_cast(ElementType *Ptr) { + constexpr auto generic_space = access::address_space::generic_space; + constexpr auto global_space = access::address_space::global_space; + constexpr auto local_space = access::address_space::local_space; + constexpr auto private_space = access::address_space::private_space; + constexpr auto global_device = + access::address_space::ext_intel_global_device_space; + constexpr auto global_host = + access::address_space::ext_intel_global_host_space; + + constexpr auto SrcAS = deduce_AS::value; + static_assert(address_space_cast_is_possible(SrcAS, Space)); + + using dst_type = typename DecoratedType< + std::remove_pointer_t>, Space>::type *; + + // Note: reinterpret_cast isn't enough for some of the casts between different + // address spaces, use C-style cast instead. +#if !defined(__SPIR__) + return (dst_type)Ptr; #else - using ToElemT = std::remove_pointer_t>; - if constexpr (ToAS == access::address_space::global_space) - return __SYCL_GenericCastToPtrExplicit_ToGlobal(from); - else if constexpr (ToAS == access::address_space::local_space) - return __SYCL_GenericCastToPtrExplicit_ToLocal(from); - else if constexpr (ToAS == access::address_space::private_space) - return __SYCL_GenericCastToPtrExplicit_ToPrivate(from); -#ifdef __ENABLE_USM_ADDR_SPACE__ - else if constexpr (ToAS == access::address_space:: - ext_intel_global_device_space || - ToAS == - access::address_space::ext_intel_global_host_space) - // For extended address spaces we do not currently have a SPIR-V - // conversion function, so we do a C-style cast. This may produce - // warnings. - return (ToT)from; -#endif // __ENABLE_USM_ADDR_SPACE__ - else - return reinterpret_cast(from); -#endif // defined(__NVPTX__) || defined(__AMDGCN__) - } else -#ifdef __ENABLE_USM_ADDR_SPACE__ - if constexpr (FromAS == access::address_space::global_space && - (ToAS == - access::address_space::ext_intel_global_device_space || - ToAS == - access::address_space::ext_intel_global_host_space)) { - // Casting from global address space to the global device and host address - // spaces is allowed. - return (ToT)from; - } else -#endif // __ENABLE_USM_ADDR_SPACE__ -#endif // __SYCL_DEVICE_ONLY__ - { - return reinterpret_cast(from); + if constexpr (SrcAS != generic_space) { + return (dst_type)Ptr; + } else if constexpr (Space == global_space) { + return (dst_type)__spirv_GenericCastToPtr_ToGlobal( + Ptr, __spv::StorageClass::CrossWorkgroup); + } else if constexpr (Space == local_space) { + return (dst_type)__spirv_GenericCastToPtr_ToLocal( + Ptr, __spv::StorageClass::Workgroup); + } else if constexpr (Space == private_space) { + return (dst_type)__spirv_GenericCastToPtr_ToPrivate( + Ptr, __spv::StorageClass::Function); +#if !defined(__ENABLE_USM_ADDR_SPACE__) + } else if constexpr (Space == global_device || Space == global_host) { + // If __ENABLE_USM_ADDR_SPACE__ isn't defined then both + // global_device/global_host are just aliases for global_space. + return (dst_type)__spirv_GenericCastToPtr_ToGlobal( + Ptr, __spv::StorageClass::CrossWorkgroup); +#endif + } else { + return (dst_type)Ptr; } +#endif } +// Previous implementation (`castAS`, used in `multi_ptr` ctors among other +// places), used C-style cast instead of a proper dynamic check for some +// backends/spaces. `SupressNotImplementedAssert = true` parameter is emulating +// that previous behavior until the proper support is added for compatibility +// reasons. +template +auto dynamic_address_cast(ElementType *Ptr) { + constexpr auto generic_space = access::address_space::generic_space; + constexpr auto global_space = access::address_space::global_space; + constexpr auto local_space = access::address_space::local_space; + constexpr auto private_space = access::address_space::private_space; + constexpr auto global_device = + access::address_space::ext_intel_global_device_space; + constexpr auto global_host = + access::address_space::ext_intel_global_host_space; + + constexpr auto SrcAS = deduce_AS::value; + using dst_type = typename DecoratedType< + std::remove_pointer_t>, Space>::type *; + + if constexpr (!address_space_cast_is_possible(SrcAS, Space)) { + return (dst_type) nullptr; + } else if constexpr (Space == generic_space) { + return (dst_type)Ptr; + } else if constexpr (Space == global_space && + (SrcAS == global_device || SrcAS == global_host)) { + return (dst_type)Ptr; + } else if constexpr (SrcAS == global_space && + (Space == global_device || Space == global_host)) { +#if defined(__ENABLE_USM_ADDR_SPACE__) + static_assert(SupressNotImplementedAssert || Space != Space, + "Not supported yet!"); + return static_address_cast(Ptr); +#else + // If __ENABLE_USM_ADDR_SPACE__ isn't defined then both + // global_device/global_host are just aliases for global_space. + static_assert(std::is_same_v); + return (dst_type)Ptr; +#endif +#if defined(__SPIR__) + } else if constexpr (Space == global_space) { + return (dst_type)__spirv_GenericCastToPtrExplicit_ToGlobal( + Ptr, __spv::StorageClass::CrossWorkgroup); + } else if constexpr (Space == local_space) { + return (dst_type)__spirv_GenericCastToPtrExplicit_ToLocal( + Ptr, __spv::StorageClass::Workgroup); + } else if constexpr (Space == private_space) { + return (dst_type)__spirv_GenericCastToPtrExplicit_ToPrivate( + Ptr, __spv::StorageClass::Function); +#if !defined(__ENABLE_USM_ADDR_SPACE__) + } else if constexpr (SrcAS == generic_space && + (Space == global_device || Space == global_host)) { + return (dst_type)__spirv_GenericCastToPtrExplicit_ToGlobal( + Ptr, __spv::StorageClass::CrossWorkgroup); +#endif +#endif + } else { + static_assert(SupressNotImplementedAssert || Space != Space, + "Not supported yet!"); + return static_address_cast(Ptr); + } +} +#else // __SYCL_DEVICE_ONLY__ +template +auto static_address_cast(ElementType *Ptr) { + return Ptr; +} +template +auto dynamic_address_cast(ElementType *Ptr) { + return Ptr; +} +#endif // __SYCL_DEVICE_ONLY__ } // namespace detail #undef __OPENCL_GLOBAL_AS__ diff --git a/sycl/include/sycl/detail/spirv.hpp b/sycl/include/sycl/detail/spirv.hpp index d3113bc1c113e..98ca92b6c988d 100644 --- a/sycl/include/sycl/detail/spirv.hpp +++ b/sycl/include/sycl/detail/spirv.hpp @@ -1377,30 +1377,6 @@ __SYCL_GROUP_COLLECTIVE_OVERLOAD(BitwiseAnd, KHR) __SYCL_GROUP_COLLECTIVE_OVERLOAD(LogicalAnd, KHR) __SYCL_GROUP_COLLECTIVE_OVERLOAD(LogicalOr, KHR) -template -auto GenericCastToPtr(T *Ptr) -> - typename multi_ptr::pointer { - if constexpr (Space == access::address_space::global_space) { - return __SYCL_GenericCastToPtr_ToGlobal(Ptr); - } else if constexpr (Space == access::address_space::local_space) { - return __SYCL_GenericCastToPtr_ToLocal(Ptr); - } else if constexpr (Space == access::address_space::private_space) { - return __SYCL_GenericCastToPtr_ToPrivate(Ptr); - } -} - -template -auto GenericCastToPtrExplicit(T *Ptr) -> - typename multi_ptr::pointer { - if constexpr (Space == access::address_space::global_space) { - return __SYCL_GenericCastToPtrExplicit_ToGlobal(Ptr); - } else if constexpr (Space == access::address_space::local_space) { - return __SYCL_GenericCastToPtrExplicit_ToLocal(Ptr); - } else if constexpr (Space == access::address_space::private_space) { - return __SYCL_GenericCastToPtrExplicit_ToPrivate(Ptr); - } -} - } // namespace spirv } // namespace detail } // namespace _V1 diff --git a/sycl/include/sycl/ext/oneapi/experimental/address_cast.hpp b/sycl/include/sycl/ext/oneapi/experimental/address_cast.hpp index 8e901d7d2877a..4708cd2224e19 100644 --- a/sycl/include/sycl/ext/oneapi/experimental/address_cast.hpp +++ b/sycl/include/sycl/ext/oneapi/experimental/address_cast.hpp @@ -13,47 +13,25 @@ namespace sycl { inline namespace _V1 { -namespace ext { -namespace oneapi { -namespace experimental { +namespace ext::oneapi ::experimental { namespace detail { using namespace sycl::detail; } // Shorthands for address space names -constexpr inline access::address_space global_space = access::address_space::global_space; -constexpr inline access::address_space local_space = access::address_space::local_space; -constexpr inline access::address_space private_space = access::address_space::private_space; -constexpr inline access::address_space generic_space = access::address_space::generic_space; +constexpr inline access::address_space global_space = + access::address_space::global_space; +constexpr inline access::address_space local_space = + access::address_space::local_space; +constexpr inline access::address_space private_space = + access::address_space::private_space; +constexpr inline access::address_space generic_space = + access::address_space::generic_space; template multi_ptr static_address_cast(ElementType *Ptr) { using ret_ty = multi_ptr; -#ifdef __SYCL_DEVICE_ONLY__ - static_assert(std::is_same_v>, - "The extension expects undecorated raw pointers only!"); - if constexpr (Space == generic_space) { - // Undecorated raw pointer is in generic AS already, no extra casts needed. - return ret_ty(Ptr); - } else if constexpr (Space == access::address_space:: - ext_intel_global_device_space || - Space == - access::address_space::ext_intel_global_host_space) { -#ifdef __ENABLE_USM_ADDR_SPACE__ - // No SPIR-V intrinsic for this yet. - using raw_type = detail::DecoratedType::type *; - auto CastPtr = (raw_type)(Ptr); -#else - auto CastPtr = sycl::detail::spirv::GenericCastToPtr(Ptr); -#endif - return ret_ty(CastPtr); - } else { - auto CastPtr = sycl::detail::spirv::GenericCastToPtr(Ptr); - return ret_ty(CastPtr); - } -#else - return ret_ty(Ptr); -#endif + return ret_ty{detail::static_address_cast(Ptr)}; } template static_address_cast( if constexpr (Space == generic_space) return Ptr; else - return {static_address_cast(Ptr.get_raw())}; + return {static_address_cast(Ptr.get_decorated())}; } template multi_ptr dynamic_address_cast(ElementType *Ptr) { using ret_ty = multi_ptr; -#ifdef __SYCL_DEVICE_ONLY__ - static_assert(std::is_same_v>, - "The extension expects undecorated raw pointers only!"); - if constexpr (Space == generic_space) { - return ret_ty(Ptr); - } else if constexpr (Space == access::address_space:: - ext_intel_global_device_space || - Space == - access::address_space::ext_intel_global_host_space) { -#ifdef __ENABLE_USM_ADDR_SPACE__ - static_assert( - Space != access::address_space::ext_intel_global_device_space && - Space != access::address_space::ext_intel_global_host_space, - "Not supported yet!"); - return ret_ty(nullptr); -#else - auto CastPtr = sycl::detail::spirv::GenericCastToPtr(Ptr); - return ret_ty(CastPtr); -#endif - } else { - auto CastPtr = sycl::detail::spirv::GenericCastToPtrExplicit(Ptr); - return ret_ty(CastPtr); - } -#else - return ret_ty(Ptr); -#endif + return ret_ty{detail::dynamic_address_cast(Ptr)}; } template dynamic_address_cast( if constexpr (Space == generic_space) return Ptr; else - return {dynamic_address_cast(Ptr.get_raw())}; + return {dynamic_address_cast(Ptr.get_decorated())}; } -} // namespace experimental -} // namespace oneapi -} // namespace ext +} // namespace ext::oneapi::experimental } // namespace _V1 } // namespace sycl diff --git a/sycl/include/sycl/ext/oneapi/experimental/group_load_store.hpp b/sycl/include/sycl/ext/oneapi/experimental/group_load_store.hpp index d3945fefd8eba..e98e8848f0e59 100644 --- a/sycl/include/sycl/ext/oneapi/experimental/group_load_store.hpp +++ b/sycl/include/sycl/ext/oneapi/experimental/group_load_store.hpp @@ -217,11 +217,10 @@ auto get_block_op_ptr(IteratorT iter, [[maybe_unused]] Properties props) { if constexpr (AS == access::address_space::global_space) { return is_aligned ? reinterpret_cast(iter) : nullptr; } else if constexpr (AS == access::address_space::generic_space) { - return is_aligned - ? reinterpret_cast( - __SYCL_GenericCastToPtrExplicit_ToGlobal( - iter)) - : nullptr; + return is_aligned ? reinterpret_cast( + detail::dynamic_address_cast< + access::address_space::global_space>(iter)) + : nullptr; } else { return nullptr; } diff --git a/sycl/include/sycl/ext/oneapi/experimental/prefetch.hpp b/sycl/include/sycl/ext/oneapi/experimental/prefetch.hpp index 127d62450cb4c..c5be683830183 100644 --- a/sycl/include/sycl/ext/oneapi/experimental/prefetch.hpp +++ b/sycl/include/sycl/ext/oneapi/experimental/prefetch.hpp @@ -49,6 +49,8 @@ inline constexpr prefetch_hint_key::value_t prefetch_hint_L4_nt; namespace detail { +using namespace sycl::detail; + template <> struct IsCompileTimeProperty : std::true_type {}; template @@ -71,7 +73,10 @@ inline constexpr bool check_prefetch_acc_mode = template void prefetch_impl(T *ptr, size_t bytes, Properties properties) { #ifdef __SYCL_DEVICE_ONLY__ - auto *ptrGlobalAS = __SYCL_GenericCastToPtrExplicit_ToGlobal(ptr); + auto *ptrGlobalAS = + reinterpret_cast<__attribute__((opencl_global)) const char *>( + detail::static_address_cast( + const_cast(ptr))); const __attribute__((opencl_global)) char *ptrAnnotated = nullptr; if constexpr (!properties.template has_property()) { ptrAnnotated = __builtin_intel_sycl_ptr_annotation( diff --git a/sycl/include/sycl/group.hpp b/sycl/include/sycl/group.hpp index e5b16cce825d6..50b5fe6e586ad 100644 --- a/sycl/include/sycl/group.hpp +++ b/sycl/include/sycl/group.hpp @@ -449,12 +449,12 @@ template class __SYCL_TYPE(group) group { using QualSrcT = std::conditional_t, const uint8_t, uint8_t>; auto DestP = multi_ptr( - detail::cast_AS::pointer>( + reinterpret_cast::pointer>( Dest.get_decorated())); auto SrcP = multi_ptr( - detail::cast_AS::pointer>( + reinterpret_cast::pointer>( Src.get_decorated())); return async_work_group_copy(DestP, SrcP, NumElements, Stride); } @@ -478,12 +478,12 @@ template class __SYCL_TYPE(group) group { using QualSrcVecT = std::conditional_t, std::add_const_t, VecT>; auto DestP = multi_ptr( - detail::cast_AS< + reinterpret_cast< typename multi_ptr::pointer>( Dest.get_decorated())); auto SrcP = multi_ptr( - detail::cast_AS::pointer>( + reinterpret_cast::pointer>( Src.get_decorated())); return async_work_group_copy(DestP, SrcP, NumElements, Stride); } diff --git a/sycl/include/sycl/multi_ptr.hpp b/sycl/include/sycl/multi_ptr.hpp index e7d9bbcfbe7bd..9bca96ade3879 100644 --- a/sycl/include/sycl/multi_ptr.hpp +++ b/sycl/include/sycl/multi_ptr.hpp @@ -127,7 +127,7 @@ class __SYCL_TYPE(multi_ptr) multi_ptr { multi_ptr(accessor Accessor) - : multi_ptr(detail::cast_AS( + : multi_ptr(detail::static_address_cast( Accessor.template get_multi_ptr() .get_decorated())) {} @@ -198,7 +198,7 @@ class __SYCL_TYPE(multi_ptr) multi_ptr { multi_ptr(accessor, Dimensions, Mode, target::device, isPlaceholder, PropertyListT> Accessor) - : m_Pointer(detail::cast_AS( + : m_Pointer(detail::static_address_cast( Accessor.template get_multi_ptr() .get_decorated())) {} @@ -272,7 +272,7 @@ class __SYCL_TYPE(multi_ptr) multi_ptr { OtherSpace != access::address_space::constant_space>> multi_ptr & operator=(const multi_ptr &Other) { - m_Pointer = detail::cast_AS(Other.get_decorated()); + m_Pointer = detail::static_address_cast(Other.get_decorated()); return *this; } template < @@ -282,7 +282,7 @@ class __SYCL_TYPE(multi_ptr) multi_ptr { OtherSpace != access::address_space::constant_space>> multi_ptr & operator=(multi_ptr &&Other) { - m_Pointer = detail::cast_AS(std::move(Other.m_Pointer)); + m_Pointer = detail::static_address_cast(std::move(Other.m_Pointer)); return *this; } @@ -290,7 +290,10 @@ class __SYCL_TYPE(multi_ptr) multi_ptr { pointer operator->() const { return get(); } reference operator[](difference_type index) const { return m_Pointer[index]; } - pointer get() const { return detail::cast_AS(m_Pointer); } + pointer get() const { + return detail::static_address_cast< + is_decorated ? Space : access::address_space::generic_space>(m_Pointer); + } decorated_type *get_decorated() const { return m_Pointer; } std::add_pointer_t get_raw() const { return reinterpret_cast>(get()); @@ -312,9 +315,7 @@ class __SYCL_TYPE(multi_ptr) multi_ptr { explicit operator multi_ptr() const { return multi_ptr{ - detail::cast_AS::pointer>( - get_decorated())}; + detail::static_address_cast(get_decorated())}; } template () const { return multi_ptr{ - detail::cast_AS::pointer>( - get_decorated())}; + detail::static_address_cast(get_decorated())}; } template && !std::is_const_v>> operator multi_ptr() const { - return multi_ptr{detail::cast_AS< + return multi_ptr{static_cast< typename multi_ptr::pointer>( get_decorated())}; } @@ -353,17 +352,14 @@ class __SYCL_TYPE(multi_ptr) multi_ptr { std::is_same_v && std::is_const_v>> operator multi_ptr() const { - return multi_ptr{detail::cast_AS< + return multi_ptr{static_cast< typename multi_ptr::pointer>( get_decorated())}; } template operator multi_ptr() const { - return multi_ptr{ - detail::cast_AS::pointer>( - get_decorated())}; + return multi_ptr{get_decorated()}; } operator multi_ptr> explicit operator multi_ptr() const { - using global_pointer_t = - typename multi_ptr::pointer; return multi_ptr( - detail::cast_AS(get_decorated())); + detail::static_address_cast(get_decorated())); } // Only if Space == global_space @@ -487,7 +480,7 @@ class __SYCL_TYPE(multi_ptr) multi_ptr { multi_ptr(accessor Accessor) - : multi_ptr(detail::cast_AS( + : multi_ptr(detail::static_address_cast( Accessor.template get_multi_ptr() .get_decorated())) {} @@ -541,7 +534,10 @@ class __SYCL_TYPE(multi_ptr) multi_ptr { return *this; } - pointer get() const { return detail::cast_AS(m_Pointer); } + pointer get() const { + return detail::static_address_cast< + is_decorated ? Space : access::address_space::generic_space>(m_Pointer); + } // Conversion to the underlying pointer type __SYCL2020_DEPRECATED("Conversion to pointer type is deprecated since SYCL " @@ -553,8 +549,8 @@ class __SYCL_TYPE(multi_ptr) multi_ptr { typename = typename std::enable_if_t>> explicit operator multi_ptr() const { return multi_ptr{ - detail::cast_AS::pointer>( + static_cast::pointer>( m_Pointer)}; } @@ -579,11 +575,8 @@ class __SYCL_TYPE(multi_ptr) multi_ptr { Space == access::address_space::ext_intel_global_host_space)>> explicit operator multi_ptr() const { - using global_pointer_t = - typename multi_ptr::pointer; - return multi_ptr( - detail::cast_AS(m_Pointer)); + return multi_ptr{ + detail::static_address_cast(m_Pointer)}; } private: @@ -638,7 +631,7 @@ class __SYCL_TYPE(multi_ptr) multi_ptr { multi_ptr(accessor Accessor) - : multi_ptr(detail::cast_AS( + : multi_ptr(detail::static_address_cast( Accessor.template get_multi_ptr() .get_decorated())) {} @@ -692,7 +685,10 @@ class __SYCL_TYPE(multi_ptr) multi_ptr { return *this; } - pointer get() const { return detail::cast_AS(m_Pointer); } + pointer get() const { + return detail::static_address_cast< + is_decorated ? Space : access::address_space::generic_space>(m_Pointer); + } // Conversion to the underlying pointer type __SYCL2020_DEPRECATED("Conversion to pointer type is deprecated since SYCL " @@ -703,8 +699,8 @@ class __SYCL_TYPE(multi_ptr) multi_ptr { template explicit operator multi_ptr() const { return multi_ptr{ - detail::cast_AS::pointer>( + static_cast::pointer>( m_Pointer)}; } @@ -728,10 +724,8 @@ class __SYCL_TYPE(multi_ptr) multi_ptr { (Space == access::address_space::ext_intel_global_device_space || Space == access::address_space::ext_intel_global_host_space)>> explicit operator multi_ptr() const { - using global_pointer_t = - typename multi_ptr::pointer; return multi_ptr( - detail::cast_AS(m_Pointer)); + detail::static_address_cast(m_Pointer)); } private: @@ -782,14 +776,17 @@ class __SYCL2020_DEPRECATED( #endif multi_ptr(ElementType *pointer) - : m_Pointer(detail::cast_AS(pointer)) { + : m_Pointer(detail::dynamic_address_cast< + Space, /* SupressNotImplementedAssert = */ true>(pointer)) { // TODO An implementation should reject an argument if the deduced // address space is not compatible with Space. } #if defined(RESTRICT_WRITE_ACCESS_TO_CONSTANT_PTR) + // TODO: This isn't SFINAE, is it? How does this work? template > multi_ptr(const ElementType *pointer) - : m_Pointer(detail::cast_AS(pointer)) {} + : m_Pointer(detail::dynamic_address_cast< + Space, /* SupressNotImplementedAssert = */ true>(pointer)) {} #endif multi_ptr(std::nullptr_t) : m_Pointer(nullptr) {} @@ -816,7 +813,8 @@ class __SYCL2020_DEPRECATED( multi_ptr &operator=(ElementType *pointer) { // TODO An implementation should reject an argument if the deduced // address space is not compatible with Space. - m_Pointer = detail::cast_AS(pointer); + m_Pointer = detail::dynamic_address_cast< + Space, /* SupressNotImplementedAssert = */ true>(pointer); return *this; } @@ -858,7 +856,8 @@ class __SYCL2020_DEPRECATED( multi_ptr(accessor Accessor) - : multi_ptr(detail::cast_AS(Accessor.get_pointer().get())) {} + : multi_ptr( + detail::static_address_cast(Accessor.get_pointer().get())) {} // Only if Space == local_space || generic_space template < @@ -1112,14 +1111,19 @@ class __SYCL2020_DEPRECATED( typename RelayPointerT = pointer_t, typename = std::enable_if_t && !std::is_same_v>> - multi_ptr(void *pointer) : m_Pointer(detail::cast_AS(pointer)) { + multi_ptr(void *pointer) + : m_Pointer(detail::dynamic_address_cast< + Space, /* SupressNotImplementedAssert = */ true>(pointer)) { // TODO An implementation should reject an argument if the deduced // address space is not compatible with Space. } #if defined(RESTRICT_WRITE_ACCESS_TO_CONSTANT_PTR) template > multi_ptr(const void *pointer) - : m_Pointer(detail::cast_AS(pointer)) {} + : m_Pointer( + detail::dynamic_address_cast< + pointer_t, /* SupressNotImplementedAssert = */ true>(pointer)) { + } #endif #endif multi_ptr(std::nullptr_t) : m_Pointer(nullptr) {} @@ -1149,7 +1153,8 @@ class __SYCL2020_DEPRECATED( multi_ptr &operator=(void *pointer) { // TODO An implementation should reject an argument if the deduced // address space is not compatible with Space. - m_Pointer = detail::cast_AS(pointer); + m_Pointer = detail::dynamic_address_cast< + Space, /* SupressNotImplementedAssert = */ true>(pointer); return *this; } #endif @@ -1269,14 +1274,16 @@ class __SYCL2020_DEPRECATED( typename = std::enable_if_t && !std::is_same_v>> multi_ptr(const void *pointer) - : m_Pointer(detail::cast_AS(pointer)) { + : m_Pointer(detail::dynamic_address_cast< + Space, /* SupressNotImplementedAssert = */ true>(pointer)) { // TODO An implementation should reject an argument if the deduced // address space is not compatible with Space. } #if defined(RESTRICT_WRITE_ACCESS_TO_CONSTANT_PTR) template > multi_ptr(const void *pointer) - : m_Pointer(detail::cast_AS(pointer)) {} + : m_Pointer(detail::dynamic_address_cast< + Space, /* SupressNotImplementedAssert = */ true>(pointer)) {} #endif #endif multi_ptr(std::nullptr_t) : m_Pointer(nullptr) {} @@ -1306,7 +1313,8 @@ class __SYCL2020_DEPRECATED( multi_ptr &operator=(const void *pointer) { // TODO An implementation should reject an argument if the deduced // address space is not compatible with Space. - m_Pointer = detail::cast_AS(pointer); + m_Pointer = detail::dynamic_address_cast< + pointer_t, /* SupressNotImplementedAssert = */ true>(pointer); return *this; } #endif @@ -1434,8 +1442,8 @@ address_space_cast(ElementType *pointer) { // space is not compatible with Space. // Use LegacyPointerTypes here to also allow constant_space return multi_ptr( - detail::cast_AS< - typename detail::LegacyPointerTypes::pointer_t>( + detail::dynamic_address_cast( pointer)); } diff --git a/sycl/include/sycl/nd_item.hpp b/sycl/include/sycl/nd_item.hpp index 052596b46c424..3abd919a2a09a 100644 --- a/sycl/include/sycl/nd_item.hpp +++ b/sycl/include/sycl/nd_item.hpp @@ -384,12 +384,12 @@ template class nd_item { using QualSrcT = std::conditional_t, const uint8_t, uint8_t>; auto DestP = multi_ptr( - detail::cast_AS::pointer>( + reinterpret_cast::pointer>( Dest.get_decorated())); auto SrcP = multi_ptr( - detail::cast_AS::pointer>( + reinterpret_cast::pointer>( Src.get_decorated())); return async_work_group_copy(DestP, SrcP, NumElements, Stride); } @@ -413,12 +413,12 @@ template class nd_item { using QualSrcVecT = std::conditional_t, std::add_const_t, VecT>; auto DestP = multi_ptr( - detail::cast_AS< + reinterpret_cast< typename multi_ptr::pointer>( Dest.get_decorated())); auto SrcP = multi_ptr( - detail::cast_AS::pointer>( + reinterpret_cast::pointer>( Src.get_decorated())); return async_work_group_copy(DestP, SrcP, NumElements, Stride); } diff --git a/sycl/include/sycl/sub_group.hpp b/sycl/include/sycl/sub_group.hpp index d9e15d021063f..9f0cf4aa007f7 100644 --- a/sycl/include/sycl/sub_group.hpp +++ b/sycl/include/sycl/sub_group.hpp @@ -228,12 +228,14 @@ struct sub_group { #if defined(__NVPTX__) || defined(__AMDGCN__) return src[get_local_id()[0]]; #else // __NVPTX__ || __AMDGCN__ - auto l = __SYCL_GenericCastToPtrExplicit_ToLocal(src); - if (l) + if (auto l = + detail::dynamic_address_cast( + src)) return load(l); - auto g = __SYCL_GenericCastToPtrExplicit_ToGlobal(src); - if (g) + if (auto g = + detail::dynamic_address_cast( + src)) return load(g); // Sub-group load() is supported for local or global pointers only. @@ -418,14 +420,16 @@ struct sub_group { #if defined(__NVPTX__) || defined(__AMDGCN__) dst[get_local_id()[0]] = x; #else // __NVPTX__ || __AMDGCN__ - auto l = __SYCL_GenericCastToPtrExplicit_ToLocal(dst); - if (l) { + if (auto l = + detail::dynamic_address_cast( + dst)) { store(l, x); return; } - auto g = __SYCL_GenericCastToPtrExplicit_ToGlobal(dst); - if (g) { + if (auto g = + detail::dynamic_address_cast( + dst)) { store(g, x); return; } diff --git a/sycl/test/check_device_code/extensions/sub_group_as.cpp b/sycl/test/check_device_code/extensions/sub_group_as.cpp index 2e345b1fb3f66..022b64ad50554 100644 --- a/sycl/test/check_device_code/extensions/sub_group_as.cpp +++ b/sycl/test/check_device_code/extensions/sub_group_as.cpp @@ -1,7 +1,4 @@ -// RUN: %clangxx -fsycl-device-only -O3 -S -emit-llvm -Xclang -no-enable-noundef-analysis %s -o - | FileCheck %s --check-prefix CHECK-O3 -// RUN: %clangxx -fsycl-device-only -O0 -S -emit-llvm -Xclang -no-enable-noundef-analysis %s -o - | FileCheck %s --check-prefix CHECK-O0 -// Test compilation with -O3 when all methods are inlined in kernel function -// and -O0 when helper methods are preserved. +// RUN: %clangxx -fsycl-device-only -O3 -S -emit-llvm -Xclang -no-enable-noundef-analysis %s -o - | FileCheck %s #include #include #include @@ -38,49 +35,30 @@ SYCL_EXTERNAL void test(sycl::accessor(p); - // expected-error-re@sycl/ext/oneapi/experimental/address_cast.hpp:* {{{{.*}}Not supported yet!}} + // expected-error-re@sycl/access/access.hpp:* {{{{.*}}Not supported yet!}} std::ignore = dynamic_address_cast< sycl::access::address_space::ext_intel_global_host_space>(p); }