2013-11-21 60 views
0

如果我意外地在我的OpenCL内核中引用了一个不存在的函数,即使我修复了这个问题,编译器的行为就好像我没有。例如。OpenCL构建错误

__kernel void doSomething(__global unsigned int *array){ 
    f(array) 
} 

显然f不存在,我会得到一个错误。但是,如果我编写f方法,编译器会继续发出此错误。

Exception in thread "main" org.jocl.CLException: CL_BUILD_PROGRAM_FAILURE 
Build log for device 0: 
kernel referenced an external function f, that could not be found. 

不管我怎么改变,我可以删除任何内核的机构,以便最终.CL持有字面上没有代码,编译器仍然导致此错误。即使制作新文件并将内容复制到其中,或更改程序参数或名称也没有任何影响。我被这个bug困住了。重新启动计算机也不起作用。

编辑

我在MacBook Pro上,版本10.9

+0

很简单,你并没有真正改变源代码。在将它发送给编译器之前检查字符串,并且您将看到发送给编译器的实际代码。 – DarkZeros

+0

发送到编译器的代码是没有错误的更新代码。这可能有助于知道我正在使用JOCL来编译内核。 –

+0

编译一个空的'.cl'文件并且编译器抱怨引用函数“f”的内核是不可能的。显然你仍然在编译旧的内核源代码。只需在编译之前转储发送给编译器的源代码即可。 – DarkZeros

回答

1

我曾与OpenCL的缓存代码的问题,在过去,这解决了我的问题,运行此。

// Setting this environment variable forces the OpenCL 
// source code to be recompiled every time. 
setenv("CUDA_CACHE_DISABLE", "1", 1); 

当然,这只与使用NVIDIA平台有关。

+0

非常感谢,解决了这个问题 –