内核对象可以是一个通过命令队列发送到设备上执行的函数。
创建内核对象
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()来创建内核。