Skip to content

Commit a4a1817

Browse files
committed
Do not store a reference to an accessor within iterator
1 parent 7e5789b commit a4a1817

File tree

2 files changed

+25
-29
lines changed

2 files changed

+25
-29
lines changed

sycl/include/sycl/accessor.hpp

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1151,10 +1151,7 @@ class __SYCL_SPECIAL_CLASS __SYCL_TYPE(accessor) accessor :
11511151
using reference = DataT &;
11521152
using const_reference = const DataT &;
11531153

1154-
using iterator =
1155-
typename detail::__accessor_iterator<DataT, Dimensions, AccessMode,
1156-
AccessTarget, IsPlaceholder,
1157-
PropertyListT>;
1154+
using iterator = typename detail::__accessor_iterator<DataT, Dimensions>;
11581155
using difference_type =
11591156
typename std::iterator_traits<iterator>::difference_type;
11601157

@@ -2031,14 +2028,16 @@ class __SYCL_SPECIAL_CLASS __SYCL_TYPE(accessor) accessor :
20312028

20322029
iterator begin() const noexcept {
20332030
return iterator::__get_begin(
2034-
this, detail::convertToArrayOfN<Dimensions, 1>(getMemoryRange()),
2035-
get_range(), get_offset());
2031+
get_pointer(),
2032+
detail::convertToArrayOfN<Dimensions, 1>(getMemoryRange()), get_range(),
2033+
get_offset());
20362034
}
20372035

20382036
iterator end() const noexcept {
20392037
return iterator::__get_end(
2040-
this, detail::convertToArrayOfN<Dimensions, 1>(getMemoryRange()),
2041-
get_range(), get_offset());
2038+
get_pointer(),
2039+
detail::convertToArrayOfN<Dimensions, 1>(getMemoryRange()), get_range(),
2040+
get_offset());
20422041
}
20432042

20442043
private:

sycl/include/sycl/detail/accessor_iterator.hpp

Lines changed: 18 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -36,17 +36,15 @@
3636

3737
namespace sycl {
3838
__SYCL_INLINE_VER_NAMESPACE(_V1) {
39-
template <typename _DataT, int _Dimensions, access::mode _AccessMode,
40-
access::target _AccessTarget, access::placeholder _IsPlaceholder,
41-
typename _PropertyListT>
39+
40+
template <typename _AccessorDataT, int _AccessorDimensions,
41+
access::mode _AccessMode, access::target _AccessTarget,
42+
access::placeholder _IsPlaceholder, typename _PropertyListT>
4243
class accessor;
4344

4445
namespace detail {
4546

46-
template <typename _DataT, int _Dimensions, access::mode _AccessMode,
47-
access::target _AccessTarget, access::placeholder _IsPlaceholder,
48-
typename _PropertyListT>
49-
class __accessor_iterator {
47+
template <typename _DataT, int _Dimensions> class __accessor_iterator {
5048
public:
5149
using difference_type = std::ptrdiff_t;
5250
using value_type = _DataT;
@@ -57,8 +55,8 @@ class __accessor_iterator {
5755

5856
__accessor_iterator() = default;
5957

60-
_DataT &operator*() {
61-
return *(_MAccessorPtr->get_pointer() + __get_absolute_offset_to_buffer());
58+
reference operator*() {
59+
return *(_MDataPtr + __get_absolute_offset_to_buffer());
6260
}
6361

6462
__accessor_iterator &operator++() {
@@ -168,12 +166,12 @@ class __accessor_iterator {
168166
}
169167

170168
private:
171-
using _AccessorT = accessor<_DataT, _Dimensions, _AccessMode, _AccessTarget,
172-
_IsPlaceholder, _PropertyListT>;
173-
friend class accessor<_DataT, _Dimensions, _AccessMode, _AccessTarget,
174-
_IsPlaceholder, _PropertyListT>;
169+
template <typename _AccessorDataT, int _AccessorDimensions,
170+
access::mode _AccessMode, access::target _AccessTarget,
171+
access::placeholder _IsPlaceholder, typename _PropertyListT>
172+
friend class sycl::accessor;
175173

176-
const _AccessorT *_MAccessorPtr = nullptr;
174+
_DataT *_MDataPtr = nullptr;
177175

178176
// Stores a linear id of an accessor's buffer element the iterator points to.
179177
// This id is relative to a range accessible through an accessor, i.e. it is
@@ -285,11 +283,10 @@ class __accessor_iterator {
285283
return _AbsoluteId;
286284
}
287285

288-
__accessor_iterator(const _AccessorT *_AccessorPtr,
289-
const range<_Dimensions> &_MemoryRange,
286+
__accessor_iterator(_DataT *_DataPtr, const range<_Dimensions> &_MemoryRange,
290287
const range<_Dimensions> &_AccessRange,
291288
const id<_Dimensions> &_Offset)
292-
: _MAccessorPtr(_AccessorPtr) {
289+
: _MDataPtr(_DataPtr) {
293290
constexpr int _XIndex = _Dimensions - 1;
294291
constexpr int _YIndex = _Dimensions - 2;
295292
(void)_YIndex;
@@ -333,22 +330,22 @@ class __accessor_iterator {
333330
_MEnd = _MBegin + _AccessRange.size();
334331
}
335332

336-
static __accessor_iterator __get_begin(const _AccessorT *_AccessorPtr,
333+
static __accessor_iterator __get_begin(_DataT *_DataPtr,
337334
const range<_Dimensions> &_MemoryRange,
338335
const range<_Dimensions> &_AccessRange,
339336
const id<_Dimensions> &_Offset) {
340337
auto _It =
341-
__accessor_iterator(_AccessorPtr, _MemoryRange, _AccessRange, _Offset);
338+
__accessor_iterator(_DataPtr, _MemoryRange, _AccessRange, _Offset);
342339
_It._MLinearId = _It._MBegin;
343340
return _It;
344341
}
345342

346-
static __accessor_iterator __get_end(const _AccessorT *_AccessorPtr,
343+
static __accessor_iterator __get_end(_DataT *_DataPtr,
347344
const range<_Dimensions> &_MemoryRange,
348345
const range<_Dimensions> &_AccessRange,
349346
const id<_Dimensions> &_Offset) {
350347
auto _It =
351-
__accessor_iterator(_AccessorPtr, _MemoryRange, _AccessRange, _Offset);
348+
__accessor_iterator(_DataPtr, _MemoryRange, _AccessRange, _Offset);
352349
_It._MLinearId = _It._MEnd;
353350
return _It;
354351
}

0 commit comments

Comments
 (0)