Skip to content

Commit 5b46e0d

Browse files
authored
[SYCL] Fix bug in fill op for zero-dim accessor. (#9287)
According to the SYCL2020 spec, a zero-dim accessor is used for accessing the first element of a buffer. Also, `range` and `id` classes cannot accept zero dimensions. Thus, we need a special case for zero-dim accessors that simply fills the first element. Closes #9252. --------- Signed-off-by: Maronas, Marcos <[email protected]>
1 parent 16ddc5b commit 5b46e0d

File tree

3 files changed

+30
-2
lines changed

3 files changed

+30
-2
lines changed

sycl/include/sycl/handler.hpp

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2432,7 +2432,7 @@ class __SYCL_EXPORT handler {
24322432
static_assert(isValidTargetForExplicitOp(AccessTarget),
24332433
"Invalid accessor target for the fill method.");
24342434
if constexpr (isBackendSupportedFillSize(sizeof(T)) &&
2435-
(Dims == 1 || isImageOrImageArray(AccessTarget))) {
2435+
(Dims <= 1 || isImageOrImageArray(AccessTarget))) {
24362436
setType(detail::CG::Fill);
24372437

24382438
detail::AccessorBaseHost *AccBase = (detail::AccessorBaseHost *)&Dst;
@@ -2445,6 +2445,11 @@ class __SYCL_EXPORT handler {
24452445
MPattern.resize(sizeof(T));
24462446
auto PatternPtr = reinterpret_cast<T *>(MPattern.data());
24472447
*PatternPtr = Pattern;
2448+
} else if constexpr (Dims == 0) {
2449+
// Special case for zero-dim accessors.
2450+
parallel_for<
2451+
class __fill<T, Dims, AccessMode, AccessTarget, IsPlaceholder>>(
2452+
range<1>(1), [=](id<1> Index) { Dst = Pattern; });
24482453
} else {
24492454
range<Dims> Range = Dst.get_range();
24502455
parallel_for<

sycl/source/detail/memory_manager.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -781,7 +781,7 @@ void MemoryManager::fill(SYCLMemObjI *SYCLMemObj, void *Mem, QueueImplPtr Queue,
781781

782782
const detail::plugin &Plugin = Queue->getPlugin();
783783
if (SYCLMemObj->getType() == detail::SYCLMemObjI::MemObjType::Buffer) {
784-
if (Dim == 1) {
784+
if (Dim <= 1) {
785785
Plugin.call<PiApiKind::piEnqueueMemBufferFill>(
786786
Queue->getHandleRef(), pi::cast<RT::PiMem>(Mem), Pattern, PatternSize,
787787
Offset[0] * ElementSize, Range[0] * ElementSize, DepEvents.size(),

sycl/test-e2e/Basic/fill_accessor.cpp

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,8 +45,31 @@ void CheckFill(queue &Q, range<Dims> Range, T Init, T Expected) {
4545
}
4646
}
4747

48+
template <typename T>
49+
void CheckFillZeroDimAccessor(queue &Q, T Init, T Expected) {
50+
constexpr int Dims = 1;
51+
range<1> Range(1);
52+
std::vector<T> Data(Range.size(), Init);
53+
{
54+
buffer<T, Dims> Buffer(Data.data(), Range);
55+
Q.submit([&](handler &CGH) {
56+
accessor<T, 0, sycl::access::mode::write> Accessor(Buffer, CGH);
57+
CGH.fill(Accessor, Expected);
58+
}).wait_and_throw();
59+
}
60+
for (size_t I = 0; I < Range.size(); ++I) {
61+
if (Data[I] != Expected) {
62+
std::cout << "Unexpected value " << Data[I] << " at index " << I
63+
<< " after fill. Expected " << Expected << "." << std::endl;
64+
++NumErrors;
65+
return;
66+
}
67+
}
68+
}
69+
4870
template <typename T>
4971
void CheckFillDifferentDims(queue &Q, size_t N, T Init, T Expected) {
72+
CheckFillZeroDimAccessor<T>(Q, Init, Expected);
5073
CheckFill<T>(Q, range<1>{N}, Init, Expected);
5174
CheckFill<T>(Q, range<2>{N, N}, Init, Expected);
5275
CheckFill<T>(Q, range<3>{N, N, N}, Init, Expected);

0 commit comments

Comments
 (0)