Kernel OpenCL内核名无效
我正在用NVIDIA Tesla K20c卡将OpenCL代码从我的Mac转换成Linux机,在构建简单内核时遇到了一个障碍。我的核心代码如下: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, \
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,如果它给出相同的错误,请为您的设备编译器寻找合适的换行符(可能不同于您的编程环境)。