@@ -51,6 +51,13 @@ template <typename ElementType, access::address_space Space> class multi_ptr {
5151 multi_ptr (const multi_ptr &rhs) = default ;
5252 multi_ptr (multi_ptr &&) = default ;
5353#ifdef __SYCL_DEVICE_ONLY__
54+ // The generic address space have no corresponding 'opencl_...' attribute and
55+ // this constructor is considered as a duplicate for the
56+ // multi_ptr(ElementType *pointer) one, so the check is required.
57+ template <
58+ access::address_space _Space = Space,
59+ typename = typename detail::enable_if_t <
60+ _Space == Space && Space != access::address_space::generic_space>>
5461 multi_ptr (pointer_t pointer) : m_Pointer(pointer) {}
5562#endif
5663
@@ -71,6 +78,13 @@ template <typename ElementType, access::address_space Space> class multi_ptr {
7178 multi_ptr &operator =(multi_ptr &&) = default ;
7279
7380#ifdef __SYCL_DEVICE_ONLY__
81+ // The generic address space have no corresponding 'opencl_...' attribute and
82+ // this operator is considered as a duplicate for the
83+ // multi_ptr &operator=(ElementType *pointer) one, so the check is required.
84+ template <
85+ access::address_space _Space = Space,
86+ typename = typename detail::enable_if_t <
87+ _Space == Space && Space != access::address_space::generic_space>>
7488 multi_ptr &operator =(pointer_t pointer) {
7589 m_Pointer = pointer;
7690 return *this ;
@@ -109,26 +123,28 @@ template <typename ElementType, access::address_space Space> class multi_ptr {
109123 return reinterpret_cast <ReturnPtr>(m_Pointer)[index];
110124 }
111125
112- // Only if Space == global_space || global_device_space
126+ // Only if Space == global_space || global_device_space || generic_space
113127 template <int dimensions, access::mode Mode,
114128 access::placeholder isPlaceholder, typename PropertyListT,
115129 access::address_space _Space = Space,
116130 typename = typename detail::enable_if_t <
117131 _Space == Space &&
118- (Space == access::address_space::global_space ||
132+ (Space == access::address_space::generic_space ||
133+ Space == access::address_space::global_space ||
119134 Space == access::address_space::global_device_space)>>
120135 multi_ptr (accessor<ElementType, dimensions, Mode, access::target::device,
121136 isPlaceholder, PropertyListT>
122137 Accessor) {
123138 m_Pointer = (pointer_t )(Accessor.get_pointer ().get ());
124139 }
125140
126- // Only if Space == local_space
127- template <int dimensions, access::mode Mode,
128- access::placeholder isPlaceholder, typename PropertyListT,
129- access::address_space _Space = Space,
130- typename = typename detail::enable_if_t <
131- _Space == Space && Space == access::address_space::local_space>>
141+ // Only if Space == local_space || generic_space
142+ template <
143+ int dimensions, access::mode Mode, access::placeholder isPlaceholder,
144+ typename PropertyListT, access::address_space _Space = Space,
145+ typename = typename detail::enable_if_t <
146+ _Space == Space && (Space == access::address_space::generic_space ||
147+ Space == access::address_space::local_space)>>
132148 multi_ptr (accessor<ElementType, dimensions, Mode, access::target::local,
133149 isPlaceholder, PropertyListT>
134150 Accessor)
@@ -154,29 +170,32 @@ template <typename ElementType, access::address_space Space> class multi_ptr {
154170 // 2. from multi_ptr<ElementType, Space> to multi_ptr<const ElementType,
155171 // Space>
156172
157- // Only if Space == global_space || global_device_space and element type is
158- // const
173+ // Only if Space == global_space || global_device_space || generic_space and
174+ // element type is const
159175 template <
160176 int dimensions, access::mode Mode, access::placeholder isPlaceholder,
161177 typename PropertyListT, access::address_space _Space = Space,
162178 typename ET = ElementType,
163179 typename = typename detail::enable_if_t <
164180 _Space == Space &&
165- (Space == access::address_space::global_space ||
181+ (Space == access::address_space::generic_space ||
182+ Space == access::address_space::global_space ||
166183 Space == access::address_space::global_device_space) &&
167184 std::is_const<ET>::value && std::is_same<ET, ElementType>::value>>
168185 multi_ptr (accessor<typename detail::remove_const_t <ET>, dimensions, Mode,
169186 access::target::device, isPlaceholder, PropertyListT>
170187 Accessor)
171188 : multi_ptr(Accessor.get_pointer()) {}
172189
173- // Only if Space == local_space and element type is const
190+ // Only if Space == local_space || generic_space and element type is const
174191 template <
175192 int dimensions, access::mode Mode, access::placeholder isPlaceholder,
176193 typename PropertyListT, access::address_space _Space = Space,
177194 typename ET = ElementType,
178195 typename = typename detail::enable_if_t <
179- _Space == Space && Space == access::address_space::local_space &&
196+ _Space == Space &&
197+ (Space == access::address_space::generic_space ||
198+ Space == access::address_space::local_space) &&
180199 std::is_const<ET>::value && std::is_same<ET, ElementType>::value>>
181200 multi_ptr (accessor<typename detail::remove_const_t <ET>, dimensions, Mode,
182201 access::target::local, isPlaceholder, PropertyListT>
@@ -373,23 +392,26 @@ template <access::address_space Space> class multi_ptr<void, Space> {
373392 return *this ;
374393 }
375394
376- // Only if Space == global_space || global_device_space
395+ // Only if Space == global_space || global_device_space || generic_space
377396 template <typename ElementType, int dimensions, access::mode Mode,
378397 typename PropertyListT, access::address_space _Space = Space,
379398 typename = typename detail::enable_if_t <
380399 _Space == Space &&
381- (Space == access::address_space::global_space ||
400+ (Space == access::address_space::generic_space ||
401+ Space == access::address_space::global_space ||
382402 Space == access::address_space::global_device_space)>>
383403 multi_ptr (accessor<ElementType, dimensions, Mode, access::target::device,
384404 access::placeholder::false_t , PropertyListT>
385405 Accessor)
386406 : multi_ptr(Accessor.get_pointer()) {}
387407
388- // Only if Space == local_space
389- template <typename ElementType, int dimensions, access::mode Mode,
390- typename PropertyListT, access::address_space _Space = Space,
391- typename = typename detail::enable_if_t <
392- _Space == Space && Space == access::address_space::local_space>>
408+ // Only if Space == local_space || generic_space
409+ template <
410+ typename ElementType, int dimensions, access::mode Mode,
411+ typename PropertyListT, access::address_space _Space = Space,
412+ typename = typename detail::enable_if_t <
413+ _Space == Space && (Space == access::address_space::generic_space ||
414+ Space == access::address_space::local_space)>>
393415 multi_ptr (accessor<ElementType, dimensions, Mode, access::target::local,
394416 access::placeholder::false_t , PropertyListT>
395417 Accessor)
@@ -493,23 +515,26 @@ class multi_ptr<const void, Space> {
493515 return *this ;
494516 }
495517
496- // Only if Space == global_space || global_device_space
518+ // Only if Space == global_space || global_device_space || generic_space
497519 template <typename ElementType, int dimensions, access::mode Mode,
498520 typename PropertyListT, access::address_space _Space = Space,
499521 typename = typename detail::enable_if_t <
500522 _Space == Space &&
501- (Space == access::address_space::global_space ||
523+ (Space == access::address_space::generic_space ||
524+ Space == access::address_space::global_space ||
502525 Space == access::address_space::global_device_space)>>
503526 multi_ptr (accessor<ElementType, dimensions, Mode, access::target::device,
504527 access::placeholder::false_t , PropertyListT>
505528 Accessor)
506529 : multi_ptr(Accessor.get_pointer()) {}
507530
508- // Only if Space == local_space
509- template <typename ElementType, int dimensions, access::mode Mode,
510- typename PropertyListT, access::address_space _Space = Space,
511- typename = typename detail::enable_if_t <
512- _Space == Space && Space == access::address_space::local_space>>
531+ // Only if Space == local_space || generic_space
532+ template <
533+ typename ElementType, int dimensions, access::mode Mode,
534+ typename PropertyListT, access::address_space _Space = Space,
535+ typename = typename detail::enable_if_t <
536+ _Space == Space && (Space == access::address_space::generic_space ||
537+ Space == access::address_space::local_space)>>
513538 multi_ptr (accessor<ElementType, dimensions, Mode, access::target::local,
514539 access::placeholder::false_t , PropertyListT>
515540 Accessor)
0 commit comments