问题 在混合供应商的硬件上运行OpenCL


我一直在他们的Stream 2.0测试版中使用ATI OpenCL实现。当前测试版中的OpenCL仅使用CPU,下一版本应该支持GPU内核。我下载了Stream,因为我的工作机器上有一个ATI GPU。

我编写的软件可以通过使用GPU从收益中获益匪浅。然而,这个软件在客户机器上运行,我没有奢侈品(正如许多科学计算环境所拥有的那样)选择要开发的精确硬件,并为此进行优化。所以我的问题是,如果我用我的应用程序分发ATI OpenCL实现,那就意味着它永远无法使用例如NVidia显卡?如果我使用NVidia OpenCL SDK,它将无法在AMD芯片上运行最佳(考虑到ATI / AMD链接)?

换句话说,谁最终负责提供OpenCL实现?用户是否能够例如为他们的NVidia视频卡安装一个OpenCL'驱动程序',以及一个能够在AMD CPU上实现最佳性能的“驱动程序”?

顺便说一下,除了Khronos留言板之外,OpenCL还有什么好的/活跃的支持论坛,还是去的地方?我已经看到ATI有一个董事会,NVidia可能有自己的,OpenCL用户/开发者社区在哪里闲逛?它已经合并到一个地方了吗?


10098
2017-09-07 09:11


起源



答案:


最终,OpenCL的工作方式与OpenGL相同。也就是说,用户将从他们的硬件供应商(ATI,NVIDIA,Intel)安装当前的驱动程序。作为开发人员,您只需在构建应用程序时链接到OpenCL库。当用户运行您的应用程序时,应用程序将重定向到驱动程序提供的相应供应商特定库。

这是它的工作方式,但它还没有以这种方式工作。

另外要记住的一件重要事情是,您仍然可能必须提供供应商特定的代码路径,因为使用OpenCL在CPU上运行的代码可能会使用与GPU上运行的代码不同的优化内核参数。 GPU供应商之间的差异可能也是如此。


6
2017-09-07 09:35



与OpenGL的不同之处在于,对于OpenGL,GPU供应商会编写驱动程序 - 期间。 OpenGL仅适用于视频卡。但对于OpenCL,理想情况下CPU供应商为CPU内核编写驱动程序,GPU供应商为GPU内核编写驱动程序,因为OpenCL内核可以在CPU线程或GPU线程上运行。这是它应该如何在未来工作? - Roel
当硬件不支持某些操作时,OpenGL始终支持软件路径。因此,OS供应商必须提供软件OpenGL实现(MS Windows OpenGL停留在OpenGL 1.1)。 OpenCL可能会发生类似的事情。无论如何,AMD / ATI可能会发布一个支持其CPU和GPU的OpenCL版本。同样,英特尔可能会发布支持常规CPU和Larrabee GPU的OpenCL。我对Apple的OpenCL实现知之甚少,不知道它支持什么。 - Eric
好吧,我可以得出结论,如果客户有ATI显卡和英特尔CPU,他们将无法获得最佳性能吗?那么,根据他们安装的OpenCL驱动程序/实现,他们会在CPU还是GPU上运行内核?我的意思是我知道它可能会 跑 在机器上,这不是我的关注;我担心的是,它会运行吗? 快速 (所以使用机器上的所有硬件,所有CPU内核和所有GPU核心)。 - Roel
简短的回答是现在说太早,特别是在跨供应商的情况下。此外,在使用所有硬件和最佳地使用所有硬件之间可能存在数量级差异。在内存架构和最佳工作组大小以及不同平台上,对于从应用程序中获得最大性能至关重要。即使您只针对AMD CPU和GPU,您也可能需要调整每个CPU的内核参数以获得最佳性能。 - Eric
另外,我认为你现在过早地进行了优化。如果您想要跨平台的高性能计算,OpenCL是“未来之路”。专注于现在学习细节并优化您当前的平台。然后,您可以担心多个供应商/平台。 - Eric


答案:


最终,OpenCL的工作方式与OpenGL相同。也就是说,用户将从他们的硬件供应商(ATI,NVIDIA,Intel)安装当前的驱动程序。作为开发人员,您只需在构建应用程序时链接到OpenCL库。当用户运行您的应用程序时,应用程序将重定向到驱动程序提供的相应供应商特定库。

这是它的工作方式,但它还没有以这种方式工作。

另外要记住的一件重要事情是,您仍然可能必须提供供应商特定的代码路径,因为使用OpenCL在CPU上运行的代码可能会使用与GPU上运行的代码不同的优化内核参数。 GPU供应商之间的差异可能也是如此。


6
2017-09-07 09:35



与OpenGL的不同之处在于,对于OpenGL,GPU供应商会编写驱动程序 - 期间。 OpenGL仅适用于视频卡。但对于OpenCL,理想情况下CPU供应商为CPU内核编写驱动程序,GPU供应商为GPU内核编写驱动程序,因为OpenCL内核可以在CPU线程或GPU线程上运行。这是它应该如何在未来工作? - Roel
当硬件不支持某些操作时,OpenGL始终支持软件路径。因此,OS供应商必须提供软件OpenGL实现(MS Windows OpenGL停留在OpenGL 1.1)。 OpenCL可能会发生类似的事情。无论如何,AMD / ATI可能会发布一个支持其CPU和GPU的OpenCL版本。同样,英特尔可能会发布支持常规CPU和Larrabee GPU的OpenCL。我对Apple的OpenCL实现知之甚少,不知道它支持什么。 - Eric
好吧,我可以得出结论,如果客户有ATI显卡和英特尔CPU,他们将无法获得最佳性能吗?那么,根据他们安装的OpenCL驱动程序/实现,他们会在CPU还是GPU上运行内核?我的意思是我知道它可能会 跑 在机器上,这不是我的关注;我担心的是,它会运行吗? 快速 (所以使用机器上的所有硬件,所有CPU内核和所有GPU核心)。 - Roel
简短的回答是现在说太早,特别是在跨供应商的情况下。此外,在使用所有硬件和最佳地使用所有硬件之间可能存在数量级差异。在内存架构和最佳工作组大小以及不同平台上,对于从应用程序中获得最大性能至关重要。即使您只针对AMD CPU和GPU,您也可能需要调整每个CPU的内核参数以获得最佳性能。 - Eric
另外,我认为你现在过早地进行了优化。如果您想要跨平台的高性能计算,OpenCL是“未来之路”。专注于现在学习细节并优化您当前的平台。然后,您可以担心多个供应商/平台。 - Eric


我知道这是一个老问题,上面有旧答案。以为我会用最新的答案更新它。

是的,OpenCL内核和代码的一个实现今天可以在各种设备上运行,并且具有正确编写的平台和设备枚举代码。编写正确的平台和设备枚举代码非常容易,棘手的部分是选择哪个平台或设备。您应该在应用程序中提供一个配置选项,用户可以在其中选择一个,或者针对每个选项运行微基准测试,并动态选择一个并缓存工作台结果。

人们可以并且将拥有多个平台。例如,我的系统有GTX 580 SLI,因此在NVidia平台上有两个设备。它还具有Intel OpenCL SDK,因此我的CoreI7 990x Extreme CPU也作为Intel平台中的设备出现。

是的,使用例如NVidia OpenCL SDK开发和构建的二进制文件将在ATI或Intel OpenCL上运行,反之亦然。不用担心了。

显然,最终用户可能没有任何OpenCL,因此您可能需要延迟加载或LoadLibrary opencl.dll和动态链接。

我强烈建议针对英特尔OpenCL SDK,NVidia GPU和AMD GPU测试您的代码。您可能会发现在一个平台上导致问题的错误,但在其他平台上工作正常。由于驱动程序错误,您可能会发现完全精细的代码神秘地无法在其中一个平台上提供正确的结果。


8
2018-03-10 05:56



谢谢你,我正在写一个新问题,知道自第一个答案以来事情是否发生了变化...... - Mikarnage