OpenCL无效的内核名称

时间:2016-06-24 17:37:40

标签: kernel opencl

我将OpenCL代码从我的Mac转换为带有NVIDIA Tesla K20c卡的Linux机箱,并且在构建简单内核时遇到了麻烦。我的内核代码是这样的:

char kernel[1024] =
"#pragma OPENCL EXTENSION cl_khr_fp64: enable \
                                              \
kernel void diff(global double* u,            \
                  int N,                      \
                  double dx,                  \
                  global double* du)          \
{                                             \
    size_t i = get_global_id(0);              \
    int ip = (i+1)%N;                         \
    int im = (i+N-1)%N;                       \
    du[i] = (u[ip] - u[im])/dx/2.;            \
}";

我称之为:

const char* srccode = kernel;
cl_program program = clCreateProgramWithSource(context, 1, &srccode, NULL, &err);
err = clBuildProgram(program, 0, NULL, NULL, NULL, NULL);
kernel = clCreateKernel(program, "diff", &err);

clBuildProgram返回CL_SUCCESSclBuildProgramInfo的日志为空,但clCreateKernel返回CL_INVALID_KERNEL_NAME。知道为什么吗?我已经敲打了一段时间而无法找到任何东西。如果我将所有双打更改为浮动并删除该pragma,问题就会消失,并且它可以正常工作。责任归于此吗?如果是这样,我该如何正确地做到这一点?

1 个答案:

答案 0 :(得分:2)

整个kernel[1024]字符串将在一行中结束,这对内核定义很好,但不适用于pragma - 在那里你需要结束行字符。固定版本看起来像这样:

char kernel[1024] =
"#pragma OPENCL EXTENSION cl_khr_fp64: enable \n\
                                              \
kernel void diff(global double* u,            \
                  int N,                      \
                  double dx,                  \
                  global double* du)          \
{                                             \
    size_t i = get_global_id(0);              \
    int ip = (i+1)%N;                         \
    int im = (i+N-1)%N;                       \
    du[i] = (u[ip] - u[im])/dx/2.;            \
}";