Skip to content

Commit 9fa2654

Browse files
Fznamznonvladimirlaz
authored andcommitted
[SYCL] Do not always create new OpenCL buffers to copy from device to host
Signed-off-by: Mariya Podchishchaeva <[email protected]>
1 parent 5af7aa1 commit 9fa2654

File tree

1 file changed

+27
-12
lines changed

1 file changed

+27
-12
lines changed

sycl/include/CL/sycl/detail/buffer_impl.hpp

Lines changed: 27 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -390,31 +390,46 @@ void buffer_impl<AllocatorT>::moveMemoryTo(
390390
Event->setIsHostEvent(false);
391391

392392
OCLState.Queue = std::move(Queue);
393-
OCLState.Mem = nullptr;
394393
return;
395394
}
396395
// Copy from host to OCL device.
397396
if (OCLState.Queue->is_host() && !Queue->is_host()) {
398-
const size_t ByteSize = get_size();
397+
if (nullptr == BufPtr) {
398+
return;
399+
}
400+
399401
cl_int Error;
400-
cl_mem Mem =
401-
clCreateBuffer(Context->getHandleRef(), CL_MEM_READ_WRITE, ByteSize,
402-
/*host_ptr=*/nullptr, &Error);
403-
CHECK_OCL_CODE(Error);
402+
const size_t ByteSize = get_size();
404403

405-
OCLState.Queue = std::move(Queue);
406-
OCLState.Mem = Mem;
404+
// We don't create new OpenCL buffer object to copy from OCL device to host
405+
// when we already have them in OCLState. But if contexts of buffer object
406+
// from OCLState and input Queue are not same - we should create new OpenCL
407+
// buffer object.
408+
bool NeedToCreateCLBuffer = true;
409+
410+
if (OCLState.Mem != nullptr) {
411+
cl_context MemCtx;
412+
Error = clGetMemObjectInfo(OCLState.Mem, CL_MEM_CONTEXT,
413+
sizeof(cl_context), &MemCtx, nullptr);
414+
CHECK_OCL_CODE(Error);
415+
NeedToCreateCLBuffer = MemCtx != Context->getHandleRef();
416+
}
407417

408-
// Just exit if nothing to read from host.
409-
if (nullptr == BufPtr) {
410-
return;
418+
if (NeedToCreateCLBuffer) {
419+
OCLState.Mem =
420+
clCreateBuffer(Context->getHandleRef(), CL_MEM_READ_WRITE, ByteSize,
421+
/*host_ptr=*/nullptr, &Error);
422+
CHECK_OCL_CODE(Error);
411423
}
424+
425+
OCLState.Queue = std::move(Queue);
426+
412427
std::vector<cl_event> CLEvents =
413428
detail::getOrWaitEvents(std::move(DepEvents), Context);
414429
cl_event &WriteBufEvent = Event->getHandleRef();
415430
// Enqueue copying from host to new OCL buffer.
416431
Error =
417-
clEnqueueWriteBuffer(OCLState.Queue->getHandleRef(), Mem,
432+
clEnqueueWriteBuffer(OCLState.Queue->getHandleRef(), OCLState.Mem,
418433
/*blocking_write=*/CL_FALSE, /*offset=*/0,
419434
ByteSize, BufPtr, CLEvents.size(), CLEvents.data(),
420435
&WriteBufEvent); // replace &WriteBufEvent to NULL

0 commit comments

Comments
 (0)