Opencl 将SPIR二进制文件反汇编到LLVM IR

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

我的理解是,SPIR二进制文件应该是LLVM位码,而SPIR IR是LLVM IR的子集。此外,SPIR与设备无关。我尝试在从clGetProgramInfo获取的二进制文件上使用llvm dis命令,并将CL_程序_二进制文件作为参数,但它告诉我“无效位码签名”。llvm bcanalyzer返回“顶层无效记录”

我可以使用Clang将OpenCL内核转换为LLVM-IR或LLVM位代码。但是,位码文件的大小大约小10倍,所以我很确定它与我的SPIR二进制文件不同

完整地说,我的GPU确实有cl_khr_spir扩展

  • 我对SPIR二进制文件作为LLVN位代码的理解正确吗
  • 有没有办法将SPIR二进制文件分解为LLVM IR

  • 您是正确的,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提供专用命令/工具来执行此操作