我的理解是,SPIR二进制被认为是LLVM比特码,SPIR是LLVM IR的子集。此外,SPIR与设备无关。我尝试使用llvm命令对我从clGetProgramInfo获得的二进制文件使用CL_PROGRAM_BINARIES作为参数,但是它告诉我“无效的bitcode签名”。llvm at分析器返回“顶层无效记录”。
通过使用Clang将我的OpenCL内核转换为LLVM或LLVM,我可以走相反的道路。但是,bitcode文件的大小大约要小10倍,所以我很确定它与我的SPIR二进制文件不一样。
为了完整起见,我的GPU确实有cl_khr_spir扩展。
发布于 2015-07-09 16:56:56
您是正确的,因为SPIR 1.2是LLVM (特别是LLVM3.2)的一个子集。请注意,SPIR的最新版本(称为SPIR-V)不是从LLVM IR派生出来的,而是一个独立的、从头开始的中间表示形式。
使用llvm-dis是正确的方法来分解一个基于LLVM的SPIR二进制文件.因为SPIR1.2是从LLVM3.2派生的,所以这只能保证对llvm-dis的LLVM3.2版本有效。在实践中,我发现对于更新版本的LLVM来说,这仍然很好,但是不能保证总是这样。
尽管您的设备支持cl_khr_spir扩展,但是当您从clGetProgramInfo查询CL_PROGRAM_BINARIES时,并不需要它实际返回SPIR二进制文件。许多平台将返回一个本地二进制文件(例如x86或本地GPU ),或者其他一些中间表示(这可能是为什么LLVM无法识别您的二进制文件是基于LLVM的)。没有通过OpenCL运行时API检索SPIR二进制文件的标准化机制。
使用clang将OpenCL C内核编译到LLVM /SPIR1.2是获得LLVM文件的最佳方法,然后可以使用llvm-dis解压缩该文件。一些供应商(例如英特尔)也提供了离线编译器和他们的OpenCL SDK,这些SDK提供了专门的命令/工具来实现这一点。
https://stackoverflow.com/questions/31322968
复制相似问题