From 0d63295dd1d9da3fee9c1bbefee70bf8d76da7c9 Mon Sep 17 00:00:00 2001 From: "nawrin.sultana" Date: Thu, 25 Jun 2020 15:01:19 -0700 Subject: [PATCH] [SYCL] Handle zero-sized buffer in device accessor 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 nawrin.sultana@intel.com --- sycl/include/CL/sycl/accessor.hpp | 15 +++++++++++ sycl/test/basic_tests/accessor/accessor.cpp | 29 +++++++++++++++++++++ 2 files changed, 44 insertions(+) diff --git a/sycl/include/CL/sycl/accessor.hpp b/sycl/include/CL/sycl/accessor.hpp index 125944e6c10eb..b694dfe525ae9 100644 --- a/sycl/include/CL/sycl/accessor.hpp +++ b/sycl/include/CL/sycl/accessor.hpp @@ -889,6 +889,7 @@ class accessor : getAdjustedMode(PropertyList), detail::getSyclObjImpl(BufferRef).get(), AdjustedDim, sizeof(DataT), BufferRef.OffsetInBytes, BufferRef.IsSubBuffer) { + checkDeviceAccessorBufferSize(BufferRef.get_count()); if (!IsPlaceH) addHostAccessorAndWait(AccessorBaseHost::impl.get()); #endif @@ -912,6 +913,7 @@ class accessor : getAdjustedMode(PropertyList), detail::getSyclObjImpl(BufferRef).get(), Dimensions, sizeof(DataT), BufferRef.OffsetInBytes, BufferRef.IsSubBuffer) { + checkDeviceAccessorBufferSize(BufferRef.get_count()); detail::associateWithHandler(CommandGroupHandler, this, AccessTarget); } #endif @@ -935,6 +937,7 @@ class accessor : getAdjustedMode(PropertyList), detail::getSyclObjImpl(BufferRef).get(), Dimensions, sizeof(DataT), BufferRef.OffsetInBytes, BufferRef.IsSubBuffer) { + checkDeviceAccessorBufferSize(BufferRef.get_count()); if (!IsPlaceH) addHostAccessorAndWait(AccessorBaseHost::impl.get()); } @@ -972,6 +975,7 @@ class accessor : getAdjustedMode(PropertyList), detail::getSyclObjImpl(BufferRef).get(), Dimensions, sizeof(DataT), BufferRef.OffsetInBytes, BufferRef.IsSubBuffer) { + checkDeviceAccessorBufferSize(BufferRef.get_count()); detail::associateWithHandler(CommandGroupHandler, this, AccessTarget); } #endif @@ -1058,6 +1062,7 @@ class accessor : detail::getSyclObjImpl(BufferRef).get(), Dimensions, sizeof(DataT), BufferRef.OffsetInBytes, BufferRef.IsSubBuffer) { + checkDeviceAccessorBufferSize(BufferRef.get_count()); if (!IsPlaceH) addHostAccessorAndWait(AccessorBaseHost::impl.get()); } @@ -1097,6 +1102,7 @@ class accessor : detail::getSyclObjImpl(BufferRef).get(), Dimensions, sizeof(DataT), BufferRef.OffsetInBytes, BufferRef.IsSubBuffer) { + checkDeviceAccessorBufferSize(BufferRef.get_count()); detail::associateWithHandler(CommandGroupHandler, this, AccessTarget); } #endif @@ -1219,6 +1225,15 @@ class accessor : bool operator==(const accessor &Rhs) const { return impl == Rhs.impl; } bool operator!=(const accessor &Rhs) const { return !(*this == Rhs); } + +private: + void checkDeviceAccessorBufferSize(const size_t elemInBuffer) { + if (!IsHostBuf && elemInBuffer == 0) + throw cl::sycl::invalid_object_error( + "SYCL buffer size is zero. To create a device accessor, SYCL " + "buffer size must be greater than zero.", + PI_INVALID_VALUE); + } }; #if __cplusplus > 201402L diff --git a/sycl/test/basic_tests/accessor/accessor.cpp b/sycl/test/basic_tests/accessor/accessor.cpp index ebb99a0f7abbe..413ed9ddd0c13 100644 --- a/sycl/test/basic_tests/accessor/accessor.cpp +++ b/sycl/test/basic_tests/accessor/accessor.cpp @@ -540,4 +540,33 @@ int main() { return 1; } } + + // Accessor with buffer size 0. + { + try { + int data[10] = {0}; + { + sycl::buffer b{&data[0], 10}; + sycl::buffer b1{0}; + + sycl::queue queue; + queue.submit([&](sycl::handler &cgh) { + sycl::accessor + B(b, cgh); + auto B1 = b1.template get_access(cgh); + + cgh.single_task([=]() { + B[0] = 1; + }); + }); + } + assert(!"invalid device accessor buffer size exception wasn't caught"); + } catch (const sycl::invalid_object_error &e) { + assert(e.get_cl_code() == CL_INVALID_VALUE); + } catch (sycl::exception e) { + std::cout << "SYCL exception caught: " << e.what(); + return 1; + } + } }