OpenCl 是库还是编译器?

OpenCl is a Library or is a Compiler?

我开始学习OpenCl。 我阅读了这些链接:

https://en.wikipedia.org/wiki/OpenCL
https://github.com/KhronosGroup/OpenCL-Guide/blob/main/chapters/os_tooling.md
https://www.khronos.org/opencl/

但是我不太明白OpenCl是在源代码中包含头文件的库还是使用OpenCl C Compiler的编译器?!

它既是一个库又是一个编译器。

您作为头文件包含的和您 link 反对的 OpenCL C/C++ 绑定是一个库。这些在 C/C++ 中提供了必要的功能和命令来控制设备 (GPU)。

对于设备,您编写 OpenCL C 代码。这种语言不是 C 或 C++,而是基于 C99,并且有一些特定的限制(例如只有一维数组)以及扩展(数学和向量功能)。

OpenCL 编译器位于 C/C++ 绑定和 OpenCL C 部分之间。使用 C/C++ 绑定,您 运行 编译器在 运行 可执行文件的时间使用命令 clBuildProgram(C 绑定)或 program.build(...)(C++ ).然后在 运行 时间将 OpenCL C 代码编译为特定于设备的程序集,这对于每个供应商都是不同的。使用 Nvidia GPU,您可以查看设备的编译器 PTX 程序集。

如果您了解 OpenGL,那么 OpenCL 的工作原理相同。

免责声明:Self-learned 知识提前。我想学习 OpenCL,发现 OpenCL 术语和您一样令人困惑。所以我做了一些痛苦的研究,直到我的第一个 OpenCL hello-world 程序开始工作。

概述

OpenCL 是一个开放标准 - 即 API 规范,特别针对异构计算硬件。

该标准包含一组可用的文档 here。由制造商为其设备实施标准并使 OpenCL 可用,例如通过 GPU drivers 提供给用户。也许以共享库的形式。

制造商也有责任为开发人员提供使用 OpenCL 制作应用程序的工具。

这就是事情变得复杂的地方。

SDK

制造商提供 SDK - 包含上述开发人员所需的一切的软件包。 (参见上面的 link)。但它们对每个都是特定的——例如没有他们的 gpu,NVIDIA SDK 将无法工作。

ICD 加载器

由于 SDK 与单一供应商绑定,最便携(恕我直言)的解决方案是使用所谓的 Khronos' ICD loader。它是一种“meta-driver”,它将在 run-time 期间搜索 AMD、Intel、NVIDIA 和其他公司在系统中存在的其他 ICD;然后从我们的应用程序转接他们的电话。因此,作为开发人员,我们可以针对这个泛型 driver 进行开发,并使用 clGetPlatformIDs 来获取可用的平台和设备。它作为 libOpenCL.so 可用,至少在 Linux 上可用,我们应该 link 反对它。

OpenGL libOpenGL 的对应物,差不多吧,因为绝大多数 OpenGL(1.1+) 都以扩展的形式存在,并且必须单独加载,例如GLAD。从这个意义上讲,GLAD 与 ICD 加载器非常相似。

同样,它不包含任何实际的“计算”代码,仅包含 API 的存根实现,它将所有内容转发到所选平台的 ICD。

Headers

我们仍然缺少 headers,幸好 Khronos 组织发布了 C headers and also C++ bindings。但是没有什么可以阻止您根据官方 API 文档自己编写它们。这真的很乏味 error-prone.

在这里我们可以找到与 OpenGL 的另一个相似之处,因为 headers 也是标准的结果,GLAD 直接从其 XML 版本生成它们!这有多酷?!

总结

要编写一个简单的 OpenCL 应用程序,我们需要:

  1. 从设备制造商处下载 ICD - 例如up-to-date GPU drivers 就够了。
  2. 下载 headers 并将它们放在某个文件夹中。
  3. 下载、构建和安装 ICD 加载程序。它也可能需要 headers。
  4. 包括 headers,在其中使用 API,并针对 ICD 加载程序 link。

对于 Debian,也许 Ubuntu 和其他人有更简单的方法:

  1. 下载 drivers...寻找 <vendor>-opencl-icd,Linux 上的 drivers 通常不像 Windows 上的那么单一,并且可能跨越许多包。
  2. 安装 ocl-icd-opencl-dev,其中包含 C、C++ headers + 加载程序。
  3. 使用 headers 和 link 库。