Add some API's OpenCL 1.2 parameter support.
authorYang Rong <rong.r.yang@intel.com>
Fri, 20 Jun 2014 16:15:44 +0000 (00:15 +0800)
committerZhigang Gong <zhigang.gong@intel.com>
Fri, 20 Jun 2014 09:35:03 +0000 (17:35 +0800)
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.

v2:
also fix the utest get_mem_info.

Signed-off-by: Yang Rong <rong.r.yang@intel.com>
Signed-off-by: Zhigang Gong <zhigang.gong@linux.intel.com>
src/cl_api.c
src/cl_device_id.c
src/cl_device_id.h
src/cl_gt_device.h
src/cl_mem.c
src/cl_program.c
src/cl_program.h
utests/get_cl_info.cpp

index b8b4cfa..32f91d7 100644 (file)
@@ -1061,12 +1061,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) {
index 578b548..1a2565c 100644 (file)
@@ -374,6 +374,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)
index 769bfd2..5ce3cfb 100644 (file)
@@ -62,6 +62,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;
index 6d03123..f385815 100644 (file)
@@ -52,6 +52,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,
index 29d5faf..e0c4ec9 100644 (file)
@@ -71,6 +71,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);
@@ -98,7 +99,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;
index 0dcc59a..7888a8f 100644 (file)
@@ -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 ';'
+  }
+}
index 52d1ac1..d0336d5 100644 (file)
@@ -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__ */
 
index b2c1686..807739b 100644 (file)
@@ -583,7 +583,7 @@ void get_mem_info(void)
     expect_ref = 2048;
     maps.insert(make_pair(CL_MEM_SIZE,
                           (void *)(new Info_Result<size_t>(((size_t)expect_ref)))));
-    expect_ref = 0;
+    expect_ref = 1024;
     maps.insert(make_pair(CL_MEM_HOST_PTR,
                           (void *)(new Info_Result<size_t>(((size_t)expect_ref)))));
     expect_ref = 1;