diff options
Diffstat (limited to 'runtime/gen/cl_kernel_gen.c')
-rw-r--r-- | runtime/gen/cl_kernel_gen.c | 131 |
1 files changed, 88 insertions, 43 deletions
diff --git a/runtime/gen/cl_kernel_gen.c b/runtime/gen/cl_kernel_gen.c index 7ff425e1..ce8cbf64 100644 --- a/runtime/gen/cl_kernel_gen.c +++ b/runtime/gen/cl_kernel_gen.c @@ -107,6 +107,17 @@ cl_kernel_delete_gen(cl_device_id device, cl_kernel kernel) kernel_gen->image_info = NULL; } + if (kernel_gen->printf_ids) { + assert(kernel_gen->printf_num > 0); + CL_FREE(kernel_gen->printf_ids); + } + kernel_gen->printf_ids = NULL; + if (kernel_gen->printf_strings) { + assert(kernel_gen->printf_num > 0); + CL_FREE(kernel_gen->printf_strings); + } + kernel_gen->printf_strings = NULL; + CL_FREE(kernel_gen); } @@ -153,56 +164,16 @@ cl_kernel_get_info_gen(cl_device_id device, cl_kernel kernel, cl_uint param_name } static cl_int -cl_program_gen_get_kernel_func_cl_info(cl_device_id device, cl_kernel kernel) +cl_program_gen_get_kernel_func_arg_info(cl_kernel kernel, void *desc, cl_uint desc_size, + cl_program_gen prog_gen, cl_kernel_gen kernel_gen) { - cl_program prog = kernel->program; - cl_program_gen prog_gen; - cl_kernel_gen kernel_gen; - cl_int offset; - void *desc; void *ptr; - cl_char *name; - cl_uint name_size; - cl_uint desc_size; - cl_uint desc_type; cl_uint wg_sz_size; cl_uint attr_size; cl_uint arg_info_size; - int i; char *arg_type_qual_str; char *arg_access_qualifier_str; - - DEV_PRIVATE_DATA(prog, device, prog_gen); - DEV_PRIVATE_DATA(kernel, device, kernel_gen); - - assert(kernel->name); - - if (prog_gen->func_cl_info == NULL) - return CL_SUCCESS; - - offset = 0; - desc = NULL; - while (offset < prog_gen->func_cl_info_data->d_size) { - name_size = *(cl_uint *)(prog_gen->func_cl_info_data->d_buf + offset); - desc_size = *(cl_uint *)(prog_gen->func_cl_info_data->d_buf + offset + sizeof(cl_uint)); - desc_type = *(cl_uint *)(prog_gen->func_cl_info_data->d_buf + offset + 2 * sizeof(cl_uint)); - name = prog_gen->func_cl_info_data->d_buf + offset + sizeof(cl_uint) * 3; - - if (desc_type != GEN_NOTE_TYPE_CL_INFO) { - offset += 3 * sizeof(cl_uint) + ALIGN(name_size, 4) + ALIGN(desc_size, 4); - continue; - } - - if (strcmp((char *)name, (char *)kernel->name) == 0) { // Find the kernel info slot - desc = prog_gen->func_cl_info_data->d_buf + offset + sizeof(cl_uint) * 3 + ALIGN(name_size, 4); - break; - } - - offset += 3 * sizeof(cl_uint) + ALIGN(name_size, 4) + ALIGN(desc_size, 4); - } - - if (desc == NULL) - return CL_SUCCESS; + int i; ptr = desc; attr_size = *(cl_uint *)ptr; @@ -316,6 +287,80 @@ cl_program_gen_get_kernel_func_cl_info(cl_device_id device, cl_kernel kernel) } static cl_int +cl_program_gen_get_kernel_func_cl_info(cl_device_id device, cl_kernel kernel) +{ + cl_program prog = kernel->program; + cl_program_gen prog_gen; + cl_kernel_gen kernel_gen; + cl_uint name_size; + cl_uint desc_size; + void *desc; + cl_uint desc_type; + cl_int offset; + cl_char *name; + int i; + cl_int ret = CL_SUCCESS; + cl_bool already_set = CL_FALSE; + + DEV_PRIVATE_DATA(prog, device, prog_gen); + DEV_PRIVATE_DATA(kernel, device, kernel_gen); + + assert(kernel->name); + + if (prog_gen->func_cl_info == NULL) + return CL_SUCCESS; + + offset = 0; + desc = NULL; + while (offset < prog_gen->func_cl_info_data->d_size) { + name_size = *(cl_uint *)(prog_gen->func_cl_info_data->d_buf + offset); + desc_size = *(cl_uint *)(prog_gen->func_cl_info_data->d_buf + offset + sizeof(cl_uint)); + desc_type = *(cl_uint *)(prog_gen->func_cl_info_data->d_buf + offset + 2 * sizeof(cl_uint)); + name = prog_gen->func_cl_info_data->d_buf + offset + sizeof(cl_uint) * 3; + desc = prog_gen->func_cl_info_data->d_buf + offset + sizeof(cl_uint) * 3 + ALIGN(name_size, 4); + + if (strcmp((char *)name, (char *)kernel->name) != 0) { // Find the kernel info slot + offset += 3 * sizeof(cl_uint) + ALIGN(name_size, 4) + ALIGN(desc_size, 4); + continue; + } + + if (desc_type == GEN_NOTE_TYPE_CL_PRINTF) { + kernel_gen->printf_bti = *(cl_uint *)desc; + desc += sizeof(cl_uint); + kernel_gen->printf_num = *(cl_uint *)desc; + desc += sizeof(cl_uint); + + kernel_gen->printf_strings = CL_CALLOC(kernel_gen->printf_num, sizeof(char *)); + kernel_gen->printf_ids = CL_CALLOC(kernel_gen->printf_num, sizeof(cl_uint)); + + if (kernel_gen->printf_strings == NULL) + return CL_OUT_OF_HOST_MEMORY; + if (kernel_gen->printf_ids == NULL) + return CL_OUT_OF_HOST_MEMORY; + + for (i = 0; i < kernel_gen->printf_num; i++) { + kernel_gen->printf_ids[i] = *(cl_uint *)desc; + desc += sizeof(cl_uint); + kernel_gen->printf_strings[i] = desc; + desc += strlen(desc) + 1; + } + } else if (desc_type == GEN_NOTE_TYPE_CL_INFO) { + if (already_set) { + /* Can not contain two CL info for one kernel */ + return CL_INVALID_KERNEL_DEFINITION; + } + ret = cl_program_gen_get_kernel_func_arg_info(kernel, desc, desc_size, prog_gen, kernel_gen); + if (ret != CL_SUCCESS) + return ret; + } + + offset += 3 * sizeof(cl_uint) + ALIGN(name_size, 4) + ALIGN(desc_size, 4); + } + + return CL_SUCCESS; +} + +static cl_int cl_program_gen_get_one_kernel_func(cl_device_id device, cl_kernel kernel, GElf_Sym *p_sym_entry) { cl_program prog = kernel->program; |