我有一个非常大的opencl文件可以在Windows和Linux Ubuntu上编译,但在MacOSX上失败。 cvmcompiler进程使用100%的CPU并且永远不会完成。该项目的完整代码在那里:
https://github.com/favreau/Sol-R
并且有问题的文件是:
https://github.com/favreau/Sol-R/blob/master/solr/engines/opencl/RayTracer.cl
通过克隆项目和运行cmake / make进程,问题应该很容易重现。请注意,由于OpenCL是在运行时编译的,因此需要启动应用程序来重现该问题。
答案 0 :(得分:1)
适用于Iris Pro GPU和OS X 10.11(但适用于10.12)?因为上周我们遇到了类似的问题。编译调用将挂起几分钟,使用大量内存,然后返回一个无用的错误代码。与其他GPU一起工作正常,并且在10.12,感觉就像英特尔/ Apple编译器错误。内核相对简单;这是一系列if / else条件。每个都使用逻辑AND运算符(&&
)检查了一些条件。基于英特尔多年前的一个提示,我们回忆起C中的那些运算符是“短路”的,这意味着你在语义上创建了许多可能的分支(即使编译器确实应该意识到没有副作用,但显然并非总是如此)。
我们的解决方案是将这些分配到一系列布尔赋值中,因此每个都有一个布尔值,并且if和else块周围没有分支。所以,沿着这些方向改变代码:
if (cond1 && cond2 && cond3)
...
else if (cond4 && cond5 && cond6)
...
要
bool b1 = cond1 && cond2 && cond3;
bool b2 = cond4 && cond5 && cond6;
if (b1)
...
else if (b2)
...
这允许内核编译。
我看到你的内核有一些if语句有超过三个&&
运算符,所以也许你遇到了同样的问题。
我也看到过使用&
而不是&&
解决了这个问题,但我觉得使用按位AND而不是逻辑AND感觉很舒服,以防某些条件不是相同的位模式。
同样的逻辑适用于||
,它也会短路。
编辑:为了给予应有的额外信用,虽然英特尔提到我们的短路是一个问题(并建议使用&
),AMD也在他们的OpenCL优化指南中提到它并建议使用布尔变量修复它(第2.8.7.2节旁路短路),这是我们用来解决它的问题。
答案 1 :(得分:0)
我应用了建议的解决方案确实解决了问题,至少对于我的Intel i5 CPU设备。我没有在英特尔GPU设备上出现内存不足的错误,但我相信这与当前问题无关。
我所做的更改可以在以下提交中看到:
无论如何,非常感谢你的解决方案,这个很棘手!