【问题标题】:Can I check OpenCL kernel syntax at compilation time?我可以在编译时检查 OpenCL 内核语法吗?
【发布时间】:2020-05-22 11:29:55
【问题描述】:

我正在一个更大的项目中处理一些 OpenCL 代码。该代码仅在运行时编译 - 但我不想为此部署版本并启动它。有什么方法可以让我检查这些内核的语法(即使不考虑),甚至编译它们,至少在一些限制下,以便更容易更早地捕获错误?

我的目标是 AMD 和/或 NVIDIA GPU。

【问题讨论】:

  • 根据您的环境,您可以提前将内核编译为 SPIR-V,或者如果您知道您将使用哪些卡,将其作为构建过程的一部分进行编译并下载二进制文件.您能否添加更多关于您使用的品牌硬件的详细信息?
  • “你可以编译” - 怎么样? “下载二进制文件” - 哪个二进制文件?从哪里来?
  • 正如我所说,这取决于您的环境。使用 AMD 卡,您可以使用 cl_amd_offline_devices 平台扩展为任何支持的 AMD GPU 编译程序,包括您没有实际安装的那些,然后可以使用 clGetProgramInfo(CL_PROGRAM_BINARIES) 保存。我不知道 Nvidia 设备的等效设备,但如果它们支持 SPIR-V,您也许可以使用 SPIR-V 编译器。
  • @apetranzilla:啊,现在你在说话。我应该研究那个平台扩展,至少对于 AMD 卡。
  • 我找到了this guide,它描述了如何使用cl_amd_offline_devices 扩展(附录A,第8.6 节)。如果您的标题不包含它提到的CL_CONTEXT_OFFLINE_DEVICES_AMD 宏,我发现它在我的系统中定义为0x403F,因此使用该值自己定义应该可以正常工作。

标签: opencl dynamic-compilation


【解决方案1】:

您正在寻找的程序类型是 OpenCL 内核的“离线编译器”——知道这将有助于您的搜索。它们存在于许多 OpenCL 实现中,您应该检查您正在使用的特定实现的可用性;否则,快速的网络搜索表明有一些通用的开源代码可能适合您,也可能不适合您。

如果您的构建机器也是您的部署机器(即您的目标 OpenCL 实现在您的构建机器上可用),您当然也可以自己组装一个非常基本的离线编译器,只需将 clBuildProgram() 和朋友包装在一个基本的命令行实用程序。

【讨论】:

    猜你喜欢
    • 2023-01-30
    • 2012-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多