Skip to content

Commit 80b2110

Browse files
authored
[SYCL] Handle zero-sized buffer in device accessor (#2011)
Currently any attempt to create device accessor from zero-sized buffer crashes with the message 'OpenCL API failed. OpenCL API returns'. This patch adds meaningful message and throws a cl::sycl::invalid_object_error with an error code CL_INVALID_VALUE in an attempt to create a device accessor with zero-sized buffer. Signed-off-by: Nawrin Sultana [email protected]
1 parent 70428d3 commit 80b2110

File tree

2 files changed

+44
-0
lines changed

2 files changed

+44
-0
lines changed

sycl/include/CL/sycl/accessor.hpp

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -889,6 +889,7 @@ class accessor :
889889
getAdjustedMode(PropertyList),
890890
detail::getSyclObjImpl(BufferRef).get(), AdjustedDim, sizeof(DataT),
891891
BufferRef.OffsetInBytes, BufferRef.IsSubBuffer) {
892+
checkDeviceAccessorBufferSize(BufferRef.get_count());
892893
if (!IsPlaceH)
893894
addHostAccessorAndWait(AccessorBaseHost::impl.get());
894895
#endif
@@ -912,6 +913,7 @@ class accessor :
912913
getAdjustedMode(PropertyList),
913914
detail::getSyclObjImpl(BufferRef).get(), Dimensions, sizeof(DataT),
914915
BufferRef.OffsetInBytes, BufferRef.IsSubBuffer) {
916+
checkDeviceAccessorBufferSize(BufferRef.get_count());
915917
detail::associateWithHandler(CommandGroupHandler, this, AccessTarget);
916918
}
917919
#endif
@@ -935,6 +937,7 @@ class accessor :
935937
getAdjustedMode(PropertyList),
936938
detail::getSyclObjImpl(BufferRef).get(), Dimensions, sizeof(DataT),
937939
BufferRef.OffsetInBytes, BufferRef.IsSubBuffer) {
940+
checkDeviceAccessorBufferSize(BufferRef.get_count());
938941
if (!IsPlaceH)
939942
addHostAccessorAndWait(AccessorBaseHost::impl.get());
940943
}
@@ -972,6 +975,7 @@ class accessor :
972975
getAdjustedMode(PropertyList),
973976
detail::getSyclObjImpl(BufferRef).get(), Dimensions, sizeof(DataT),
974977
BufferRef.OffsetInBytes, BufferRef.IsSubBuffer) {
978+
checkDeviceAccessorBufferSize(BufferRef.get_count());
975979
detail::associateWithHandler(CommandGroupHandler, this, AccessTarget);
976980
}
977981
#endif
@@ -1058,6 +1062,7 @@ class accessor :
10581062
detail::getSyclObjImpl(BufferRef).get(), Dimensions,
10591063
sizeof(DataT), BufferRef.OffsetInBytes,
10601064
BufferRef.IsSubBuffer) {
1065+
checkDeviceAccessorBufferSize(BufferRef.get_count());
10611066
if (!IsPlaceH)
10621067
addHostAccessorAndWait(AccessorBaseHost::impl.get());
10631068
}
@@ -1097,6 +1102,7 @@ class accessor :
10971102
detail::getSyclObjImpl(BufferRef).get(), Dimensions,
10981103
sizeof(DataT), BufferRef.OffsetInBytes,
10991104
BufferRef.IsSubBuffer) {
1105+
checkDeviceAccessorBufferSize(BufferRef.get_count());
11001106
detail::associateWithHandler(CommandGroupHandler, this, AccessTarget);
11011107
}
11021108
#endif
@@ -1219,6 +1225,15 @@ class accessor :
12191225

12201226
bool operator==(const accessor &Rhs) const { return impl == Rhs.impl; }
12211227
bool operator!=(const accessor &Rhs) const { return !(*this == Rhs); }
1228+
1229+
private:
1230+
void checkDeviceAccessorBufferSize(const size_t elemInBuffer) {
1231+
if (!IsHostBuf && elemInBuffer == 0)
1232+
throw cl::sycl::invalid_object_error(
1233+
"SYCL buffer size is zero. To create a device accessor, SYCL "
1234+
"buffer size must be greater than zero.",
1235+
PI_INVALID_VALUE);
1236+
}
12221237
};
12231238

12241239
#if __cplusplus > 201402L

sycl/test/basic_tests/accessor/accessor.cpp

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -540,4 +540,33 @@ int main() {
540540
return 1;
541541
}
542542
}
543+
544+
// Accessor with buffer size 0.
545+
{
546+
try {
547+
int data[10] = {0};
548+
{
549+
sycl::buffer<int, 1> b{&data[0], 10};
550+
sycl::buffer<int, 1> b1{0};
551+
552+
sycl::queue queue;
553+
queue.submit([&](sycl::handler &cgh) {
554+
sycl::accessor<int, 1, sycl::access::mode::read_write,
555+
sycl::access::target::global_buffer>
556+
B(b, cgh);
557+
auto B1 = b1.template get_access<sycl::access::mode::read_write>(cgh);
558+
559+
cgh.single_task<class acc_with_zero_sized_buffer>([=]() {
560+
B[0] = 1;
561+
});
562+
});
563+
}
564+
assert(!"invalid device accessor buffer size exception wasn't caught");
565+
} catch (const sycl::invalid_object_error &e) {
566+
assert(e.get_cl_code() == CL_INVALID_VALUE);
567+
} catch (sycl::exception e) {
568+
std::cout << "SYCL exception caught: " << e.what();
569+
return 1;
570+
}
571+
}
543572
}

0 commit comments

Comments
 (0)