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

Roe*_*oel 11 gpgpu 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用户/开发者社区在哪里闲逛?它已经合并到一个地方了吗?

dou*_*536 9

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

是的,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测试您的代码.您可能会发现在一个平台上导致问题的错误,但在其他平台上工作正常.由于驱动程序错误,你也可能会发现完全精细的代码在其中一个平台上神秘地没有给出正确的结果.


Eri*_*ric 6

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

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

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