我可以在编译时检查OpenCL内核语法吗?

我可以在编译时检查OpenCL内核语法吗?,opencl,dynamic-compilation,Opencl,Dynamic Compilation,我正在一个更大的项目中开发一些OpenCL代码。代码只在运行时编译,但我不想部署一个版本并为此启动它。我是否有办法检查这些内核的语法(即使不考虑),或者甚至编译它们(至少在某些限制下),以便更早地捕获错误 我的目标是AMD和/或NVIDIA GPU。您正在寻找的程序类型是OpenCL内核的“脱机编译器”——了解这一点有望帮助您进行搜索。它们存在于许多OpenCL实现中,您应该检查您正在使用的特定实现的可用性;否则,一个快速的网络搜索表明,有一些通用的开源软件可能适合你,也可能不适合你 如果您的构

我正在一个更大的项目中开发一些OpenCL代码。代码只在运行时编译,但我不想部署一个版本并为此启动它。我是否有办法检查这些内核的语法(即使不考虑),或者甚至编译它们(至少在某些限制下),以便更早地捕获错误


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

您正在寻找的程序类型是OpenCL内核的“脱机编译器”——了解这一点有望帮助您进行搜索。它们存在于许多OpenCL实现中,您应该检查您正在使用的特定实现的可用性;否则,一个快速的网络搜索表明,有一些通用的开源软件可能适合你,也可能不适合你


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

取决于您的环境,您可以提前将内核编译到SPIR-V,或者如果您知道将使用什么卡,可以将其编译为构建过程的一部分并下载二进制文件。你能补充更多关于你正在使用什么品牌硬件的细节吗?“你可以编译”-如何?“下载二进制文件”-哪个二进制文件?从哪里来?就像我说的,这取决于你的环境。使用AMD卡,您可以使用
cl\u AMD\u offline\u设备
平台扩展为任何受支持的AMD GPU编译程序,包括您没有实际安装的AMD GPU,然后可以使用
clGetProgramInfo(cl\u程序二进制文件)
保存程序。我不知道Nvidia设备是否有类似的版本,但如果它们支持SPIR-V,您可能可以使用SPIR-V编译器。@apetranzilla:啊,现在您在说。我应该研究该平台扩展,至少对于AMD卡。我能够找到描述如何使用
cl\u AMD\u离线设备的扩展(附录A,第8.6节)。如果您的标题不包含它提到的
CL\u CONTEXT\u OFFLINE\u DEVICES\u AMD
宏,我发现它在我的系统中被定义为
0x403F
,所以自己用该值定义它应该可以。