我正在编写一个包含大量函数调用的相当大的 OpenCL 程序。我一直遇到 CL_OUT_OF_RESOURCES 错误的问题,但我设法用一个简单的 printf 语句解决了这个问题。这是有问题的代码片段:
...
const float color = raytrace(depthMap, triangles, ...tonMoreParameters...);
if (i == 1234) {
printf("hello\n");
}
outImage[i] = color;
...
这很好用,但是如果我删除 printf 函数,程序就会崩溃。如果我保留它,它不会。当它崩溃时,它会给出一个 CL_OUT_OF_RESOURCES 错误。谁能解释为什么添加 printf 会使程序不会耗尽资源?如果没有这个无用的 printf,我怎样才能完成这项工作?
相关规格:
- OpenCL 1.2
- 英伟达 GTX 660
- 使用 Java JOCL 作为宿主代码
编辑:
我注意到将 printf 语句放在其他地方会改变代码的运行方式。一些 printf 语句会导致程序输出不同的数字结果,而另一些会导致程序崩溃。
即使更改从未执行的代码也会极大地改变计算。就好像更改任何代码都会随机化它的执行方式。
这是显卡故障的征兆吗?或者可能是 OpenCL 编译器中的错误?
编辑 2
事实证明,递归不是问题。我删除了所有递归调用,但 printfs 和其他无害的更改仍然会根据代码的放置位置改变代码的运行方式。
这绝对是编译时的问题。