在内核中使用cl_khr_fp64时出错CL_INVALID_KERNEL_NAME

问题描述 投票:10回答:4

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

失败的来源:

#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];
}

我正在使用OpenCL 1.0和Tesla C1060,它在CL_DEVICE_EXTENSIONS中有cl_khr_fp64,驱动程序280.13和CL_PLATFORM_VERSION = OpenCL 1.1 CUDA 4.0.1

opencl
4个回答
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;}"

在我们添加预处理器指令之前,它没有问题。

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

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

0
投票

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

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

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


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”。但他们没有工作。这很有线,不是吗?


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];"
"}"
© www.soinside.com 2019 - 2024. All rights reserved.