如果您了解 OpenGL,那么 OpenCL 的工作原理相同。
免责声明:前面的自学知识。我想学习 OpenCL,发现 OpenCL 术语和你一样令人困惑。所以我做了一些痛苦的研究,直到我的第一个 OpenCL hello-world 程序开始工作。
概览
OpenCL 是一个开放标准,即专门针对异构计算硬件的 API 规范。
该标准包含一组可用的文档here。由制造商为他们的设备实施标准并使 OpenCL 可用,例如通过 GPU 驱动程序给用户。也许以共享库的形式。
制造商也有责任为开发人员提供使用 OpenCL 制作应用程序的工具。
这就是复杂的地方。
SDK
制造商提供 SDK - 软件包,其中包含上述开发人员所需的一切。 (见上面的链接)。但它们是针对每个特定的 - 例如没有 GPU,NVIDIA SDK 将无法工作。
ICD 加载器
由于 SDK 与单一供应商绑定,因此最便携 (恕我直言) 的解决方案是使用所谓的 Khronos' ICD loader。它是一种“元驱动程序”,将在运行时搜索 AMD、Intel、NVIDIA 等存在于系统中的其他 ICD;然后从我们的应用程序转发他们的呼叫。因此,作为开发人员,我们可以针对这个通用驱动程序进行开发,并使用clGetPlatformIDs 来获取可用的平台和设备。它以libOpenCL.so 的形式提供,至少在 Linux 上是这样,我们应该链接它。
OpenGL 的 libOpenGL 的对应部分,差不多,因为绝大多数 OpenGL(1.1+) 都以扩展的形式存在,并且必须单独加载,例如GLAD。从这个意义上说,GLAD 与 ICD 加载器非常相似。
同样,它不包含任何实际的“计算”代码,仅包含 API 的存根实现,将所有内容转发到所选平台的 ICD。
我们仍然缺少标题,幸好 Khronos 组织发布了 C headers 和 C++ bindings。但是没有什么能阻止您根据官方 API 文档自己编写它们。这将非常乏味且容易出错。
在这里我们可以找到另一个与 OpenGL 相似的地方,因为标头也只是标准的结果,而 GLAD 直接从其 XML 版本生成它们!这有多酷?!
总结
要编写一个简单的 OpenCL 应用程序,我们需要:
- 从设备制造商处下载 ICD - 例如最新的 GPU 驱动程序就足够了。
- 下载标题并将它们放在某个文件夹中。
- 下载、构建和安装 ICD 加载程序。它可能也需要标题。
- 包含标头,在其中使用 API,并链接到 ICD 加载器。
对于 Debian,也许 Ubuntu 和其他有更简单的方法:
- 下载驱动程序...查找
<vendor>-opencl-icd,Linux 上的驱动程序通常不像 Windows 上那样单一,并且可能跨越多个包。
- 安装
ocl-icd-opencl-dev,其中包含 C、C++ 头文件 + 加载程序。
- 使用标题并链接库。