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

12

我一直在使用ATI Stream 2.0 beta中的ATI OpenCL实现。目前beta版中的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 presumably也有自己的板,OpenCL用户/开发者社区在哪里聚集?已经整合到一个地方了吗?

2个回答

9

我知道这是一个旧问题,上面有旧的答案。我想用最新的答案来更新它。

是的,如果正确编写平台和设备枚举代码,则一种OpenCL内核和代码的实现将在各种设备上运行良好。编写正确的平台和设备枚举代码相当容易,难点在于选择哪个平台或设备。您应该在应用程序中提供配置选项,让用户选择一个,或对每个选项运行微基准测试并动态选择一个并缓存基准结果。

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

是的,使用例如NVidia OpenCL SDK开发和构建的二进制文件将在ATI或Intel OpenCL上工作,反之亦然。不再需要担心这个问题。

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

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


谢谢,我正在撰写一个新问题,以了解自第一个答案以来是否有所改变... - Mikarnage

6
最终,OpenCL的工作方式与OpenGL相同。也就是说,用户将从他们的硬件供应商(如ATI、NVIDIA、Intel)安装当前驱动程序。当您构建应用程序时,作为开发人员,您只需链接到OpenCL库。当用户运行您的应用程序时,该应用程序将重定向到驱动程序提供的适当的特定于供应商的库。
尽管它将以这种方式工作,但目前还没有以这种方式工作。
另一个需要记住的重要事情是,您仍然可能需要提供特定于供应商的代码路径,因为使用OpenCL在CPU上运行的代码可能会使用与在GPU上运行的代码不同的优化内核参数。同样,GPU供应商之间也可能存在差异。

1
那么,我可以得出这样的结论吗?如果客户拥有ATI显卡和英特尔CPU,他们将无法获得最佳性能?这取决于他们安装了哪个OpenCL驱动程序/实现,他们将在CPU或GPU上运行内核?我的意思是,我知道它可能会在机器上运行,这不是我的问题;我的问题是,它是否会快速运行(因此使用机器上的所有硬件,所有CPU核心和所有GPU“核心”)。 - Roel
简而言之,现阶段在跨厂商的情况下,很难确定具体情况。此外,在使用全部硬件和最佳化使用全部硬件之间可能存在数量级上的差异。针对不同平台的内存架构、最佳工作组大小等进行调整将至关重要,以获得应用程序的最大性能。即使您只针对 AMD 的 CPU 和 GPU,也可能需要为每个调整内核参数以获得最佳性能。 - Eric
我认为你没有理解我的观点。即使OpenCL是跨平台的,你仍然需要进行大量的定制开发。最好现在就在一些可以在其上运行得到最佳优化的平台上开始这项开发。如果你选择CUDA作为平台,并计划以后支持ATI显卡,则建议使用低级别的“Driver API”,因为它更接近于OpenCL API。 - Eric
但是,如果OpenCL在客户使用来自不同供应商的GPU / CPU组合的情况下甚至不能给我基本的并行性,那么我最好放弃通用方法,选择“一个供应商”(例如nvidia)支持。 如果我这样做,我至少可以真正为该平台进行优化(如果我选择OpenCL,则不会为每个GPU代际编写自定义内核 - 由于时间/预算限制,我必须选择一个“足够好”的方法)。 - Roel
你最好发布一个答案而不是一条评论。 - whatnick
显示剩余6条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接