[Beignet] [PATCH V2] Support multi-source CL program

Zhigang Gong zhigang.gong at linux.intel.com
Tue Jun 18 22:17:00 PDT 2013


Pushed. Thanks for the patch and the review comments.

On Wed, Jun 19, 2013 at 12:56:08PM +0800, He Junyan wrote:
> Reviewed, OK
> Thanks
> 
> On 06/19/2013 10:30 AM, Ruiling Song wrote:
> >Also fix several errors on clBuildProgram.
> >
> >v2: minor refine of cl_program_release_sources()
> >
> >Signed-off-by: Ruiling Song <ruiling.song at intel.com>
> >---
> >  src/cl_api.c     |    5 ++++-
> >  src/cl_program.c |   38 +++++++++++++++++++++-----------------
> >  src/cl_program.h |    3 +--
> >  3 files changed, 26 insertions(+), 20 deletions(-)
> >
> >diff --git a/src/cl_api.c b/src/cl_api.c
> >index f14bee4..d8787cd 100644
> >--- a/src/cl_api.c
> >+++ b/src/cl_api.c
> >@@ -696,6 +696,7 @@ clBuildProgram(cl_program            program,
> >    INVALID_VALUE_IF (num_devices > 1);
> >    INVALID_VALUE_IF (num_devices == 0 && device_list != NULL);
> >    INVALID_VALUE_IF (num_devices != 0 && device_list == NULL);
> >+  INVALID_VALUE_IF (pfn_notify  == 0 && user_data   != NULL);
> >    /* Everything is easy. We only support one device anyway */
> >    if (num_devices != 0) {
> >@@ -706,7 +707,9 @@ clBuildProgram(cl_program            program,
> >    /* TODO support create program from binary */
> >    assert(program->source_type == FROM_LLVM ||
> >           program->source_type == FROM_SOURCE);
> >-  cl_program_build(program, options);
> >+  if((err = cl_program_build(program, options)) != CL_SUCCESS) {
> >+    goto error;
> >+  }
> >    program->is_built = CL_TRUE;
> >    if (pfn_notify) pfn_notify(program, user_data);
> >diff --git a/src/cl_program.c b/src/cl_program.c
> >index 6acf31f..1b49b84 100644
> >--- a/src/cl_program.c
> >+++ b/src/cl_program.c
> >@@ -36,13 +36,10 @@
> >  static void
> >  cl_program_release_sources(cl_program p)
> >  {
> >-  size_t i;
> >-  if (p->sources == NULL) return;
> >-  for (i = 0; i < p->src_n; ++i)
> >-    if (p->sources[i]) cl_free(p->sources[i]);
> >-  cl_free(p->sources);
> >-  p->sources = NULL;
> >-  p->src_n = 0;
> >+  if (p->source) {
> >+    cl_free(p->source);
> >+    p->source = NULL;
> >+  }
> >  }
> >  LOCAL void
> >@@ -234,27 +231,36 @@ cl_program_create_from_source(cl_context ctx,
> >    cl_program program = NULL;
> >    cl_int err = CL_SUCCESS;
> >    cl_uint i;
> >-
> >+  int32_t * lens = NULL;
> >+  int32_t len_total = 0;
> >    assert(ctx);
> >-
> >+  char * p = NULL;
> >    // the real compilation step will be done at build time since we do not have
> >    // yet the compilation options
> >    program = cl_program_new(ctx);
> >-  TRY_ALLOC (program->sources, cl_calloc(count, sizeof(char*)));
> >+  TRY_ALLOC (lens, cl_calloc(count, sizeof(int32_t)));
> >    for (i = 0; i < (int) count; ++i) {
> >      size_t len;
> >      if (lengths == NULL || lengths[i] == 0)
> >        len = strlen(strings[i]);
> >      else
> >        len = lengths[i];
> >-    TRY_ALLOC (program->sources[i], cl_calloc(len+1, sizeof(char)));
> >-    memcpy(program->sources[i], strings[i], len);
> >-    program->sources[i][len] = 0;
> >+    lens[i] = len;
> >+    len_total += len;
> >    }
> >-  program->src_n = count;
> >+  TRY_ALLOC(program->source, cl_calloc(len_total+1, sizeof(char)));
> >+  p = program->source;
> >+  for (i = 0; i < (int) count; ++i) {
> >+    memcpy(p, strings[i], lens[i]);
> >+    p += lens[i];
> >+  }
> >+  *p = '\0';
> >+
> >    program->source_type = FROM_SOURCE;
> >  exit:
> >+  cl_free(lens);
> >+  lens = NULL;
> >    if (errcode_ret)
> >      *errcode_ret = err;
> >    return program;
> >@@ -270,9 +276,7 @@ cl_program_build(cl_program p, const char *options)
> >    cl_int err = CL_SUCCESS;
> >    if (p->source_type == FROM_SOURCE) {
> >-    /* XXX support multiple sources later */
> >-    FATAL_IF (p->src_n != 1, "Only ONE source file supported");
> >-    p->opaque = gbe_program_new_from_source(p->sources[0], 0, options, NULL, NULL);
> >+    p->opaque = gbe_program_new_from_source(p->source, 0, options, NULL, NULL);
> >      if (UNLIKELY(p->opaque == NULL)) {
> >        err = CL_INVALID_PROGRAM;
> >        goto error;
> >diff --git a/src/cl_program.h b/src/cl_program.h
> >index 161d858..3e3edab 100644
> >--- a/src/cl_program.h
> >+++ b/src/cl_program.h
> >@@ -47,8 +47,7 @@ struct _cl_program {
> >    cl_context ctx;         /* Its parent context */
> >    char *bin;              /* The program copied verbatim */
> >    size_t bin_sz;          /* Its size in memory */
> >-  char **sources;         /* Program sources */
> >-  size_t src_n;           /* Number of sources */
> >+  char *source;           /* Program sources */
> >    uint32_t ker_n;         /* Number of declared kernels */
> >    uint32_t source_type:2; /* Built from binary, source or LLVM */
> >    uint32_t is_built:1;    /* Did we call clBuildProgram on it? */
> 
> _______________________________________________
> Beignet mailing list
> Beignet at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/beignet


More information about the Beignet mailing list