非常奇怪的OpenCL资源外行为
我正在编写一个相当大的OpenCL程序,其中包含很多函数调用。我一直在处理CL_OUT_OF_RESOURCES错误,但我用一个简单的printf语句解决了这个问题。这是有问题的代码片段:非常奇怪的OpenCL资源外行为,opencl,jocl,Opencl,Jocl,我正在编写一个相当大的OpenCL程序,其中包含很多函数调用。我一直在处理CL_OUT_OF_RESOURCES错误,但我用一个简单的printf语句解决了这个问题。这是有问题的代码片段: 。。。 常量浮点颜色=光线跟踪(深度贴图、三角形等tonMoreParameters等); 如果(i==1234){ printf(“hello\n”); } outImage[i]=颜色; ... 这很好,但是如果我删除printf函数,程序就会崩溃。如果我把它放在里面,它就不会。 当它崩溃时,它会给出一
。。。
常量浮点颜色=光线跟踪(深度贴图、三角形等tonMoreParameters等);
如果(i==1234){
printf(“hello\n”);
}
outImage[i]=颜色;
...
这很好,但是如果我删除printf函数,程序就会崩溃。如果我把它放在里面,它就不会。
当它崩溃时,它会给出一个CL_OUT_OF_RESOURCES错误。有人能解释为什么添加printf使程序不会耗尽资源吗?如果没有这个无用的printf,我怎么能完成这项工作
相关规格:
- OpenCL1.2
- 英伟达GTX 660
- 使用javajocl作为主机代码
Recursion is not supported.
我不知道为什么printf会改变一些事情,但您的程序依赖于一个明确不受支持的功能。我找到了解决我自己问题的方法 该问题是由一个简单的数组越界错误引起的。显然,OpenCL无法捕获这些类型的错误。因此,任何试图读取或写入超出范围的操作都可能导致静默内存损坏,就像在我的案例中一样。损坏的内存是程序本身的指令,因此是随机执行的结果 正如mogu所提到的,这个问题部分也是由于非法使用递归造成的。同样,OpenCL编译器让它悄悄地破坏程序内存
所以请小心OpenCL开发人员。是递归调用后的printf还是内部递归调用?@huseyintugrulbuyukisik printf是递归调用后的printf。printf后有任何barrier命令吗?@huseyintugrulbuyukisik程序中没有任何障碍。我认为这解决了问题,但是我删除了递归调用,这种奇怪的行为仍然在发生。