我在 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
答案 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];"
"}"