23 template <
typename ElementType, access::address_space Space>
28 access::decorated::yes>::pointer;
33 template <
typename ElementType>
36 ElementType, access::address_space::constant_space>::type;
42 template <
typename ElementType, access::address_space Space>
53 template <
typename ElementType>
55 access::address_space::constant_space> {
57 ElementType, access::address_space::constant_space>::type;
64 template <
typename dataT,
int dimensions,
access::mode accessMode,
66 typename PropertyListT>
80 using decorated_type =
84 static constexpr
bool is_decorated =
85 DecorateAddress == access::decorated::yes;
90 std::add_pointer_t<value_type>>;
92 std::add_lvalue_reference_t<value_type>>;
97 std::add_pointer_t<value_type>>::value);
99 std::add_lvalue_reference_t<value_type>>::value);
101 static_assert(DecorateAddress != access::decorated::legacy);
103 static_assert(
Space != access::address_space::constant_space,
104 "SYCL 2020 multi_ptr does not support the deprecated "
105 "constant_space address space.");
112 access::decorated::yes>::
pointer ptr)
122 RelaySpace ==
Space &&
123 (
Space == access::address_space::generic_space ||
124 Space == access::address_space::global_space ||
125 Space == access::address_space::ext_intel_global_device_space)>>
127 isPlaceholder, PropertyListT>
130 detail::cast_AS<decorated_type *>(Accessor.get_pointer().get())) {}
137 RelaySpace ==
Space &&
138 (
Space == access::address_space::generic_space ||
139 Space == access::address_space::local_space)>>
141 isPlaceholder, PropertyListT>
143 :
multi_ptr(Accessor.get_pointer().get()) {}
148 RelaySpace ==
Space &&
149 (
Space == access::address_space::generic_space ||
150 Space == access::address_space::local_space)>>
152 : m_Pointer(detail::cast_AS<decorated_type *>(Accessor.get_pointer())) {}
169 typename RelayElementType = ElementType,
172 (
Space == access::address_space::generic_space ||
173 Space == access::address_space::global_space ||
174 Space == access::address_space::ext_intel_global_device_space) &&
175 std::is_const<RelayElementType>::value &&
176 std::is_same<RelayElementType, ElementType>::value>>
179 Mode, access::target::device, isPlaceholder, PropertyListT>
182 detail::cast_AS<decorated_type *>(Accessor.get_pointer().get())) {}
188 typename RelayElementType = ElementType,
190 RelaySpace ==
Space &&
191 (
Space == access::address_space::generic_space ||
192 Space == access::address_space::local_space) &&
193 std::is_const<RelayElementType>::value &&
194 std::is_same<RelayElementType, ElementType>::value>>
197 Mode, access::target::local, isPlaceholder, PropertyListT>
199 :
multi_ptr(Accessor.get_pointer().get()) {}
203 typename RelayElementType = ElementType,
205 RelaySpace ==
Space &&
206 (
Space == access::address_space::generic_space ||
207 Space == access::address_space::local_space) &&
208 std::is_const<RelayElementType>::value &&
209 std::is_same<RelayElementType, ElementType>::value>>
213 : m_Pointer(detail::cast_AS<decorated_type *>(Accessor.get_pointer())) {}
226 OtherSpace != access::address_space::constant_space>>
229 m_Pointer = detail::cast_AS<decorated_type *>(Other.
get_decorated());
236 OtherSpace != access::address_space::constant_space>>
239 m_Pointer = detail::cast_AS<decorated_type *>(std::move(Other.m_Pointer));
247 pointer get()
const {
return detail::cast_AS<pointer>(m_Pointer); }
249 std::add_pointer_t<value_type>
get_raw()
const {
250 return reinterpret_cast<std::add_pointer_t<value_type>
>(
get());
254 "2020. Please use get() instead.")
261 RelaySpace ==
Space &&
262 RelaySpace == access::address_space::generic_space &&
263 (OtherSpace == access::address_space::private_space ||
264 OtherSpace == access::address_space::global_space ||
265 OtherSpace == access::address_space::local_space)>>
275 typename RelayElementType = ElementType,
278 std::is_same<RelayElementType, ElementType>::value &&
279 !std::is_const<RelayElementType>::value && RelaySpace ==
Space &&
280 RelaySpace == access::address_space::generic_space &&
281 (OtherSpace == access::address_space::private_space ||
282 OtherSpace == access::address_space::global_space ||
283 OtherSpace == access::address_space::local_space)>>
293 typename RelayElementType = ElementType,
295 std::is_same<RelayElementType, ElementType>::value &&
296 !std::is_const<RelayElementType>::value>>
304 typename RelayElementType = ElementType,
306 std::is_same<RelayElementType, ElementType>::value &&
307 std::is_const<RelayElementType>::value>>
314 template <access::decorated ConvIsDecorated>
336 RelaySpace ==
Space &&
337 GlobalSpace == access::address_space::global_space &&
338 (
Space == access::address_space::ext_intel_global_device_space ||
339 Space == access::address_space::ext_intel_global_host_space)>>
343 typename multi_ptr<ElementType, GlobalSpace,
346 detail::cast_AS<global_pointer_t>(get_decorated()));
353 _Space ==
Space &&
Space == access::address_space::global_space>>
355 size_t NumBytes = NumElements *
sizeof(ElementType);
395 decorated_type *m_Pointer;
399 template <access::address_space Space, access::decorated DecorateAddress>
402 using decorated_type =
406 static constexpr
bool is_decorated =
407 DecorateAddress == access::decorated::yes;
412 std::add_pointer_t<value_type>>;
416 std::add_pointer_t<value_type>>::value);
418 static_assert(DecorateAddress != access::decorated::legacy);
420 static_assert(
Space != access::address_space::constant_space,
421 "SYCL 2020 multi_ptr does not support the deprecated "
422 "constant_space address space.");
429 access::decorated::yes>::
pointer ptr)
440 RelaySpace ==
Space &&
441 (
Space == access::address_space::global_space ||
442 Space == access::address_space::ext_intel_global_device_space)>>
444 isPlaceholder, PropertyListT>
447 detail::cast_AS<decorated_type *>(Accessor.get_pointer().get())) {}
455 RelaySpace ==
Space &&
Space == access::address_space::local_space>>
457 isPlaceholder, PropertyListT>
466 RelaySpace ==
Space &&
Space == access::address_space::local_space>>
468 : m_Pointer(detail::
cast_AS<decorated_type *>(Accessor.get_pointer())) {}
478 pointer get()
const {
return detail::cast_AS<pointer>(m_Pointer); }
485 std::is_const<ElementType>::value>>
508 RelaySpace ==
Space &&
509 GlobalSpace == access::address_space::global_space &&
510 (
Space == access::address_space::ext_intel_global_device_space ||
511 Space == access::address_space::ext_intel_global_host_space)>>
515 typename multi_ptr<
const void, GlobalSpace,
518 detail::cast_AS<global_pointer_t>(m_Pointer));
522 decorated_type *m_Pointer;
526 template <access::address_space Space, access::decorated DecorateAddress>
532 static constexpr
bool is_decorated =
533 DecorateAddress == access::decorated::yes;
538 std::add_pointer_t<value_type>>;
542 std::add_pointer_t<value_type>>::value);
544 static_assert(DecorateAddress != access::decorated::legacy);
546 static_assert(
Space != access::address_space::constant_space,
547 "SYCL 2020 multi_ptr does not support the deprecated "
548 "constant_space address space.");
566 RelaySpace ==
Space &&
567 (
Space == access::address_space::global_space ||
568 Space == access::address_space::ext_intel_global_device_space)>>
570 isPlaceholder, PropertyListT>
573 detail::cast_AS<decorated_type *>(Accessor.get_pointer().get())) {}
581 RelaySpace ==
Space &&
Space == access::address_space::local_space>>
583 isPlaceholder, PropertyListT>
592 RelaySpace ==
Space &&
Space == access::address_space::local_space>>
594 : m_Pointer(detail::
cast_AS<decorated_type *>(Accessor.get_pointer())) {}
604 pointer get()
const {
return detail::cast_AS<pointer>(m_Pointer); }
610 template <
typename ElementType>
633 RelaySpace ==
Space &&
634 GlobalSpace == access::address_space::global_space &&
635 (
Space == access::address_space::ext_intel_global_device_space ||
636 Space == access::address_space::ext_intel_global_host_space)>>
641 detail::cast_AS<global_pointer_t>(m_Pointer));
645 decorated_type *m_Pointer;
650 template <
typename ElementType, access::address_space Space>
677 #ifdef __SYCL_DEVICE_ONLY__
684 _Space ==
Space &&
Space != access::address_space::generic_space>>
685 multi_ptr(pointer_t pointer) : m_Pointer(pointer) {}
693 #if defined(RESTRICT_WRITE_ACCESS_TO_CONSTANT_PTR)
694 template <
typename =
typename detail::const_if_const_AS<Space, ElementType>>
696 : m_Pointer(detail::
cast_AS<pointer_t>(pointer)) {}
706 #ifdef __SYCL_DEVICE_ONLY__
713 _Space ==
Space &&
Space != access::address_space::generic_space>>
723 m_Pointer = detail::cast_AS<pointer_t>(pointer);
737 return *
reinterpret_cast<ReturnPtr>(m_Pointer);
741 return reinterpret_cast<ReturnPtr>(m_Pointer);
745 return reinterpret_cast<ReturnPtr>(m_Pointer)[index];
749 return reinterpret_cast<ReturnPtr>(m_Pointer)[index];
759 (
Space == access::address_space::generic_space ||
760 Space == access::address_space::global_space ||
761 Space == access::address_space::ext_intel_global_device_space)>>
763 isPlaceholder, PropertyListT>
765 m_Pointer = detail::cast_AS<pointer_t>(Accessor.get_pointer().get());
773 _Space ==
Space && (
Space == access::address_space::generic_space ||
774 Space == access::address_space::local_space)>>
776 isPlaceholder, PropertyListT>
781 template <
int dimensions>
790 _Space ==
Space &&
Space == access::address_space::constant_space>>
792 accessor<ElementType, dimensions, Mode, access::target::constant_buffer,
793 isPlaceholder, PropertyListT>
813 typename ET = ElementType,
816 (
Space == access::address_space::generic_space ||
817 Space == access::address_space::global_space ||
818 Space == access::address_space::ext_intel_global_device_space) &&
819 std::is_const<ET>::value && std::is_same<ET, ElementType>::value>>
821 access::target::device, isPlaceholder, PropertyListT>
829 typename ET = ElementType,
832 (
Space == access::address_space::generic_space ||
833 Space == access::address_space::local_space) &&
834 std::is_const<ET>::value && std::is_same<ET, ElementType>::value>>
836 access::target::local, isPlaceholder, PropertyListT>
843 typename ET = ElementType,
846 (
Space == access::address_space::generic_space ||
847 Space == access::address_space::local_space) &&
848 std::is_const<ET>::value && std::is_same<ET, ElementType>::value>>
851 : m_Pointer(detail::cast_AS<pointer_t>(Accessor.get_pointer())) {}
857 typename ET = ElementType,
859 _Space ==
Space &&
Space == access::address_space::constant_space &&
860 std::is_const<ET>::value && std::is_same<ET, ElementType>::value>>
863 access::target::constant_buffer, isPlaceholder, PropertyListT>
875 template <
typename ET = ElementType>
877 std::is_const<ET>::value && std::is_same<ET, ElementType>::value,
879 access::decorated::legacy>> &ETP)
880 : m_Pointer(ETP.
get()) {}
890 template <
typename ET = ElementType>
893 !std::is_const<ET>::value,
895 Space, access::decorated::legacy>()
const {
898 reinterpret_cast<ptr_t
>(m_Pointer));
903 template <
typename ET = ElementType>
906 std::is_const<ET>::value,
908 Space, access::decorated::legacy>()
const {
911 reinterpret_cast<ptr_t
>(m_Pointer));
921 reinterpret_cast<ptr_t
>(m_Pointer));
958 #ifdef __ENABLE_USM_ADDR_SPACE__
966 (
Space == access::address_space::ext_intel_global_device_space ||
967 Space == access::address_space::ext_intel_global_host_space)>>
968 explicit operator multi_ptr<ElementType, access::address_space::global_space,
969 access::decorated::legacy>()
const {
971 ElementType, access::address_space::global_space>::type *;
972 return multi_ptr<ElementType, access::address_space::global_space,
973 access::decorated::legacy>(
976 #endif // __ENABLE_USM_ADDR_SPACE__
982 _Space ==
Space &&
Space == access::address_space::global_space>>
984 size_t NumBytes = NumElements *
sizeof(ElementType);
995 template <access::address_space Space>
1014 #ifdef __SYCL_DEVICE_ONLY__
1015 multi_ptr(
void *pointer) : m_Pointer(detail::
cast_AS<pointer_t>(pointer)) {
1019 #if defined(RESTRICT_WRITE_ACCESS_TO_CONSTANT_PTR)
1020 template <
typename =
typename detail::const_if_const_AS<Space,
void>>
1021 multi_ptr(
const void *pointer)
1022 : m_Pointer(detail::
cast_AS<pointer_t>(pointer)) {}
1033 template <
typename ElementType>
1035 : m_Pointer(ETP.
get()) {}
1041 m_Pointer = pointer;
1044 #ifdef __SYCL_DEVICE_ONLY__
1048 m_Pointer = detail::cast_AS<pointer_t>(pointer);
1053 m_Pointer =
nullptr;
1060 typename ElementType,
int dimensions,
access::mode Mode,
1064 (
Space == access::address_space::generic_space ||
1065 Space == access::address_space::global_space ||
1066 Space == access::address_space::ext_intel_global_device_space)>>
1068 access::placeholder::false_t, PropertyListT>
1074 typename ElementType,
int dimensions,
access::mode Mode,
1077 _Space ==
Space && (
Space == access::address_space::generic_space ||
1078 Space == access::address_space::local_space)>>
1080 access::placeholder::false_t, PropertyListT>
1086 typename ElementType,
int dimensions,
1089 _Space ==
Space && (
Space == access::address_space::generic_space ||
1090 Space == access::address_space::local_space)>>
1092 : m_Pointer(detail::cast_AS<pointer_t>(Accessor.get_pointer())) {}
1096 typename ElementType,
int dimensions,
access::mode Mode,
1099 _Space ==
Space &&
Space == access::address_space::constant_space>>
1101 accessor<ElementType, dimensions, Mode, access::target::constant_buffer,
1102 access::placeholder::false_t, PropertyListT>
1114 template <
typename ElementType>
1117 using elem_pointer_t =
1120 static_cast<elem_pointer_t
>(m_Pointer));
1127 reinterpret_cast<ptr_t
>(m_Pointer));
1131 pointer_t m_Pointer;
1136 template <access::address_space Space>
1156 #ifdef __SYCL_DEVICE_ONLY__
1158 : m_Pointer(detail::
cast_AS<pointer_t>(pointer)) {
1162 #if defined(RESTRICT_WRITE_ACCESS_TO_CONSTANT_PTR)
1163 template <
typename =
typename detail::const_if_const_AS<Space,
void>>
1164 multi_ptr(
const void *pointer)
1165 : m_Pointer(detail::
cast_AS<pointer_t>(pointer)) {}
1176 template <
typename ElementType>
1178 : m_Pointer(ETP.
get()) {}
1184 m_Pointer = pointer;
1187 #ifdef __SYCL_DEVICE_ONLY__
1191 m_Pointer = detail::cast_AS<pointer_t>(pointer);
1196 m_Pointer =
nullptr;
1203 typename ElementType,
int dimensions,
access::mode Mode,
1207 (
Space == access::address_space::generic_space ||
1208 Space == access::address_space::global_space ||
1209 Space == access::address_space::ext_intel_global_device_space)>>
1211 access::placeholder::false_t, PropertyListT>
1217 typename ElementType,
int dimensions,
access::mode Mode,
1220 _Space ==
Space && (
Space == access::address_space::generic_space ||
1221 Space == access::address_space::local_space)>>
1223 access::placeholder::false_t, PropertyListT>
1229 typename ElementType,
int dimensions,
1232 _Space ==
Space && (
Space == access::address_space::generic_space ||
1233 Space == access::address_space::local_space)>>
1235 : m_Pointer(detail::cast_AS<pointer_t>(Accessor.get_pointer())) {}
1239 typename ElementType,
int dimensions,
access::mode Mode,
1242 _Space ==
Space &&
Space == access::address_space::constant_space>>
1244 accessor<ElementType, dimensions, Mode, access::target::constant_buffer,
1245 access::placeholder::false_t, PropertyListT>
1253 operator const void *()
const {
1254 return reinterpret_cast<const void *
>(m_Pointer);
1261 template <
typename ElementType>
1265 using elem_pointer_t =
1268 static_cast<elem_pointer_t
>(m_Pointer));
1272 pointer_t m_Pointer;
1275 #ifdef __cpp_deduction_guides
1277 typename PropertyListT,
class T>
1278 multi_ptr(accessor<T, dimensions, Mode, access::target::device, isPlaceholder,
1280 -> multi_ptr<T, access::address_space::global_space, access::decorated::no>;
1282 typename PropertyListT,
class T>
1283 multi_ptr(accessor<T, dimensions, Mode, access::target::constant_buffer,
1284 isPlaceholder, PropertyListT>)
1285 -> multi_ptr<T, access::address_space::constant_space,
1286 access::decorated::legacy>;
1288 typename PropertyListT,
class T>
1289 multi_ptr(accessor<T, dimensions, Mode, access::target::local, isPlaceholder,
1291 -> multi_ptr<T, access::address_space::local_space, access::decorated::no>;
1292 template <
int dimensions,
class T>
1293 multi_ptr(local_accessor<T, dimensions>)
1294 -> multi_ptr<T, access::address_space::local_space, access::decorated::no>;
1298 typename ElementType>
1299 multi_ptr<ElementType, Space, DecorateAddress>
1313 typename = std::enable_if<DecorateAddress == access::decorated::legacy>>
1315 "address_space_cast instead.")
1317 typename
multi_ptr<ElementType,
Space, DecorateAddress>::pointer_t
1325 typename = std::enable_if<DecorateAddress != access::decorated::legacy>>
1327 "address_space_cast instead.")
1329 typename
multi_ptr<ElementType,
Space, DecorateAddress>::pointer pointer) {
1330 return address_space_cast<Space, DecorateAddress>(pointer);
1333 #ifdef __SYCL_DEVICE_ONLY__
1340 "address_space_cast instead.")
1341 multi_ptr<ElementType,
Space, DecorateAddress>
make_ptr(ElementType *pointer) {
1342 return address_space_cast<Space, DecorateAddress>(pointer);
1344 #if defined(RESTRICT_WRITE_ACCESS_TO_CONSTANT_PTR)
1347 typename =
typename detail::const_if_const_AS<Space, ElementType>>
1349 "address_space_cast instead.")
1351 const ElementType *pointer) {
1352 return multi_ptr<ElementType, Space, DecorateAddress>(pointer);
1354 #endif // RESTRICT_WRITE_ACCESS_TO_CONSTANT_PTR
1355 #endif // // __SYCL_DEVICE_ONLY__
1361 return lhs.
get() == rhs.
get();
1368 return lhs.
get() != rhs.
get();
1375 return lhs.
get() < rhs.
get();
1382 return lhs.
get() > rhs.
get();
1389 return lhs.
get() <= rhs.
get();
1396 return lhs.
get() >= rhs.
get();
1403 return lhs.
get() !=
nullptr;
1410 return rhs.
get() !=
nullptr;
1417 return lhs.
get() ==
nullptr;
1424 return rhs.
get() ==
nullptr;
1431 return lhs.
get() !=
nullptr;
1452 return rhs.
get() !=
nullptr;
1466 return rhs.
get() ==
nullptr;
1473 return lhs.
get() ==
nullptr;