【问题标题】:Very odd OpenCL CL_OUT_OF_RESOURCES behavior非常奇怪的 OpenCL CL_OUT_OF_RESOURCES 行为
【发布时间】:2020-02-09 09:21:25
【问题描述】:

我正在编写一个包含大量函数调用的相当大的 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 会使程序 not 耗尽资源?如果没有这个无用的 printf,我该如何完成这项工作?

相关规格:

  • OpenCL 1.2
  • NVIDIA GTX 660
  • 使用 Java JOCL 作为宿主代码

编辑:

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

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

这是显卡故障的征兆吗? 或者可能是 OpenCL 编译器中的错误?

编辑 2

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

这绝对是编译时的问题。

【问题讨论】:

  • printf是在递归调用之后还是在递归调用内部?
  • @huseyintugrulbuyukisik printf 在递归调用之后。
  • printf后有屏障命令吗?
  • @huseyintugrulbuyukisik 程序中没有任何障碍。

标签: opencl jocl


【解决方案1】:

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

OpenCL C 2.2 pdf,第 46 页:

Recursion is not supported.

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

【讨论】:

  • 我认为这解决了问题,但我删除了递归调用,这种奇怪的行为仍在发生。
【解决方案2】:

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

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

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

所以要小心 OpenCL 开发人员。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-13
    • 2011-03-01
    • 2020-12-02
    • 1970-01-01
    • 1970-01-01
    • 2014-01-24
    • 1970-01-01
    相关资源
    最近更新 更多