各种 OpenCL SDK 之间有什么区别

What are the differences between the various OpenCL SDKs

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

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

据我了解您需要:

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

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

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

您要解决的用例是什么?

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

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

link进入应用程序(SDK 中的那个)的“.lib”“.a”OpenCL 库在所有情况下都是相同的(除非它们有不同的版本, 1.1, 1.2, 2.0). 这是因为库并不是真正的库,只是对真实驱动程序中真实函数的存根。这也解释了为什么头文件都是一样的,它们都是link 针对同一个库。

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

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


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

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

在 Windows 上,您会 link 到 OpenCL.lib,这只是 OpenCL.dll 的静态包装(由您的图形 driver 安装在\Windows\System32)。对于相同版本的 OpenCL,每个人的包装器应该是相似的。它也由 Khronos 提供(ICD 是开源的),但使用 SDK 中的一个更容易。

OpenCL.dll 使用 ICD 机制加载每个 driver 安装的运行时。如果您安装了多个运行时,它们各自显示为 cl_platform.

如果您的目标是 OpenCL 1.1(由于 NVIDIA)我建议使用版本 1.1 header 以确保您不会不小心使用更新的 API。