20 template <
typename dataT,
int dimensions,
access::mode accessMode,
22 typename PropertyListT>
29 template <
typename ElementType, access::address_space Space>
class multi_ptr {
32 detail::conditional_t<std::is_same<ElementType, half>::value,
53 #ifdef __SYCL_DEVICE_ONLY__
60 _Space == Space && Space != access::address_space::generic_space>>
61 multi_ptr(pointer_t pointer) : m_Pointer(pointer) {}
68 #if defined(RESTRICT_WRITE_ACCESS_TO_CONSTANT_PTR)
69 template <
typename =
typename detail::const_if_const_AS<Space, ElementType>>
70 multi_ptr(
const ElementType *pointer) : m_Pointer((pointer_t)(pointer)) {}
80 #ifdef __SYCL_DEVICE_ONLY__
87 _Space == Space && Space != access::address_space::generic_space>>
111 return *
reinterpret_cast<ReturnPtr>(m_Pointer);
115 return reinterpret_cast<ReturnPtr>(m_Pointer);
119 return reinterpret_cast<ReturnPtr>(m_Pointer)[index];
123 return reinterpret_cast<ReturnPtr>(m_Pointer)[index];
133 (Space == access::address_space::generic_space ||
134 Space == access::address_space::global_space ||
135 Space == access::address_space::ext_intel_global_device_space)>>
137 isPlaceholder, PropertyListT>
139 m_Pointer = (
pointer_t)(Accessor.get_pointer().get());
147 _Space == Space && (Space == access::address_space::generic_space ||
148 Space == access::address_space::local_space)>>
150 isPlaceholder, PropertyListT>
159 _Space == Space && Space == access::address_space::constant_space>>
161 accessor<ElementType, dimensions, Mode, access::target::constant_buffer,
162 isPlaceholder, PropertyListT>
180 typename ET = ElementType,
183 (Space == access::address_space::generic_space ||
184 Space == access::address_space::global_space ||
185 Space == access::address_space::ext_intel_global_device_space) &&
186 std::is_const<ET>::value && std::is_same<ET, ElementType>::value>>
196 typename ET = ElementType,
199 (Space == access::address_space::generic_space ||
200 Space == access::address_space::local_space) &&
201 std::is_const<ET>::value && std::is_same<ET, ElementType>::value>>
203 access::target::local, isPlaceholder, PropertyListT>
211 typename ET = ElementType,
213 _Space == Space && Space == access::address_space::constant_space &&
214 std::is_const<ET>::value && std::is_same<ET, ElementType>::value>>
217 access::target::constant_buffer, isPlaceholder, PropertyListT>
227 template <
typename ET = ElementType>
229 std::is_const<ET>::value && std::is_same<ET, ElementType>::value,
231 : m_Pointer(ETP.
get()) {}
241 template <
typename ET = ElementType>
244 !std::is_const<ET>::value,
253 template <
typename ET = ElementType>
256 std::is_const<ET>::value,
268 reinterpret_cast<ptr_t
>(m_Pointer));
305 #ifdef __ENABLE_USM_ADDR_SPACE__
313 (Space == access::address_space::ext_intel_global_device_space ||
314 Space == access::address_space::ext_intel_global_host_space)>>
318 ElementType, access::address_space::global_space>::type *;
320 reinterpret_cast<global_pointer_t
>(m_Pointer));
322 #endif // __ENABLE_USM_ADDR_SPACE__
328 _Space == Space && Space == access::address_space::global_space>>
330 size_t NumBytes = NumElements *
sizeof(ElementType);
340 template <access::address_space Space>
class multi_ptr<void, Space> {
358 #ifdef __SYCL_DEVICE_ONLY__
359 multi_ptr(
void *pointer) : m_Pointer((pointer_t)pointer) {
363 #if defined(RESTRICT_WRITE_ACCESS_TO_CONSTANT_PTR)
364 template <
typename =
typename detail::const_if_const_AS<Space,
void>>
365 multi_ptr(
const void *pointer) : m_Pointer((pointer_t)(pointer)) {}
375 template <
typename ElementType>
385 #ifdef __SYCL_DEVICE_ONLY__
389 m_Pointer = (pointer_t)pointer;
401 typename ElementType,
int dimensions,
access::mode Mode,
405 (Space == access::address_space::generic_space ||
406 Space == access::address_space::global_space ||
407 Space == access::address_space::ext_intel_global_device_space)>>
409 access::placeholder::false_t, PropertyListT>
415 typename ElementType,
int dimensions,
access::mode Mode,
418 _Space == Space && (Space == access::address_space::generic_space ||
419 Space == access::address_space::local_space)>>
421 access::placeholder::false_t, PropertyListT>
427 typename ElementType,
int dimensions,
access::mode Mode,
430 _Space == Space && Space == access::address_space::constant_space>>
432 accessor<ElementType, dimensions, Mode, access::target::constant_buffer,
433 access::placeholder::false_t, PropertyListT>
445 template <
typename ElementType>
447 using elem_pointer_t =
450 static_cast<elem_pointer_t
>(m_Pointer));
464 template <access::address_space Space>
483 #ifdef __SYCL_DEVICE_ONLY__
484 multi_ptr(
const void *pointer) : m_Pointer((pointer_t)pointer) {
488 #if defined(RESTRICT_WRITE_ACCESS_TO_CONSTANT_PTR)
489 template <
typename =
typename detail::const_if_const_AS<Space,
void>>
490 multi_ptr(
const void *pointer) : m_Pointer((pointer_t)(pointer)) {}
500 template <
typename ElementType>
510 #ifdef __SYCL_DEVICE_ONLY__
511 multi_ptr &operator=(
const void *pointer) {
514 m_Pointer = (pointer_t)pointer;
526 typename ElementType,
int dimensions,
access::mode Mode,
530 (Space == access::address_space::generic_space ||
531 Space == access::address_space::global_space ||
532 Space == access::address_space::ext_intel_global_device_space)>>
534 access::placeholder::false_t, PropertyListT>
540 typename ElementType,
int dimensions,
access::mode Mode,
543 _Space == Space && (Space == access::address_space::generic_space ||
544 Space == access::address_space::local_space)>>
546 access::placeholder::false_t, PropertyListT>
552 typename ElementType,
int dimensions,
access::mode Mode,
555 _Space == Space && Space == access::address_space::constant_space>>
557 accessor<ElementType, dimensions, Mode, access::target::constant_buffer,
558 access::placeholder::false_t, PropertyListT>
566 operator const void*()
const {
567 return reinterpret_cast<const void *
>(m_Pointer);
573 template <
typename ElementType>
575 using elem_pointer_t =
578 static_cast<elem_pointer_t
>(m_Pointer));
585 #ifdef __cpp_deduction_guides
587 typename PropertyListT,
class T>
590 -> multi_ptr<T, access::address_space::global_space>;
592 typename PropertyListT,
class T>
593 multi_ptr(accessor<T, dimensions, Mode, access::target::constant_buffer,
594 isPlaceholder, PropertyListT>)
595 ->multi_ptr<T, access::address_space::constant_space>;
597 typename PropertyListT,
class T>
598 multi_ptr(accessor<T, dimensions, Mode, access::target::local, isPlaceholder,
600 ->multi_ptr<T, access::address_space::local_space>;
603 template <
typename ElementType, access::address_space Space>
604 multi_ptr<ElementType, Space>
609 #ifdef __SYCL_DEVICE_ONLY__
613 template <
typename ElementType, access::address_space Space>
614 multi_ptr<ElementType, Space>
make_ptr(ElementType *pointer) {
615 return multi_ptr<ElementType, Space>(pointer);
617 #if defined(RESTRICT_WRITE_ACCESS_TO_CONSTANT_PTR)
619 typename =
typename detail::const_if_const_AS<Space, ElementType>>
620 multi_ptr<ElementType, Space>
make_ptr(
const ElementType *pointer) {
621 return multi_ptr<ElementType, Space>(pointer);
623 #endif // RESTRICT_WRITE_ACCESS_TO_CONSTANT_PTR
624 #endif // // __SYCL_DEVICE_ONLY__
626 template <
typename ElementType, access::address_space Space>
629 return lhs.get() == rhs.get();
632 template <
typename ElementType, access::address_space Space>
635 return lhs.get() != rhs.get();
638 template <
typename ElementType, access::address_space Space>
641 return lhs.get() < rhs.get();
644 template <
typename ElementType, access::address_space Space>
647 return lhs.get() > rhs.get();
650 template <
typename ElementType, access::address_space Space>
653 return lhs.get() <= rhs.get();
656 template <
typename ElementType, access::address_space Space>
659 return lhs.get() >= rhs.get();
662 template <
typename ElementType, access::address_space Space>
664 return lhs.get() !=
nullptr;
667 template <
typename ElementType, access::address_space Space>
669 return rhs.get() !=
nullptr;
672 template <
typename ElementType, access::address_space Space>
674 return lhs.get() ==
nullptr;
677 template <
typename ElementType, access::address_space Space>
679 return rhs.get() ==
nullptr;
682 template <
typename ElementType, access::address_space Space>
684 return lhs.get() !=
nullptr;
687 template <
typename ElementType, access::address_space Space>
692 template <
typename ElementType, access::address_space Space>
697 template <
typename ElementType, access::address_space Space>
699 return rhs.get() !=
nullptr;
702 template <
typename ElementType, access::address_space Space>
707 template <
typename ElementType, access::address_space Space>
709 return rhs.get() ==
nullptr;
712 template <
typename ElementType, access::address_space Space>
714 return lhs.get() ==
nullptr;
717 template <
typename ElementType, access::address_space Space>
719 return rhs.get() ==
nullptr;