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