各种 OpenCL SDK 之间有什么区别

Fra*_*cis 1 sdk opencl

我想学习如何使用 OpenCL API,但是我对如何“安装”用于开发的 OpenCL 有点困惑。谷歌上的各种文章相互矛盾,我怀疑有些已经过时了。

我的理解是 Khronos 集团提供规范,然后各家公司提供符合该规范的 SDK。

据我了解,您需要:

  1. OpenCL 头文件,可以从 Khronos 站点下载
  2. 随各种 SDK 一起提供的 OpenCL 库

不同的 SDK 之间有区别吗?据我所知,选项是 Intel、AMD 或 Nvidia。我读过关于您使用的 SDK 是否重要的​​相互矛盾的信息 - 一些消息来源说 SDK 仅供开发人员使用,生成的二进制文件可以在任何支持 OpenCL 的硬件上运行,而其他消息来源说使用特定的 SDK 锁定您的应用程序成为一个供应商的硬件。是哪个?我选择使用哪个 SDK 是否重要,是否有我可以链接到的非供应商特定 OpenCL 库?

Dar*_*ros 5

OpenCL SDK 是不同的。它们提供工具来简化开发、附加功能、示例和文档。每个制造商都会包含最适合他们硬件的东西,但在编译应用程序时它们都应该兼容。

链接到应用程序中的“.lib”“.a”OpenCL 库(SDK 中提供的库)在所有情况下都是相同的(除非它们具有不同的版本,1.1、1.2、2.0)。 这是因为库并不是真正的库,而只是真实驱动程序中真实函数的存根。这也解释了为什么标头都是相同的,它们都链接到同一个库。

所有的app,不管是什么SDK,编译后应该是一样的。

就 nVIDIA 而言,除了它们的 OpenCL.lib 之外,它们还提供了一些简化平台获取的功能(oclGetPlatformID()在 oclUtils.h 中)等,这些功能在其他驱动程序上不可用,建议不要使用它们,除非您希望最终不得不将另一个 nVIDIA 专有库打包到您的应用程序中。


但是如果你真的想成为通用的,那么你应该去动态库加载(dload()LoadLibrary())。这将使您的应用程序即使在系统甚至没有安装 OpenCL 的情况下也能正常工作。