OpenCL 查询和管理内核对象

一旦创建了内核对象,开发人员如果想知道内核对象的一些属性信息,可以使用如下函数查询内核对象的属性信息:

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查询参数

函数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()意义一样,在此就不赘述。

。其他参数与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()意义一样,在此就不赘述。

clGetKernelArgInfo查询参数

下面的例子展示了如何使用上述三个函数来查询有关的属性信息:

……
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是,则释放内核对象。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程