[Beignet] [PATCH] Support multi-source CL program
Ruiling Song
ruiling.song at intel.com
Tue Jun 18 00:47:29 PDT 2013
Also fix several errors on clBuildProgram.
Signed-off-by: Ruiling Song <ruiling.song at intel.com>
---
src/cl_api.c | 5 ++++-
src/cl_program.c | 36 ++++++++++++++++++++----------------
src/cl_program.h | 3 +--
3 files changed, 25 insertions(+), 19 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..3149219 100644
--- a/src/cl_program.c
+++ b/src/cl_program.c
@@ -37,12 +37,9 @@ 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 == NULL) return;
+ 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? */
--
1.7.9.5
More information about the Beignet
mailing list