在内核中使用cl_khr_fp64时出错CL_INVALID_KERNEL_NAME

时间:2011-11-22 08:33:53

标签: opencl

我在 OpenCL 内核中出错,当我尝试使用 cl_khr_fp64 扩展时,内核编译并且构建日志为空,但是当我调用{ {1}},我有 CL_INVALID_KERNEL_NAME 错误。

失败的来源:

clCreateKernel

此来源编译正确:

#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 1.0 特斯拉C1060 cl_khr_fp64 CL_DEVICE_EXTENSIONS ,驱动程序280.13和 CL_PLATFORM_VERSION = OpenCL 1.1 CUDA 4.0.1

4 个答案:

答案 0 :(得分:2)

问题是在调用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;}"

在我们添加preproccessor指令之前,它没有问题。

这是OpenCL预处理器,实际上需要换行。所以,它应该写成:

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

答案 1 :(得分:0)

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

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

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

答案 2 :(得分:0)

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

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");
}

这是我的原始代码,它是由某个类的构造函数调用的静态函数。可以毫无疑问地调用构造函数。但是,每次调用上面的函数时,我都会收到由opencl导致的“无效内核名称”错误,无法找到内核“filterSubsampleUChar4Kernel”。 我已经尝试了很多,但没有一个工作。但今天,偶尔,我尝试更改功能名称,然后我成功了。 我所做的只不过是将“filterSubsampleUChar4Kernel”更改为“filterSubsampleKernel”。我还尝试更改其他名称,例如。 “filterSubsampleKernel_test”,“filterSubsample1Kernel”。但他们没有工作。这很有线,不是吗?

答案 3 :(得分:0)

我猜您使用字符串编写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];"
"}"