是否有独立于操作系统的方法将 OpenCL 内核转换为 SPIR-V?

问题描述

我为 clang 找到了关于 Offline Compilation of OpenCL Kernels into SPIR-V Using Open Source Tooling 的指南,但我找不到使用其他编译器执行此操作的官方方法

有没有办法使用 CMake 将 OpenCL 内核转换为 SPIR-V? 如果不是,除了编写自定义脚本并在不同操作系统上调用 clang(我对 Linux 和 Windows 尤其感兴趣)之外,是否还有另一种通用的方法来构建相同的包含 OpenCL 的项目?

我看到 SPIR-V 是为 OpenCL 2.0+ 设计的,但 NVidia 显卡仅支持 OpenCL 1.2-。包含 SPIR-V 模块的应用程序能否在 NVidia 显卡上运行?

解决方法

但我找不到使用其他编译器执行此操作的官方方法。

因为没有任何官方方法。大多数实现甚至不允许您以独立/离线方式运行他们的编译器。有 Clang,IIRC Intel 确实有一个离线 OpenCL 编译器;我不知道其他任何人。

除了在不同的操作系统上编写自定义脚本和调用 clang 之外,是否还有另一种通用的方法来构建相同的包含 OpenCL 的项目

取决于您所说的“构建”是什么意思。几乎在任何地方都有效的唯一方法是随程序一起分发 OpenCL 源代码,并在运行时调用 clBuildProgram()。如果这对您不利,那么您有两个选择,1) 混淆 CL 源,2) 分发二进制文件。对于 2),没有适用于任何地方的官方二进制格式。 SPIR-V 非常接近,但它的支持只是自 OpenCL 2.1 以来的强制性要求。

包含 SPIR-V 模块的应用程序是否可以在 NVidia 显卡上运行?

没有。您可以使用“官方方式”获取特定于 Nvidia 的二进制文件,方法是在 clBuildProgram() 之后调用 clGetProgramInfo()