From a1f9bd02b1cc41fdded1a13c9077ba7d4971d9e6 Mon Sep 17 00:00:00 2001 From: Yang Rong Date: Sat, 21 Jun 2014 00:15:44 +0800 Subject: [PATCH] Add some API's OpenCL 1.2 parameter support. 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 Signed-off-by: Zhigang Gong --- 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 ++++++ utests/get_cl_info.cpp | 2 +- 8 files changed, 58 insertions(+), 2 deletions(-) diff --git a/src/cl_api.c b/src/cl_api.c index b8b4cfa..32f91d7 100644 --- a/src/cl_api.c +++ b/src/cl_api.c @@ -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) { diff --git a/src/cl_device_id.c b/src/cl_device_id.c index 578b548..1a2565c 100644 --- a/src/cl_device_id.c +++ b/src/cl_device_id.c @@ -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) diff --git a/src/cl_device_id.h b/src/cl_device_id.h index 769bfd2..5ce3cfb 100644 --- a/src/cl_device_id.h +++ b/src/cl_device_id.h @@ -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; diff --git a/src/cl_gt_device.h b/src/cl_gt_device.h index 6d03123..f385815 100644 --- a/src/cl_gt_device.h +++ b/src/cl_gt_device.h @@ -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, diff --git a/src/cl_mem.c b/src/cl_mem.c index 29d5faf..e0c4ec9 100644 --- a/src/cl_mem.c +++ b/src/cl_mem.c @@ -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; 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__ */ diff --git a/utests/get_cl_info.cpp b/utests/get_cl_info.cpp index b2c1686..807739b 100644 --- a/utests/get_cl_info.cpp +++ b/utests/get_cl_info.cpp @@ -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)expect_ref))))); - expect_ref = 0; + expect_ref = 1024; maps.insert(make_pair(CL_MEM_HOST_PTR, (void *)(new Info_Result(((size_t)expect_ref))))); expect_ref = 1; -- 2.7.4