OpenCL 创建内核对象

内核对象可以是一个通过命令队列发送到设备上执行的函数。

创建内核对象

OpenCL中,使用cl_kernel数据结构来表示内核对象。OpenCL使用如下函数来创建内核对象:

cl_kernel clCreateKernel(cl_program program,
                              const char *kernel_name,
                              cl_int *errcode_ret)
cl_intl clCreateKernelsInProgram(cl_program program,
                                        cl_uint num_kernels,
                                        cl_kernel *kernels,
                                        cl_uint *num_kernels_ret)

函数clCreateKernel()中,参数program为OpenCL 编译Program对象中构建的程序对象,里面包含了多个内核对象。参数kernel_name为程序对象中用__kerne(l 或kernel)地址限定符的内核对象名称。参数errcode_ret为函数执行返回状态。

函数clCreateKernelsInProgram()中,参数program为构建的程序对象。参数kernels为返回的内核对象列表,参数num_kernels为内核对象列表中的内核个数。参数num_kernels_ret为程序对象中的内核个数,如果为NULL则忽略这个参数。

例如,在kernel.cl中,有如下两个内核:

kernel void hello_kernel1(global const float *a,
                              global const *float b,
                              global float *result)
{
    ……
}
kernel void hello_kernel2(global const float *a,
                              global const *float b,
                              global float *result)
{
    ……
}

如果采用函数clCreateKernel()创建内核对象,则需要如下操作:

cl_kernel kernels[2];
kernel[0] = clCreateKernel(program, "hello_kernel1", &err);
kernel[1] = clCreateKernel(program, "hello_kernel2", &err);

如果采用函数clCreateKernelsInProgram()创建内核对象,则需要如下操作:

cl_kernel *kernels;
cl_uint numKernel;
//确定内核函数个数
er = clCreateKernelsInProgram(program, 0, NULL, &numKernel);
kernels = (cl_kernel *)mallocl(sizeof(cl_kernel) * numKernel);
err = clCreateKernelsInProgram(program, numKernel, kernels, NULL);

如果程序对象中有多个内核,如果采用clCreateKernelsInProgram()创建内核对象,内核列表中内核函数名称顺序并不是根据cl文件中内核书写顺序,而是依赖于实现。我们必须通过传递param_name参数CL_KERNEL_FUNCTION_NAME值来调用clGetKernelInfo函数以查询每个内核对象的函数名。所以,笔者更常用clCreateKernel()来创建内核。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程