Kernel OpenCL内核名无效

Kernel OpenCL内核名无效,kernel,opencl,Kernel,Opencl,我正在用NVIDIA Tesla K20c卡将OpenCL代码从我的Mac转换成Linux机,在构建简单内核时遇到了一个障碍。我的核心代码如下: char kernel[1024] = "#pragma OPENCL EXTENSION cl_khr_fp64: enable \ \ kernel void diff(global double* u, \

我正在用NVIDIA Tesla K20c卡将OpenCL代码从我的Mac转换成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\u SUCCESS
,来自
clbuildprogramminfo
的日志为空,但
clCreateKernel
返回
CL\u无效的内核名称
。知道为什么吗?我已经做了一段时间了,什么也找不到。如果我将所有的double都改为float,并删除pragma,那么问题就会消失,并且工作正常。那么,布拉格马是罪魁祸首吗?如果是这样的话,我该如何正确执行呢?

整个
内核[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.;            \
}";

整个
内核[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.;            \
}";

只要删除pragma,而不是double,如果它给出相同的错误,请为您的设备编译器寻找合适的换行符(可能不同于您的编程环境)。只要删除pragma,而不是double,如果它给出相同的错误,请为您的设备编译器寻找合适的换行符(可能不同于您的编程环境)。