[v5,7/7] Optimize clEnqueueWriteImageByKernel and clEnqueuReadImageByKernel.

Submitted by Yan Wang on June 13, 2017, 7:45 a.m.

Details

Message ID 1497339939-20156-1-git-send-email-yan.wang@linux.intel.com
State New
Series "Series without cover letter"
Headers show

Commit Message

Yan Wang June 13, 2017, 7:45 a.m.
From: Yan Wang <yan.wang@linux.intel.com>

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>
---
 src/cl_api_mem.c | 25 ++++++++++++++++++-------
 1 file changed, 18 insertions(+), 7 deletions(-)

Patch hide | download patch | download mbox

diff --git a/src/cl_api_mem.c b/src/cl_api_mem.c
index 00567b9..1daf403 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

Comments

Yang, Rong R June 13, 2017, 8:06 a.m.
The patchset LGTM, pushed, thanks.

> -----Original Message-----

> From: Beignet [mailto:beignet-bounces@lists.freedesktop.org] On Behalf Of

> yan.wang@linux.intel.com

> Sent: Tuesday, June 13, 2017 15:46

> To: beignet@lists.freedesktop.org

> Cc: Yan Wang <yan.wang@linux.intel.com>

> Subject: [Beignet] [PATCH v5 7/7] Optimize clEnqueueWriteImageByKernel

> and clEnqueuReadImageByKernel.

> 

> From: Yan Wang <yan.wang@linux.intel.com>

> 

> 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>

> ---

>  src/cl_api_mem.c | 25 ++++++++++++++++++-------

>  1 file changed, 18 insertions(+), 7 deletions(-)

> 

> diff --git a/src/cl_api_mem.c b/src/cl_api_mem.c index 00567b9..1daf403

> 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

> --

> 2.7.4

> 

> _______________________________________________

> Beignet mailing list

> Beignet@lists.freedesktop.org

> https://lists.freedesktop.org/mailman/listinfo/beignet