【问题标题】:OpenCL Build ErrorOpenCL 构建错误
【发布时间】:2013-11-25 22:44:11
【问题描述】:

如果我不小心在我的 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 最终版本就不会包含任何代码,而编译器 仍然 会导致此错误。即使创建一个新文件并将内容复制到其中,或者更改程序参数或名称也没有效果。我被这个错误困住了。重启电脑也不行。

编辑

我在 MacBook Pro 10.9 版上运行它

【问题讨论】:

  • 很简单,你并没有真正改变源代码。在将字符串发送到编译器之前检查字符串,您将看到进入编译器的实际代码。
  • 发送给编译器的代码是没有错误的更新代码。知道我正在使用 JOCL 编译内核可能会有所帮助。
  • 不可能编译一个空的.cl 文件并且编译器会抱怨内核引用了函数“f”。显然,您仍在编译旧的内核源代码。只需在编译之前将发送到编译器的源代码转储即可。
  • 我的意思是空的,.cl 文件不是空的,但所有的内核都是空的。在上面的示例中,这意味着删除“f(array);”行。我尝试在编译时打印源代码并且更改存在但错误仍然存​​在。
  • 有趣的是,如果我不正确地缩进随机行,它会起作用。

标签: java parallel-processing kernel opencl


【解决方案1】:

过去我在使用 OpenCL 缓存代码时遇到过问题,这解决了我的问题。

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

当然,这仅在您使用 NVIDIA 平台时才相关。

【讨论】:

  • 非常感谢,这解决了问题
猜你喜欢
  • 2017-11-25
  • 1970-01-01
  • 1970-01-01
  • 2015-05-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-26
相关资源
最近更新 更多