非常奇怪的OpenCL CL_OUT_OF_RESOURCES行为



我正在编写一个相当大的OpenCL程序,其中包含大量函数调用。 我一直遇到CL_OUT_OF_RESOURCES错误的问题,但我设法用一个简单的 printf 语句解决了这个问题。这是有问题的代码片段:

...
const float color = raytrace(depthMap, triangles, ...tonMoreParameters...);
if (i == 1234) {
printf("hellon");
}
outImage[i] = color;
...

这工作正常,但是如果我删除printf函数,程序就会崩溃。如果我把它放在里面,它就不会。 当它崩溃时,它会给出CL_OUT_OF_RESOURCES错误。谁能解释为什么添加 printf 会使程序不会耗尽资源? 没有这个无用的打印,我怎么能完成这项工作?

相关规格:

  • OpenCL 1.2
  • 英伟达GTX 660
  • 使用 Java JOCL 作为主机代码

编辑:

我注意到将 printf 语句放在其他地方会改变代码的运行方式。 某些 printf 语句会导致程序输出不同的数值结果,而其他语句则会导致程序崩溃。

即使更改从未执行的代码也会极大地改变计算。 就好像更改任何代码都会随机化其执行方式。

这是显卡故障的迹象吗? 或者也许是 OpenCL 编译器中的错误?

编辑 2

事实证明,递归不是问题。 我删除了所有递归调用,但 printfs 和其他无害的更改会根据代码的放置位置改变代码的运行方式。

这绝对是编译期间的根源问题。

具有大量函数调用和递归的大型OpenCL程序

OpenCL C 2.2 pdf,第46页:

Recursion is not supported.

我不知道为什么 printf 会改变事情,但您的程序依赖于明确不支持的功能。

我找到了自己问题的解决方案。

该问题是由简单的数组越界错误引起的。 显然,OpenCL 不会捕获这些类型的错误。因此,任何越界读取或写入的尝试都可能导致静默内存损坏,就像在我的情况下一样。 损坏的内存是程序本身的指令,因此是执行的随机结果。

这个问题也部分是由mogu提到的非法使用递归引起的。 同样,OpenCL 编译器允许这静默地损坏程序内存。

所以要小心OpenCL开发人员。

相关内容

最新更新