@@ -51,6 +51,13 @@ template <typename ElementType, access::address_space Space> class multi_ptr {
51
51
multi_ptr (const multi_ptr &rhs) = default ;
52
52
multi_ptr (multi_ptr &&) = default ;
53
53
#ifdef __SYCL_DEVICE_ONLY__
54
+ // The attribute opencl_generic used for the generic address space generates
55
+ // nothing and 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>>
54
61
multi_ptr (pointer_t pointer) : m_Pointer(pointer) {}
55
62
#endif
56
63
@@ -71,6 +78,13 @@ template <typename ElementType, access::address_space Space> class multi_ptr {
71
78
multi_ptr &operator =(multi_ptr &&) = default ;
72
79
73
80
#ifdef __SYCL_DEVICE_ONLY__
81
+ // The attribute opencl_generic used for the generic address space generates
82
+ // nothing and 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>>
74
88
multi_ptr &operator =(pointer_t pointer) {
75
89
m_Pointer = pointer;
76
90
return *this ;
@@ -109,26 +123,28 @@ template <typename ElementType, access::address_space Space> class multi_ptr {
109
123
return reinterpret_cast <ReturnPtr>(m_Pointer)[index];
110
124
}
111
125
112
- // Only if Space == global_space || global_device_space
126
+ // Only if Space == global_space || global_device_space || generic_space
113
127
template <int dimensions, access::mode Mode,
114
128
access::placeholder isPlaceholder, typename PropertyListT,
115
129
access::address_space _Space = Space,
116
130
typename = typename detail::enable_if_t <
117
131
_Space == Space &&
118
132
(Space == access::address_space::global_space ||
119
- Space == access::address_space::global_device_space)>>
133
+ Space == access::address_space::global_device_space ||
134
+ Space == access::address_space::generic_space)>>
120
135
multi_ptr (accessor<ElementType, dimensions, Mode, access::target::device,
121
136
isPlaceholder, PropertyListT>
122
137
Accessor) {
123
138
m_Pointer = (pointer_t )(Accessor.get_pointer ().get ());
124
139
}
125
140
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::local_space ||
147
+ Space == access::address_space::generic_space)>>
132
148
multi_ptr (accessor<ElementType, dimensions, Mode, access::target::local,
133
149
isPlaceholder, PropertyListT>
134
150
Accessor)
@@ -154,29 +170,32 @@ template <typename ElementType, access::address_space Space> class multi_ptr {
154
170
// 2. from multi_ptr<ElementType, Space> to multi_ptr<const ElementType,
155
171
// Space>
156
172
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
174
+ // and element type is const
159
175
template <
160
176
int dimensions, access::mode Mode, access::placeholder isPlaceholder,
161
177
typename PropertyListT, access::address_space _Space = Space,
162
178
typename ET = ElementType,
163
179
typename = typename detail::enable_if_t <
164
180
_Space == Space &&
165
181
(Space == access::address_space::global_space ||
166
- Space == access::address_space::global_device_space) &&
182
+ Space == access::address_space::global_device_space ||
183
+ Space == access::address_space::generic_space) &&
167
184
std::is_const<ET>::value && std::is_same<ET, ElementType>::value>>
168
185
multi_ptr (accessor<typename detail::remove_const_t <ET>, dimensions, Mode,
169
186
access::target::device, isPlaceholder, PropertyListT>
170
187
Accessor)
171
188
: multi_ptr(Accessor.get_pointer()) {}
172
189
173
- // Only if Space == local_space and element type is const
190
+ // Only if Space == local_space || generic_space and element type is const
174
191
template <
175
192
int dimensions, access::mode Mode, access::placeholder isPlaceholder,
176
193
typename PropertyListT, access::address_space _Space = Space,
177
194
typename ET = ElementType,
178
195
typename = typename detail::enable_if_t <
179
- _Space == Space && Space == access::address_space::local_space &&
196
+ _Space == Space &&
197
+ (Space == access::address_space::local_space ||
198
+ Space == access::address_space::generic_space) &&
180
199
std::is_const<ET>::value && std::is_same<ET, ElementType>::value>>
181
200
multi_ptr (accessor<typename detail::remove_const_t <ET>, dimensions, Mode,
182
201
access::target::local, isPlaceholder, PropertyListT>
@@ -373,23 +392,26 @@ template <access::address_space Space> class multi_ptr<void, Space> {
373
392
return *this ;
374
393
}
375
394
376
- // Only if Space == global_space || global_device_space
395
+ // Only if Space == global_space || global_device_space || generic_space
377
396
template <typename ElementType, int dimensions, access::mode Mode,
378
397
typename PropertyListT, access::address_space _Space = Space,
379
398
typename = typename detail::enable_if_t <
380
399
_Space == Space &&
381
400
(Space == access::address_space::global_space ||
382
- Space == access::address_space::global_device_space)>>
401
+ Space == access::address_space::global_device_space ||
402
+ Space == access::address_space::generic_space)>>
383
403
multi_ptr (accessor<ElementType, dimensions, Mode, access::target::device,
384
404
access::placeholder::false_t , PropertyListT>
385
405
Accessor)
386
406
: multi_ptr(Accessor.get_pointer()) {}
387
407
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::local_space ||
414
+ Space == access::address_space::generic_space)>>
393
415
multi_ptr (accessor<ElementType, dimensions, Mode, access::target::local,
394
416
access::placeholder::false_t , PropertyListT>
395
417
Accessor)
@@ -493,23 +515,26 @@ class multi_ptr<const void, Space> {
493
515
return *this ;
494
516
}
495
517
496
- // Only if Space == global_space || global_device_space
518
+ // Only if Space == global_space || global_device_space || generic_space
497
519
template <typename ElementType, int dimensions, access::mode Mode,
498
520
typename PropertyListT, access::address_space _Space = Space,
499
521
typename = typename detail::enable_if_t <
500
522
_Space == Space &&
501
523
(Space == access::address_space::global_space ||
502
- Space == access::address_space::global_device_space)>>
524
+ Space == access::address_space::global_device_space ||
525
+ Space == access::address_space::generic_space)>>
503
526
multi_ptr (accessor<ElementType, dimensions, Mode, access::target::device,
504
527
access::placeholder::false_t , PropertyListT>
505
528
Accessor)
506
529
: multi_ptr(Accessor.get_pointer()) {}
507
530
508
- // Only if Space == local_space
531
+ // Only if Space == local_space || generic_space
509
532
template <typename ElementType, int dimensions, access::mode Mode,
510
533
typename PropertyListT, access::address_space _Space = Space,
511
534
typename = typename detail::enable_if_t <
512
- _Space == Space && Space == access::address_space::local_space>>
535
+ _Space == Space &&
536
+ (Space == access::address_space::local_space ||
537
+ Space == access::address_space::generic_space)>>
513
538
multi_ptr (accessor<ElementType, dimensions, Mode, access::target::local,
514
539
access::placeholder::false_t , PropertyListT>
515
540
Accessor)
0 commit comments