Opencl 在内核中使用CL_khr_fp64时出现错误CL_无效的内核名称

Opencl 在内核中使用CL_khr_fp64时出现错误CL_无效的内核名称,opencl,Opencl,我在OpenCL内核中有一个错误,当我尝试使用cl\u khr\u fp64扩展时,内核编译并且构建日志为空,但是当我调用clCreateKernel时,我出现cl\u无效的\u内核\u名称错误 失败的源: #pragma OPENCL EXTENSION cl_khr_fp64 : enable __kernel void simple( __global char *x, __global char *y ){ int id = get_global_id(0); y[id]=2*x[id

我在OpenCL内核中有一个错误,当我尝试使用cl\u khr\u fp64扩展时,内核编译并且构建日志为空,但是当我调用
clCreateKernel
时,我出现cl\u无效的\u内核\u名称错误

失败的源:

#pragma OPENCL EXTENSION cl_khr_fp64 : enable

__kernel void simple( __global char *x, __global char *y ){
int id = get_global_id(0);
y[id]=2*x[id];
}
此源代码编译正确:

__kernel void simple( __global char *x, __global char *y ){
int id = get_global_id(0);
y[id]=2*x[id];
}

我使用的是OpenCL1.0TeslaC1060,它在cl\uDevice\uExtensions中有cl\uKHR\uFP64,驱动程序280.13和cl\uPlatform\uVersion=OpenCL1.1Cuda4.0.1

这正是困扰我的问题之一。我认为问题在于之前编译的代码被缓存在某个地方并被重用。因此,您的新更改会产生奇怪的错误

要修复它(不是一个“真正的解决方案”,但它对我有效),请尝试更改您的程序名(可能还有内核名),例如,如果程序是a.out,那么下次编译时将其设置为a2.out,并查看它是否已修复。我希望这有帮助


如果您找到更好的解决方案,请告诉我们。

问题是,在调用clCreateProgramWithSource之前,我们从源代码中删除了换行符。例如:来源:

"__kernel void f( __global char *x ){\nint id = get_global_id(0);\nx[id]=2;\n}"
变成:

"__kernel void simple( __global char *x, __global char *y ){"
"int id = get_global_id(0);"
"x[id]=2;}"
在添加预处理器指令之前,它不会引起任何问题

它是OpenCL预处理器,它实际上希望新行出现在那里。因此,应该写为:

"__kernel void simple( __global char *x, __global char *y ){\n"
"int id = get_global_id(0);\n"
"x[id]=2;}\n"

几天前我也遇到过这样的错误,我只是解决了它。所以我在这里分享我的解决方案,虽然它是非常有线的,我仍然不知道为什么

static inline void CreateOCLKernels()
{
    std::cout << "ocl lowlevelengine: Creating ocl kernels ...\n";
    filterSubsample_ocl_kernel = clCreateKernel(program, "filterSubsampleUChar4Kernel", &clError);
    checkErr(clError, "clCreateKernel0");
    filterSubsampleWithHoles_float4_ocl_kernel = clCreateKernel(program, "filterSubsampleWithHolesFloat4Kernel", &clError);
    checkErr(clError, "clCreateKernel1");
    filterSubsampleWithHoles_float_ocl_kernel = clCreateKernel(program, "filterSubsampleWithHolesFloatKernel", &clError);
    checkErr(clError, "clCreateKernel2");
    gradientX_ocl_kernel = clCreateKernel(program, "gradientXKernel", &clError);
    checkErr(clError, "clCreateKernel3");
    gradientY_ocl_kernel = clCreateKernel(program, "gradientYKernel", &clError);
    checkErr(clError, "clCreateKernel4");
    //type-dependent ocl memset kernels
    memset_ocl_kernel_Vector4s = clCreateKernel(program, "memsetKernelVector4s", &clError);
    checkErr(clError, "clCreateKernel5");
}
静态内联void CreateOCLKernels()
{

std::cout我想您应该使用字符串编写OpenCL代码

std::string code =
"#pragma OPENCL EXTENSION cl_khr_fp64 : enable"
"__kernel void simple( __global char *x, __global char *y )"
"{"
"int id = get_global_id(0);"
"y[id]=2*x[id];"
"}"
只需在#pragma行的末尾添加“\n

std::string code =
"#pragma OPENCL EXTENSION cl_khr_fp64 : enable\n"
"__kernel void simple( __global char *x, __global char *y )"
"{"
"int id = get_global_id(0);"
"y[id]=2*x[id];"
"}"

只是澄清一下-您知道您的编译在第一种情况下成功,因为您正在检查clBuildProgram设置的错误代码,对吗?编译步骤返回CL_成功,但我也检查了构建日志您是说如果您只是删除CL_khr_fp64行,clCreateKernel返回CL_成功吗?我想郑是说compilation在这两种情况下都成功,但在第一种情况下,当他调用
clCreateKernel(…,“simple”,…)
时,他得到
CL\u INVALID\u KERNEL\u NAME
。第二种情况成功。珍,这是你的情况吗?这是@James的情况。这两个示例都可以编译,但使用CL\u khr\u fp64,我在clCreateKernel上得到CL\u INVALID\u KERNEL\u NAME。