[Beignet] [PATCH] Add some API's OpenCL 1.2 parameter support.

Yang Rong rong.r.yang at intel.com
Fri Jun 20 09:15:44 PDT 2014


Support CL_PROGRAM_KERNEL_NAMES and CL_PROGRAM_NUM_KERNELS in API clGetProgramInfo,
and CL_DOUBLE_FP_CONFIG in API clGetDeviceInfo.
Also fix a bug of CL_MEM_HOST_PTR in API clGetMemObjectInfo.

Signed-off-by: Yang Rong <rong.r.yang at intel.com>
---
 src/cl_api.c       |  5 +++++
 src/cl_device_id.c |  1 +
 src/cl_device_id.h |  1 +
 src/cl_gt_device.h |  1 +
 src/cl_mem.c       |  3 ++-
 src/cl_program.c   | 41 +++++++++++++++++++++++++++++++++++++++++
 src/cl_program.h   |  6 ++++++
 7 files changed, 57 insertions(+), 1 deletion(-)

diff --git a/src/cl_api.c b/src/cl_api.c
index d4d8d7c..31ce6bc 100644
--- a/src/cl_api.c
+++ b/src/cl_api.c
@@ -1058,12 +1058,17 @@ clGetProgramInfo(cl_program       program,
   } else if (param_name == CL_PROGRAM_DEVICES) {
     cl_device_id dev_id = program->ctx->device;
     FILL_GETINFO_RET (cl_device_id, 1, &dev_id, CL_SUCCESS);
+  } else if (param_name == CL_PROGRAM_NUM_KERNELS) {
+    cl_uint kernels_num = program->ker_n;
+    FILL_GETINFO_RET (cl_uint, 1, &kernels_num, CL_SUCCESS);
   } else if (param_name == CL_PROGRAM_SOURCE) {
 
     if (!program->source)
       FILL_GETINFO_RET (char, 1, &ret_str, CL_SUCCESS);
     FILL_GETINFO_RET (char, (strlen(program->source) + 1),
                    program->source, CL_SUCCESS);
+  } else if(param_name == CL_PROGRAM_KERNEL_NAMES) {
+    cl_program_get_kernel_names(program, param_value_size, (char *)param_value, param_value_size_ret);
   } else if (param_name == CL_PROGRAM_BINARY_SIZES) {
     if (program->binary == NULL){
       if( program->binary_type == CL_PROGRAM_BINARY_TYPE_EXECUTABLE) {
diff --git a/src/cl_device_id.c b/src/cl_device_id.c
index af8e90c..771eb5c 100644
--- a/src/cl_device_id.c
+++ b/src/cl_device_id.c
@@ -373,6 +373,7 @@ cl_get_device_info(cl_device_id     device,
     DECL_FIELD(MEM_BASE_ADDR_ALIGN, mem_base_addr_align)
     DECL_FIELD(MIN_DATA_TYPE_ALIGN_SIZE, min_data_type_align_size)
     DECL_FIELD(SINGLE_FP_CONFIG, single_fp_config)
+    DECL_FIELD(DOUBLE_FP_CONFIG, double_fp_config)
     DECL_FIELD(GLOBAL_MEM_CACHE_TYPE, global_mem_cache_type)
     DECL_FIELD(GLOBAL_MEM_CACHELINE_SIZE, global_mem_cache_line_size)
     DECL_FIELD(GLOBAL_MEM_CACHE_SIZE, global_mem_cache_size)
diff --git a/src/cl_device_id.h b/src/cl_device_id.h
index a5449a7..3228a68 100644
--- a/src/cl_device_id.h
+++ b/src/cl_device_id.h
@@ -61,6 +61,7 @@ struct _cl_device_id {
   cl_uint  mem_base_addr_align;
   cl_uint  min_data_type_align_size;
   cl_device_fp_config single_fp_config;
+  cl_device_fp_config double_fp_config;
   cl_device_mem_cache_type global_mem_cache_type;
   cl_uint  global_mem_cache_line_size;
   cl_ulong global_mem_cache_size;
diff --git a/src/cl_gt_device.h b/src/cl_gt_device.h
index b8bda5e..08785a6 100644
--- a/src/cl_gt_device.h
+++ b/src/cl_gt_device.h
@@ -51,6 +51,7 @@
 .mem_base_addr_align = sizeof(cl_long) * 16 * 8,
 .min_data_type_align_size = sizeof(cl_long) * 16,
 .single_fp_config = 0, /* XXX */
+.double_fp_config = 0,
 .global_mem_cache_type = CL_READ_WRITE_CACHE,
 .global_mem_size = 1024 * 1024 * 1024,
 .max_constant_buffer_size = 512 << 10,
diff --git a/src/cl_mem.c b/src/cl_mem.c
index ae63137..c54759a 100644
--- a/src/cl_mem.c
+++ b/src/cl_mem.c
@@ -75,6 +75,7 @@ cl_get_mem_object_info(cl_mem mem,
                 void *param_value,
                 size_t *param_value_size_ret)
 {
+  struct _cl_mem_buffer* buf = (struct _cl_mem_buffer*)mem;
   switch(param_name)
   {
     FIELD_SIZE(MEM_TYPE, cl_mem_object_type);
@@ -102,7 +103,7 @@ cl_get_mem_object_info(cl_mem mem,
     *((size_t *)param_value) = mem->size;
     break;
   case CL_MEM_HOST_PTR:
-    *((size_t *)param_value) = (size_t)mem->host_ptr;
+    *((size_t *)param_value) = (size_t)mem->host_ptr + buf->sub_offset;
     break;
   case CL_MEM_MAP_COUNT:
     *((cl_uint *)param_value) = mem->map_ref;
diff --git a/src/cl_program.c b/src/cl_program.c
index 0dcc59a..7888a8f 100644
--- a/src/cl_program.c
+++ b/src/cl_program.c
@@ -713,3 +713,44 @@ error:
 
   return CL_OUT_OF_HOST_MEMORY;
 }
+
+LOCAL void
+cl_program_get_kernel_names(cl_program p, size_t size, char *names, size_t *size_ret)
+{
+  int i = 0;
+  const char *ker_name = NULL;
+  size_t len = 0;
+  *size_ret = 0;
+
+  if(p->ker == NULL) {
+    return;
+  }
+
+  ker_name = cl_kernel_get_name(p->ker[i]);
+  len = strlen(ker_name);
+  if(names) {
+    strncpy(names, cl_kernel_get_name(p->ker[0]), size - 1);
+    if(size < len - 1) {
+      if(size_ret) *size_ret = size;
+      return;
+    }
+    size = size - len - 1;  //sub \0
+  }
+  if(size_ret) *size_ret = strlen(ker_name) + 1;  //add NULL
+
+  for (i = 1; i < p->ker_n; ++i) {
+    ker_name = cl_kernel_get_name(p->ker[i]);
+    len = strlen(ker_name);
+    if(names) {
+      strncat(names, ";", size);
+      if(size >= 1)
+        strncat(names, ker_name, size - 1);
+      if(size < len + 1) {
+        if(size_ret) *size_ret = size;
+        break;
+      }
+      size = size - len - 1;
+    }
+    if(size_ret) *size_ret += len + 1; //add ';'
+  }
+}
diff --git a/src/cl_program.h b/src/cl_program.h
index 52d1ac1..d0336d5 100644
--- a/src/cl_program.h
+++ b/src/cl_program.h
@@ -125,5 +125,11 @@ cl_program_link(cl_context            context,
                 const cl_program *    input_programs,
                 const char *          options,
                 cl_int*               errcode_ret);
+/* Get the kernel names in program */
+extern void
+cl_program_get_kernel_names(cl_program p,
+                            size_t size,
+                            char *names,
+                            size_t *size_ret);
 #endif /* __CL_PROGRAM_H__ */
 
-- 
1.8.3.2



More information about the Beignet mailing list