summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJunyan He <junyan.he@intel.com>2016-04-18 22:30:52 +0800
committerJunyan He <junyan.he@intel.com>2016-04-18 22:30:52 +0800
commitfb170708f26dd6f327fab8cabfde3d9bfa12e2b2 (patch)
tree61a11d209851ae29c4db133ab835838a04732fbd
parent881f9107b6e4f2c35324160e4fbfff6ca43f05cd (diff)
kernel info
-rw-r--r--libclapi/cl_kernel.c73
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;
+}
+