一旦创建了内核对象,开发人员如果想知道内核对象的一些属性信息,可以使用如下函数查询内核对象的属性信息:
cl_int clGetKernelInfo(cl_kernel kernel,
cl_kernel_info param_name,
size_t param_value_size,
void *param_value,
size_t *param_value_size_ret)
参数param_name为查询内核对象的属性名称,可接受的参数见表3-12。参数param_value为存储结果的位置指针。参数param_value_size为参数param_value的字节数。参数param_value_size_ret为实际写入的字节数。
函数clGetKernelInfo()不能查询特定于某个设备的内核对象的信息。例如,如果想知道如何将一个并行负载分派到执行内核的多个不同设备上,那该如何处理呢?在OpenCL中提供了如下函数可以查询特定于某个设备的内核对象属性信息:
cl_int clGetKernelWorkGroupInfo(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)
参数device为内核对象关联的设备列表中的一个特定设备。参数param_name为查询内核工作组信息的属性名称,可接受的参数见下表。其他参数与clGetKernelInfo()意义一样,在此就不赘述。
除了可以查询内核对象的属性信息,还可以查询内核函数参数信息。OpenCL提供如下函数来实现对内核函数参数属性查询:
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)
参数arg_index为参数索引。参数param_name为查询内核函数参数的属性名称,可接受的参数见下表。其他参数与clGetKernelInfo()意义一样,在此就不赘述。
下面的例子展示了如何使用上述三个函数来查询有关的属性信息:
……
size_t size;
char *KernelName;
char *ArgName;
clGetKernelInfo(kernel, CL_KERNEL_FUNCTION_NAME, 0, NULL, &size);
KernelName = (char *)malloc(size);
clGetKernelInfo(kernel, CL_KERNEL_FUNCTION_NAME, size,
KernelName, NULL);
clGetKernelWorkGroupInfo(kernel, device,
CL_KERNEL_PREFERRED_WORK_GROUP_SIZE_MULTIPLE,
sizeof(size_t), &size, NULL);
clGetKernelArgInfo(kernel, 0, CL_KERNEL_ARG_NAME, 0, NULL,
&size);
ArgName = (char *)malloc(size);
clGetKernelArgInfo(kernel, 0, CL_KERNEL_ARG_NAME, size, ArgName,
NULL);
……
上述代码分别查询了内核函数名称,指定设备执行内核的最优的工作组大小倍数,以及内核函数参数的名称。
对于创建的内核对象,可以使用如下参数操作内核对象的引用计数值:
cl_int clRetainkernel(cl_kernel kernel)
cl_int clReleasekernel (cl_kernel kernel)
clRetainkernel增加内核对象引用计数(引用计数+1),clReleasekernel减少内核对象引用计数(引用计数-1)。当引用计数值为0是,则释放内核对象。