diff --git a/sycl/source/detail/sycl_mem_obj_t.hpp b/sycl/source/detail/sycl_mem_obj_t.hpp index 3bbbbf536ee29..100fc3c39b766 100644 --- a/sycl/source/detail/sycl_mem_obj_t.hpp +++ b/sycl/source/detail/sycl_mem_obj_t.hpp @@ -175,7 +175,7 @@ class __SYCL_EXPORT SYCLMemObjT : public SYCLMemObjI { bool canReuseHostPtr(void *HostPtr, const size_t RequiredAlign) { bool Aligned = (reinterpret_cast(HostPtr) % RequiredAlign) == 0; - return Aligned || useHostPtr(); + return !MHostPtrReadOnly && (Aligned || useHostPtr()); } void handleHostData(void *HostPtr, const size_t RequiredAlign) { diff --git a/sycl/test-e2e/Basic/host_write_back.cpp b/sycl/test-e2e/Basic/host_write_back.cpp new file mode 100644 index 0000000000000..44291bbc039bd --- /dev/null +++ b/sycl/test-e2e/Basic/host_write_back.cpp @@ -0,0 +1,37 @@ +// RUN: %{build} -o %t.out +// RUN: %{run} %t.out + +#include +#include + +using namespace sycl; + +static constexpr int N = 32; + +void testAccessor() { + std::vector vec(N, 1); + { + buffer buf(static_cast(vec.data()), range<1>{N}); + queue q; + q.submit([&](handler &cgh) { + auto acc = buf.get_access(cgh); + cgh.parallel_for({N}, [=](id<1> i) { acc[i] += 5; }); + }); + } + assert(vec[0] == 1); +} + +void testHostAcessor() { + std::vector vec(N, 1); + { + buffer buf(static_cast(vec.data()), range<1>{N}); + auto acc = buf.get_host_access(); + acc[0] += 5; + } + assert(vec[0] == 1); +} + +int main() { + testAccessor(); + testHostAcessor(); +}