summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYan Wang <yan.wang@linux.intel.com>2017-06-13 15:45:39 +0800
committerYang Rong <rong.r.yang@intel.com>2017-06-13 18:36:26 +0800
commit2abf89a2a356d94116c0b00aa999b6d91b5fc25a (patch)
tree8bd53e8221d81fcc44cd9e3dd2d68f0423946878
parentd510f6871563f39e390feabb12687a7918b9d7a5 (diff)
downloadbeignet-2abf89a2a356d94116c0b00aa999b6d91b5fc25a.tar.gz
Optimize clEnqueueWriteImageByKernel and clEnqueuReadImageByKernel.
1. Only copy the data by origin and region defined. 2. Add clFinish to guarantee the kernel copying is finished when blocking writing. Signed-off-by: Yan Wang <yan.wang@linux.intel.com> Reviewed-by: Yang Rong <rong.r.yang@intel.com>
-rw-r--r--src/cl_api_mem.c25
1 files changed, 18 insertions, 7 deletions
diff --git a/src/cl_api_mem.c b/src/cl_api_mem.c
index 00567b92..1daf4039 100644
--- a/src/cl_api_mem.c
+++ b/src/cl_api_mem.c
@@ -1857,23 +1857,28 @@ clEnqueueReadImageByKernel(cl_command_queue command_queue,
if (image->tmp_ker_buf)
clReleaseMemObject(image->tmp_ker_buf);
- image->tmp_ker_buf = clCreateBuffer(command_queue->ctx, CL_MEM_ALLOC_HOST_PTR,
- mem->size, NULL, &err);
+ size_t buf_size = region[0] * region[1] * region[2] * image->bpp;
+ image->tmp_ker_buf = clCreateBuffer(command_queue->ctx, CL_MEM_USE_HOST_PTR,
+ buf_size, ptr, &err);
if (image->tmp_ker_buf == NULL || err != CL_SUCCESS) {
image->tmp_ker_buf = NULL;
return err;
}
+ cl_event e;
err = clEnqueueCopyImageToBuffer(command_queue, mem, image->tmp_ker_buf, origin,
- region, 0, 0, NULL, NULL);
+ region, 0, num_events_in_wait_list, event_wait_list, &e);
if (err != CL_SUCCESS) {
clReleaseMemObject(image->tmp_ker_buf);
+ clReleaseEvent(e);
image->tmp_ker_buf = NULL;
return err;
}
- return clEnqueueReadBuffer(command_queue, image->tmp_ker_buf, blocking_read, 0,
- mem->size, ptr, num_events_in_wait_list, event_wait_list, event);
+ err = clEnqueueReadBuffer(command_queue, image->tmp_ker_buf, blocking_read, 0,
+ buf_size, ptr, 1, &e, event);
+ clReleaseEvent(e);
+ return err;
}
cl_int
@@ -2064,14 +2069,20 @@ clEnqueueWriteImageByKernel(cl_command_queue command_queue,
if (image->tmp_ker_buf)
clReleaseMemObject(image->tmp_ker_buf);
- image->tmp_ker_buf = clCreateBuffer(command_queue->ctx, CL_MEM_USE_HOST_PTR, mem->size, (void*)ptr, &err);
+ size_t buf_size = region[0] * region[1] * region[2] * image->bpp;
+ image->tmp_ker_buf = clCreateBuffer(command_queue->ctx, CL_MEM_USE_HOST_PTR, buf_size, (void*)ptr, &err);
if (image->tmp_ker_buf == NULL || err != CL_SUCCESS) {
image->tmp_ker_buf = NULL;
return err;
}
- return clEnqueueCopyBufferToImage(command_queue, image->tmp_ker_buf, mem, 0, origin, region,
+ err = clEnqueueCopyBufferToImage(command_queue, image->tmp_ker_buf, mem, 0, origin, region,
num_events_in_wait_list, event_wait_list, event);
+
+ if (blocking_write)
+ err = clFinish(command_queue);
+
+ return err;
}
cl_int