Skip to content

Commit 7e5789b

Browse files
committed
Do not use accessor APIs in the iterator constructor
This is a prepartion commit for when the iterator won't hold a pointer to an accessor at all.
1 parent d785db4 commit 7e5789b

File tree

2 files changed

+36
-24
lines changed

2 files changed

+36
-24
lines changed

sycl/include/sycl/accessor.hpp

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2030,11 +2030,15 @@ class __SYCL_SPECIAL_CLASS __SYCL_TYPE(accessor) accessor :
20302030
bool operator!=(const accessor &Rhs) const { return !(*this == Rhs); }
20312031

20322032
iterator begin() const noexcept {
2033-
return iterator::__get_begin(this, getMemoryRange());
2033+
return iterator::__get_begin(
2034+
this, detail::convertToArrayOfN<Dimensions, 1>(getMemoryRange()),
2035+
get_range(), get_offset());
20342036
}
20352037

20362038
iterator end() const noexcept {
2037-
return iterator::__get_end(this, getMemoryRange());
2039+
return iterator::__get_end(
2040+
this, detail::convertToArrayOfN<Dimensions, 1>(getMemoryRange()),
2041+
get_range(), get_offset());
20382042
}
20392043

20402044
private:

sycl/include/sycl/detail/accessor_iterator.hpp

Lines changed: 30 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -286,7 +286,9 @@ class __accessor_iterator {
286286
}
287287

288288
__accessor_iterator(const _AccessorT *_AccessorPtr,
289-
const range<3> &_AccessRange)
289+
const range<_Dimensions> &_MemoryRange,
290+
const range<_Dimensions> &_AccessRange,
291+
const id<_Dimensions> &_Offset)
290292
: _MAccessorPtr(_AccessorPtr) {
291293
constexpr int _XIndex = _Dimensions - 1;
292294
constexpr int _YIndex = _Dimensions - 2;
@@ -295,52 +297,58 @@ class __accessor_iterator {
295297
(void)_ZIndex;
296298

297299
if constexpr (_Dimensions > 1)
298-
_MRowSize = _MAccessorPtr->get_range()[_XIndex];
300+
_MRowSize = _AccessRange[_XIndex];
299301
if constexpr (_Dimensions > 2)
300-
_MSliceSize = _MAccessorPtr->get_range()[_YIndex] * _MRowSize;
302+
_MSliceSize = _AccessRange[_YIndex] * _MRowSize;
301303

302-
if (id<_Dimensions>{} != _MAccessorPtr->get_offset())
304+
if (id<_Dimensions>{} != _Offset)
303305
_MAccessorIsRanged = true;
304306
else {
305307
for (size_t _I = 0; _I < _Dimensions; ++_I)
306-
if (_MAccessorPtr->get_range()[_I] != _AccessRange[_I])
308+
if (_AccessRange[_I] != _MemoryRange[_I])
307309
_MAccessorIsRanged = true;
308310
}
309311

310312
if (_MAccessorIsRanged) {
311313
if constexpr (_Dimensions > 2) {
312-
_MStaticOffset += _AccessRange[_XIndex] * _AccessRange[_YIndex] *
313-
_MAccessorPtr->get_offset()[_ZIndex];
314+
_MStaticOffset +=
315+
_MemoryRange[_XIndex] * _MemoryRange[_YIndex] * _Offset[_ZIndex];
314316
_MPerSliceOffset =
315-
_AccessRange[_XIndex] * _AccessRange[_YIndex] - _MSliceSize;
317+
_MemoryRange[_XIndex] * _MemoryRange[_YIndex] - _MSliceSize;
316318
}
317319
if constexpr (_Dimensions > 1) {
318320
// Elements in fully inaccessible rows
319-
_MStaticOffset +=
320-
_AccessRange[_XIndex] * _MAccessorPtr->get_offset()[_YIndex];
321-
// Elements from the first accessible row
322-
_MStaticOffset += _MAccessorPtr->get_offset()[_XIndex];
323-
_MPerRowOffset = _AccessRange[_XIndex] - _MRowSize;
321+
_MStaticOffset += _MemoryRange[_XIndex] * _Offset[_YIndex];
322+
_MPerRowOffset = _MemoryRange[_XIndex] - _MRowSize;
324323
}
325-
}
326324

327-
// To further optimize 1D case, offset is already included into _Begin
328-
if constexpr (_Dimensions == 1)
329-
_MBegin = _MAccessorPtr->get_offset()[_XIndex];
325+
// Elements from the first accessible row
326+
if constexpr (_Dimensions == 1)
327+
// To further optimize 1D case, offset is already included into _Begin
328+
_MBegin = _Offset[_XIndex];
329+
else
330+
_MStaticOffset += _Offset[_XIndex];
331+
}
330332

331-
_MEnd = _MBegin + _MAccessorPtr->size();
333+
_MEnd = _MBegin + _AccessRange.size();
332334
}
333335

334336
static __accessor_iterator __get_begin(const _AccessorT *_AccessorPtr,
335-
const range<3> &_AccessRange) {
336-
auto _It = __accessor_iterator(_AccessorPtr, _AccessRange);
337+
const range<_Dimensions> &_MemoryRange,
338+
const range<_Dimensions> &_AccessRange,
339+
const id<_Dimensions> &_Offset) {
340+
auto _It =
341+
__accessor_iterator(_AccessorPtr, _MemoryRange, _AccessRange, _Offset);
337342
_It._MLinearId = _It._MBegin;
338343
return _It;
339344
}
340345

341346
static __accessor_iterator __get_end(const _AccessorT *_AccessorPtr,
342-
const range<3> &_AccessRange) {
343-
auto _It = __accessor_iterator(_AccessorPtr, _AccessRange);
347+
const range<_Dimensions> &_MemoryRange,
348+
const range<_Dimensions> &_AccessRange,
349+
const id<_Dimensions> &_Offset) {
350+
auto _It =
351+
__accessor_iterator(_AccessorPtr, _MemoryRange, _AccessRange, _Offset);
344352
_It._MLinearId = _It._MEnd;
345353
return _It;
346354
}

0 commit comments

Comments
 (0)