非常奇怪的OpenCL资源外行为

非常奇怪的OpenCL资源外行为,opencl,jocl,Opencl,Jocl,我正在编写一个相当大的OpenCL程序,其中包含很多函数调用。我一直在处理CL_OUT_OF_RESOURCES错误,但我用一个简单的printf语句解决了这个问题。这是有问题的代码片段: 。。。 常量浮点颜色=光线跟踪(深度贴图、三角形等tonMoreParameters等); 如果(i==1234){ printf(“hello\n”); } outImage[i]=颜色; ... 这很好,但是如果我删除printf函数,程序就会崩溃。如果我把它放在里面,它就不会。 当它崩溃时,它会给出一

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

。。。
常量浮点颜色=光线跟踪(深度贴图、三角形等tonMoreParameters等);
如果(i==1234){
printf(“hello\n”);
}
outImage[i]=颜色;
...
这很好,但是如果我删除printf函数,程序就会崩溃。如果我把它放在里面,它就不会。 当它崩溃时,它会给出一个CL_OUT_OF_RESOURCES错误。有人能解释为什么添加printf使程序不会耗尽资源吗?如果没有这个无用的printf,我怎么能完成这项工作

相关规格:

  • OpenCL1.2
  • 英伟达GTX 660
  • 使用javajocl作为主机代码
编辑:

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

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

这是显卡故障的迹象吗? 或者是OpenCL编译器中的一个bug

编辑2

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

这肯定是编译时产生的问题

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

OpenCL C 2.2 pdf,第46页:

Recursion is not supported.

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

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

该问题是由一个简单的数组越界错误引起的。显然,OpenCL无法捕获这些类型的错误。因此,任何试图读取或写入超出范围的操作都可能导致静默内存损坏,就像在我的案例中一样。损坏的内存是程序本身的指令,因此是随机执行的结果

正如mogu所提到的,这个问题部分也是由于非法使用递归造成的。同样,OpenCL编译器让它悄悄地破坏程序内存


所以请小心OpenCL开发人员。

是递归调用后的printf还是内部递归调用?@huseyintugrulbuyukisik printf是递归调用后的printf。printf后有任何barrier命令吗?@huseyintugrulbuyukisik程序中没有任何障碍。我认为这解决了问题,但是我删除了递归调用,这种奇怪的行为仍然在发生。