Skip to content

Commit cc80635

Browse files
committed
[SYCL] Optimize 1D accessor.
In case of 1D buffer, adjust pointer to buffer offset during initialization(__init method) rather then each time in operator[] or get_pointer functions. + Fix some bugs related to missing offset calculations in several methods. Signed-off-by: Vlad Romanov <[email protected]>
1 parent bfe2547 commit cc80635

File tree

1 file changed

+26
-10
lines changed

1 file changed

+26
-10
lines changed

sycl/include/CL/sycl/accessor2.hpp

Lines changed: 26 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -273,9 +273,16 @@ class accessor :
273273
using PtrType = typename detail::PtrValueType<DataT, AS>::type *;
274274

275275
template <int Dims = Dimensions> size_t getLinearIndex(id<Dims> Id) const {
276+
277+
#ifdef __SYCL_DEVICE_ONLY__
278+
// Pointer is already adjusted for 1D case.
279+
if (Dimensions == 1)
280+
return Id[0];
281+
#endif // __SYCL_DEVICE_ONLY__
282+
276283
size_t Result = 0;
277284
for (int I = 0; I < Dims; ++I)
278-
Result = Result * getOrigRange()[I] + get_offset()[I] + Id[I];
285+
Result = Result * getOrigRange()[I] + getOffset()[I] + Id[I];
279286
return Result;
280287
}
281288

@@ -301,10 +308,12 @@ class accessor :
301308
getRange()[I] = AccessRange[I];
302309
getOrigRange()[I] = MemRange[I];
303310
}
311+
// In case of 1D buffer, adjust pointer during initialization rather
312+
// then each time in operator[] or get_pointer functions.
313+
if (1 == AdjustedDim)
314+
MData += Offset[0];
304315
}
305316

306-
void *getPtr() { return MData; }
307-
308317
PtrType getQualifiedPtr() const { return MData; }
309318
#else
310319

@@ -466,7 +475,8 @@ class accessor :
466475
template <int Dims = Dimensions,
467476
typename = enable_if_t<IsAccessAnyWrite && Dims == 0>>
468477
operator RefType() const {
469-
return *(getQualifiedPtr() + get_offset()[0]);
478+
const size_t LinearIndex = getLinearIndex(id<Dimensions>());
479+
return *(getQualifiedPtr() + LinearIndex);
470480
}
471481

472482
template <int Dims = Dimensions,
@@ -479,13 +489,15 @@ class accessor :
479489
template <int Dims = Dimensions,
480490
typename = enable_if_t<IsAccessAnyWrite && Dims == 1>>
481491
RefType operator[](size_t Index) const {
482-
return getQualifiedPtr()[Index + get_offset()[0]];
492+
const size_t LinearIndex = getLinearIndex(id<Dimensions>(Index));
493+
return getQualifiedPtr()[LinearIndex];
483494
}
484495

485496
template <int Dims = Dimensions,
486497
typename = enable_if_t<IsAccessReadOnly && Dims == 0>>
487498
operator DataT() const {
488-
return *(getQualifiedPtr() + get_offset()[0]);
499+
const size_t LinearIndex = getLinearIndex(id<AdjustedDim>());
500+
return *(getQualifiedPtr() + LinearIndex);
489501
}
490502

491503
template <int Dims = Dimensions,
@@ -498,14 +510,17 @@ class accessor :
498510
template <int Dims = Dimensions,
499511
typename = enable_if_t<IsAccessReadOnly && Dims == 1>>
500512
DataT operator[](size_t Index) const {
501-
return getQualifiedPtr()[Index + get_offset()[0]];
513+
const size_t LinearIndex = getLinearIndex(id<Dimensions>(Index));
514+
return getQualifiedPtr()[LinearIndex];
502515
}
503516

504517
template <
505518
int Dims = Dimensions,
506519
typename = enable_if_t<AccessMode == access::mode::atomic && Dims == 0>>
507520
operator atomic<DataT, AS>() const {
508-
return atomic<DataT, AS>(multi_ptr<DataT, AS>(getQualifiedPtr()));
521+
const size_t LinearIndex = getLinearIndex(id<AdjustedDim>());
522+
return atomic<DataT, AS>(
523+
multi_ptr<DataT, AS>(getQualifiedPtr() + LinearIndex));
509524
}
510525

511526
template <
@@ -521,14 +536,15 @@ class accessor :
521536
int Dims = Dimensions,
522537
typename = enable_if_t<AccessMode == access::mode::atomic && Dims == 1>>
523538
atomic<DataT, AS> operator[](size_t Index) const {
539+
const size_t LinearIndex = getLinearIndex(id<AdjustedDim>(Index));
524540
return atomic<DataT, AS>(
525-
multi_ptr<DataT, AS>(getQualifiedPtr() + Index + get_offset()[0]));
541+
multi_ptr<DataT, AS>(getQualifiedPtr() + LinearIndex));
526542
}
527543

528544
template <int Dims = Dimensions, typename = enable_if_t<(Dims > 1)>>
529545
typename AccessorCommonT::template AccessorSubscript<Dims - 1>
530546
operator[](size_t Index) const {
531-
return AccessorSubscript<Dims - 1>(*this, Index + get_offset()[0]);
547+
return AccessorSubscript<Dims - 1>(*this, Index);
532548
}
533549

534550
template <

0 commit comments

Comments
 (0)