OpenCL文件无法在OS X上编译

时间:2017-08-17 10:51:41

标签: c++ macos compilation opencl hang

我有一个非常大的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是在运行时编译的,因此需要启动应用程序来重现该问题。

2 个答案:

答案 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设备上出现内存不足的错误,但我相信这与当前问题无关。

我所做的更改可以在以下提交中看到:

https://github.com/favreau/Sol-R/commit/556b1c7dd255a8f5fe34e75de3b8c2a127f25c36#diff-b91517d8e9eca9cf57ecd8cf4143a935

无论如何,非常感谢你的解决方案,这个很棘手!