Opencl 将SPIR二进制文件反汇编到LLVM IR
我的理解是,SPIR二进制文件应该是LLVM位码,而SPIR IR是LLVM IR的子集。此外,SPIR与设备无关。我尝试在从clGetProgramInfo获取的二进制文件上使用llvm dis命令,并将CL_程序_二进制文件作为参数,但它告诉我“无效位码签名”。llvm bcanalyzer返回“顶层无效记录” 我可以使用Clang将OpenCL内核转换为LLVM-IR或LLVM位代码。但是,位码文件的大小大约小10倍,所以我很确定它与我的SPIR二进制文件不同 完整地说,我的GPU确实有cl_khr_spir扩展Opencl 将SPIR二进制文件反汇编到LLVM IR,opencl,llvm,llvm-ir,Opencl,Llvm,Llvm Ir,我的理解是,SPIR二进制文件应该是LLVM位码,而SPIR IR是LLVM IR的子集。此外,SPIR与设备无关。我尝试在从clGetProgramInfo获取的二进制文件上使用llvm dis命令,并将CL_程序_二进制文件作为参数,但它告诉我“无效位码签名”。llvm bcanalyzer返回“顶层无效记录” 我可以使用Clang将OpenCL内核转换为LLVM-IR或LLVM位代码。但是,位码文件的大小大约小10倍,所以我很确定它与我的SPIR二进制文件不同 完整地说,我的GPU确实有c
您是正确的,SPIR1.2是LLVM IR(特别是LLVM 3.2)的一个子集。请注意,SPIR的最新版本(称为SPIR-V)不是从LLVM IR派生的,而是一个独立的、从头开始的中间表示 使用
llvmdis
是反汇编基于llvm的SPIR二进制文件的正确方法。由于SPIR 1.2是从LLVM 3.2派生而来的,因此只能保证在LLVM 3.2版本的LLVM dis
中使用。在实践中,我发现这仍然适用于较新版本的LLVM,但不能保证总是这样
尽管您的设备支持cl\u khr\u spir
扩展,但当您从clGetProgramInfo
查询cl\u程序\u二进制文件时,它不需要实际返回spir二进制文件。许多平台将返回本机二进制文件(例如x86或本机GPU ISA)或其他中间表示(这可能是LLVM无法将二进制文件识别为基于LLVM的二进制文件的原因)。没有通过OpenCL运行时API检索SPIR二进制文件的标准化机制
使用clang
将OpenCLC内核编译成LLVMIR/SPIR1.2是获取LLVM位代码文件的最佳方法,然后可以使用LLVMDIS
对其进行反汇编。一些供应商(如Intel)还提供离线编译器及其OpenCL SDK,这些SDK提供专用命令/工具来执行此操作