Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ OpenCL文件无法在OS X上编译_C++_Macos_Compilation_Opencl_Freeze - Fatal编程技术网

C++ OpenCL文件无法在OS X上编译

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上工作)?因为上周我们遇到了一个类似的问题。编译调用将挂起几分

我有一个相当大的opencl文件,在Windows和Linux Ubuntu上都可以很好地编译,但在MacOSX上却失败了。cvmcompiler进程使用100%的CPU,永远不会完成。该项目的完整代码如下:

有关文件是:


通过克隆项目并运行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上的问题。