我们编写OpenCL C代码和clCreateProgramWithSource并使用clGetProgramInfo来获取二进制文件。然后将此二进制文件集成到产品二进制文件中,该二进制文件在初始化时使用clCreateProgramWithBinary。
我们创建一个.h文件并在源文件中包含相同的文件。 .h文件的内容是编译OpenCL C Kernel后生成的二进制文件。
上述步骤的问题是,二进制文件的兼容性预计将随OpenCL中的任何次要/主要更改而中断,并且很可能会破坏供应商。我们需要为每个供应商或OpenCL版本生成OpenCL内核二进制文件。
可以将标题形式的OpenCL内核二进制文件集成到项目中。在这种情况下,如果二进制文件不兼容,我们将无法替换二进制文件。在这种情况下,项目初始化失败。
预期解决方案
OpenCL C源是公司专有的,不能与客户共享。
我已经访问了Universal binaries for OpenCL,但它表明SPIR也需要很长时间进行编译,因此它可能不是我正在寻找的解决方案,因为初始化时间也很重要。
答案 0 :(得分:0)
在实践中,英特尔Gen二进制格式可以针对相同平台/硬件的驱动程序更改进行更改(例如,用于修复错误的解决方法和性能改进)。因此,clGetProgramInfo
返回的位只能在同一设备x驱动程序x等上的clCreateProgramWithBinary
中工作...可悲的是,这意味着二进制路径与知识产权安全性不匹配问题。
SPIR将差异分开,因为它与硬件无关,同时仍然难以进行逆向工程。如果启动性能在某种程度上很重要,您始终可以尝试 clCreateProgramWithBinary
路径;如果二进制加载失败(意味着驱动程序发生了变化或其他原因),则能够回退到SPIR。