diff options
author | Junyan He <junyan.he@intel.com> | 2016-04-18 22:30:52 +0800 |
---|---|---|
committer | Junyan He <junyan.he@intel.com> | 2016-04-18 22:30:52 +0800 |
commit | fb170708f26dd6f327fab8cabfde3d9bfa12e2b2 (patch) | |
tree | 61a11d209851ae29c4db133ab835838a04732fbd | |
parent | 881f9107b6e4f2c35324160e4fbfff6ca43f05cd (diff) |
kernel info
-rw-r--r-- | libclapi/cl_kernel.c | 73 |
1 files changed, 69 insertions, 4 deletions
diff --git a/libclapi/cl_kernel.c b/libclapi/cl_kernel.c index cfffb72c..3093d283 100644 --- a/libclapi/cl_kernel.c +++ b/libclapi/cl_kernel.c @@ -250,6 +250,39 @@ static cl_int cl_get_kernel_info(cl_kernel kernel, cl_kernel_info param_name, si } } +static cl_int cl_get_kernel_arg_info(cl_kernel k, cl_uint arg_index, cl_kernel_arg_info param_name, + size_t param_value_size, void *param_value, size_t *param_value_size_ret) +{ + cl_argument arg = NULL; + + if (arg_index >= k->arg_num) { + return CL_INVALID_ARG_INDEX; + } + + arg = k->args[arg_index]; + + if (arg->name == NULL || arg->type_name == NULL) { + /* If we have no name, we consider arg info is unavaible. */ + return CL_KERNEL_ARG_INFO_NOT_AVAILABLE; + } + + switch (param_name) { + case CL_KERNEL_ARG_ADDRESS_QUALIFIER: + FILL_GETINFO_RET(cl_kernel_arg_address_qualifier, 1, &arg->qualifier, CL_SUCCESS); + case CL_KERNEL_ARG_ACCESS_QUALIFIER: + FILL_GETINFO_RET(cl_kernel_arg_access_qualifier, 1, &arg->access, CL_SUCCESS); + case CL_KERNEL_ARG_TYPE_QUALIFIER: + FILL_GETINFO_RET(cl_kernel_arg_type_qualifier, 1, &arg->type_qualifier, CL_SUCCESS); + case CL_KERNEL_ARG_NAME: + FILL_GETINFO_RET(char, strlen(arg->name) + 1, arg->name, CL_SUCCESS); + case CL_KERNEL_ARG_TYPE_NAME: + FILL_GETINFO_RET(char, strlen(arg->type_name) + 1, arg->type_name, CL_SUCCESS); + } + + assert(0); + return CL_INVALID_VALUE; +} + static cl_int cl_get_kernel_workgroup_info(cl_kernel kernel, cl_device_id device, cl_kernel_work_group_info param_name, size_t param_value_size, void* param_value, size_t* param_value_size_ret) @@ -495,6 +528,8 @@ LOCAL cl_kernel cl_create_kernel(cl_program p, const char* kernel_name, cl_int* } if (type_name_sz == 0) { + /* We just get the type name once, though the name maybe different, + but that have no effect for kernel run. */ err = p->ctx->devices[i]->driver->get_kernel_arg_type_name(k, p->ctx->devices[i], j, NULL, 0, &type_name_sz); if (err == CL_SUCCESS && type_name_sz != 0) { type_name = cl_malloc(type_name_sz * sizeof(char)); @@ -517,10 +552,13 @@ LOCAL cl_kernel cl_create_kernel(cl_program p, const char* kernel_name, cl_int* err = CL_INVALID_PROGRAM_EXECUTABLE; goto error; } - if ((qualifier && qualifier != ql) - || (access && access != ac) - || (type && type != ty) - || (type_qualifier && type_qualifier != tyq) + + /* If we do not add -cl-kernel-arg-info as build opt, we can not get qualifier, access, type and + type_qualifier, but arg size is mandatory. */ + if ((qualifier && ql && qualifier != ql) + || (access && ac && access != ac) + || (type && ty && type != ty) + || (type_qualifier && tyq && type_qualifier != tyq) || (arg_size && arg_size != asz)) { // Has something different err = CL_INVALID_KERNEL_DEFINITION; goto error; @@ -1007,3 +1045,30 @@ error: return err; } +cl_int +clGetKernelArgInfo(cl_kernel kernel, + cl_uint arg_index, + cl_kernel_arg_info param_name, + size_t param_value_size, + void * param_value, + size_t * param_value_size_ret) +{ + cl_int err = CL_SUCCESS; + CHECK_KERNEL(kernel); + + if (param_name != CL_KERNEL_ARG_ADDRESS_QUALIFIER + && param_name != CL_KERNEL_ARG_ACCESS_QUALIFIER + && param_name != CL_KERNEL_ARG_TYPE_NAME + && param_name != CL_KERNEL_ARG_TYPE_QUALIFIER + && param_name != CL_KERNEL_ARG_NAME) { + err = CL_INVALID_VALUE; + goto error; + } + + err = cl_get_kernel_arg_info(kernel, arg_index, param_name, param_value_size, + param_value, param_value_size_ret); + +error: + return err; +} + |