From 471ed64ecf4c39f01a9f17989ed2ec87a729595e Mon Sep 17 00:00:00 2001 From: Mariya Podchishchaeva Date: Wed, 20 Feb 2019 20:52:32 +0300 Subject: [PATCH] [SYCL] Do not always create new OpenCL buffers to copy from device to host Signed-off-by: Mariya Podchishchaeva --- sycl/include/CL/sycl/detail/buffer_impl.hpp | 39 ++++++++++++++------- 1 file changed, 27 insertions(+), 12 deletions(-) diff --git a/sycl/include/CL/sycl/detail/buffer_impl.hpp b/sycl/include/CL/sycl/detail/buffer_impl.hpp index 73064e988538f..261316da77973 100644 --- a/sycl/include/CL/sycl/detail/buffer_impl.hpp +++ b/sycl/include/CL/sycl/detail/buffer_impl.hpp @@ -388,31 +388,46 @@ void buffer_impl::moveMemoryTo( Event->setIsHostEvent(false); OCLState.Queue = std::move(Queue); - OCLState.Mem = nullptr; return; } // Copy from host to OCL device. if (OCLState.Queue->is_host() && !Queue->is_host()) { - const size_t ByteSize = get_size(); + if (nullptr == BufPtr) { + return; + } + cl_int Error; - cl_mem Mem = - clCreateBuffer(Context->getHandleRef(), CL_MEM_READ_WRITE, ByteSize, - /*host_ptr=*/nullptr, &Error); - CHECK_OCL_CODE(Error); + const size_t ByteSize = get_size(); - OCLState.Queue = std::move(Queue); - OCLState.Mem = Mem; + // We don't create new OpenCL buffer object to copy from OCL device to host + // when we already have them in OCLState. But if contexts of buffer object + // from OCLState and input Queue are not same - we should create new OpenCL + // buffer object. + bool NeedToCreateCLBuffer = true; + + if (OCLState.Mem != nullptr) { + cl_context MemCtx; + Error = clGetMemObjectInfo(OCLState.Mem, CL_MEM_CONTEXT, + sizeof(cl_context), &MemCtx, nullptr); + CHECK_OCL_CODE(Error); + NeedToCreateCLBuffer = MemCtx != Context->getHandleRef(); + } - // Just exit if nothing to read from host. - if (nullptr == BufPtr) { - return; + if (NeedToCreateCLBuffer) { + OCLState.Mem = + clCreateBuffer(Context->getHandleRef(), CL_MEM_READ_WRITE, ByteSize, + /*host_ptr=*/nullptr, &Error); + CHECK_OCL_CODE(Error); } + + OCLState.Queue = std::move(Queue); + std::vector CLEvents = detail::getOrWaitEvents(std::move(DepEvents), Context); cl_event &WriteBufEvent = Event->getHandleRef(); // Enqueue copying from host to new OCL buffer. Error = - clEnqueueWriteBuffer(OCLState.Queue->getHandleRef(), Mem, + clEnqueueWriteBuffer(OCLState.Queue->getHandleRef(), OCLState.Mem, /*blocking_write=*/CL_FALSE, /*offset=*/0, ByteSize, BufPtr, CLEvents.size(), CLEvents.data(), &WriteBufEvent); // replace &WriteBufEvent to NULL