C++ OpenCL文件无法在OS X上编译
我有一个相当大的opencl文件,在Windows和Linux Ubuntu上都可以很好地编译,但在MacOSX上却失败了。cvmcompiler进程使用100%的CPU,永远不会完成。该项目的完整代码如下: 有关文件是:C++ OpenCL文件无法在OS X上编译,c++,macos,compilation,opencl,freeze,C++,Macos,Compilation,Opencl,Freeze,我有一个相当大的opencl文件,在Windows和Linux Ubuntu上都可以很好地编译,但在MacOSX上却失败了。cvmcompiler进程使用100%的CPU,永远不会完成。该项目的完整代码如下: 有关文件是: 通过克隆项目并运行cmake/make流程,问题应该很容易重现。请注意,由于OpenCL是在运行时编译的,因此需要启动应用程序来重现该问题。是否使用Iris Pro GPU和OS X 10.11(但在10.12上工作)?因为上周我们遇到了一个类似的问题。编译调用将挂起几分
通过克隆项目并运行cmake/make流程,问题应该很容易重现。请注意,由于OpenCL是在运行时编译的,因此需要启动应用程序来重现该问题。是否使用Iris Pro GPU和OS X 10.11(但在10.12上工作)?因为上周我们遇到了一个类似的问题。编译调用将挂起几分钟,占用大量内存,然后返回一个无用的错误代码。在10.12版本中,它与其他GPU配合得很好,所以感觉像是英特尔/苹果编译器的bug。内核相对简单;这是一连串的“如果/否则”条件。使用逻辑AND运算符(
&&
)检查每个条件。根据几年前英特尔的一条提示,我们回忆起C语言中的那些运算符是“短路”的,这意味着您在语义上创建了许多可能的分支(尽管编译器确实应该意识到没有副作用,但显然并非总是如此)
我们的解决方案是将它们拉到一系列布尔赋值中,这样每个if都有一个布尔值,并且在if和else块周围没有分支。因此,按照以下思路更改代码:
if (cond1 && cond2 && cond3)
...
else if (cond4 && cond5 && cond6)
...
到
这允许内核进行编译
我看到您的内核有一些if语句,其中包含三个以上的&&
运算符,因此可能您也有同样的问题
我还看到使用&
而不是&
解决了这个问题,但我从来都不习惯使用按位AND而不是逻辑AND,以防某些条件不是相同的位模式
同样的逻辑也适用于短路的|
祝你好运!我希望这对你有帮助,或者至少对某人有帮助
编辑:为了在适当的时候给予额外的信任,虽然Intel向我们提到短路是一个问题(并建议使用
&
),AMD也在OpenCL优化指南中提到了它,并建议使用布尔变量来修复它(第2.8.7.2节旁路短路),这是我们用来修复它的。它是用Iris Pro GPU和OS X 10.11(但在10.12上工作)实现的吗?因为上周我们遇到了一个类似的问题。编译调用将挂起几分钟,占用大量内存,然后返回一个无用的错误代码。在10.12版本中,它与其他GPU配合得很好,所以感觉像是英特尔/苹果编译器的bug。内核相对简单;这是一连串的“如果/否则”条件。使用逻辑AND运算符(&&
)检查每个条件。根据几年前英特尔的一条提示,我们回忆起C语言中的那些运算符是“短路”的,这意味着您在语义上创建了许多可能的分支(尽管编译器确实应该意识到没有副作用,但显然并非总是如此)
我们的解决方案是将它们拉到一系列布尔赋值中,这样每个if都有一个布尔值,并且在if和else块周围没有分支。因此,按照以下思路更改代码:
if (cond1 && cond2 && cond3)
...
else if (cond4 && cond5 && cond6)
...
到
这允许内核进行编译
我看到您的内核有一些if语句,其中包含三个以上的&&
运算符,因此可能您也有同样的问题
我还看到使用&
而不是&
解决了这个问题,但我从来都不习惯使用按位AND而不是逻辑AND,以防某些条件不是相同的位模式
同样的逻辑也适用于短路的|
祝你好运!我希望这对你有帮助,或者至少对某人有帮助
编辑:为了在适当的时候给予额外的信任,虽然Intel向我们提到短路是一个问题(并建议使用
&
),AMD也在OpenCL优化指南中提到了它,并建议使用布尔变量来修复它(第2.8.7.2节旁路短路),这就是我们用来解决问题的方法。我应用了建议的解决方案,确实解决了问题,至少对我的Intel i5 CPU设备是这样。我没有在英特尔GPU设备上发现内存不足错误,但我相信这与当前问题无关
我所做的更改可以在以下提交中看到:
无论如何,非常感谢您提供的解决方案,这是一个棘手的问题 我当时应用了建议的解决方案,确实解决了这个问题,至少对我的Intel i5 CPU设备是这样。我没有在英特尔GPU设备上发现内存不足错误,但我相信这与当前问题无关 我所做的更改可以在以下提交中看到:
无论如何,非常感谢您提供的解决方案,这是一个棘手的问题 仍然相关~3年后,它解决了我在iMac Pro、Radeon Pro Vega 64和10.14上的问题。仍然相关~3年后,它解决了我在iMac Pro、Radeon Pro Vega 64和10.14上的问题。