各种 OpenCL SDK 之间有什么区别?



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

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

据我了解,您需要:

  1. OpenCL 标头,可从 Khronos 站点下载
  2. OpenCL 库,附带各种 SDK

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

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

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

所有应用,无论什么SDK编译后都应该是一样的。

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


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

你是对的,所有SDK都使用(或应该使用)Khronos标头。您也可以自己使用 Khronos 标头。

在Windows上,您将链接到OpenCL.lib,它只是OpenCL的静态包装器.dll由\Windows\System32中的图形驱动程序安装)。对于相同版本的 OpenCL,每个人的包装器都应该相似。它也由Khronos提供(ICD是开源的),但从SDK使用更容易。

OpenCL.dll 使用 ICD 机制加载每个驱动程序安装的运行时。如果安装了多个运行时,则每个运行时都显示为一个cl_platform。

如果您的目标是 OpenCL 1.1(由于 NVIDIA),我建议您使用 1.1 版标头以确保您不会意外使用较新的 API。

虽然 OpenCL 旨在从硬件中抽象代码,但有几种不同类型的 GPU 架构。这些差异迫使为特定硬件编写特定代码。因此,编写可移植代码并不容易。恕我直言,您最好选择一个硬件并为该平台使用开发人员友好的SDK。

您要解决的用例是什么?

二进制文件可以在运行时编译(至少在 Java 中)。因此,需要一个 OpenCL-C 运行时 (?),但编译的内核主要依赖于硬件。

最新更新