10

使用 Numba 编译 Python 函数后,例如:

from numba import jit

@jit
def sum(x, y):
    return x + y

如何检索已编译函数的生成 LLVM 代码(作为字符串)?

看起来这在 Numba 的先前版本中可以通过编译函数的 lfunc 属性使用,但这不起作用。

类似的功能似乎也以转储生成的 LLVM 程序集的形式存在(在编译期间)。然而,这似乎也不再起作用了——除非我做错了什么。无论如何,必须运行终端命令并不理想,因为我真的很喜欢 Python 中的代码,尽管我知道我可以使用子进程来做到这一点。

这是为了尝试在运行时创建 Python 代码的可移植版本,该版本将被翻译;我欢迎任何与此相关的建议。

谢谢

4

2 回答 2

10

作为记录,从numba版本开始0.18.0链接到拉取请求),获取 LLVM IR 和汇编代码的标准方法是通过inspect_llvminspect_asm调用 jitted 函数,例如

@jit(nopython=True,nogil=True)
def mysum(a,b):
     return a+b

# First run the function with arguments for the code to get generated
a, b = np.random.rand(10), np.random.rand(10)

# Get the llvm IR
mysum.inspect_llvm()
# Get the assembly code
mysum.inspect_asm()

请注意,返回值是字典格式。要以可读(源代码)格式显示它,只需执行

for v, k in mysum.inspect_llvm().items():
    print(v, k)

这将输出一长段代码

define i32 @__main__9mysum_...
    ...
    ...
    ...

有趣的是,作为旁注,生成的汇编代码显示 for 循环在上述函数中被 LLVM 完全展开

vmovsd  (%r10), %xmm0
vaddsd  (%rcx), %xmm0, %xmm0
vmovsd  %xmm0, -32(%rbx,%rbp)
vmovsd  (%r10), %xmm0
vaddsd  (%rcx), %xmm0, %xmm0
vmovsd  %xmm0, -24(%rbx,%rbp)
vmovsd  (%r10), %xmm0
vaddsd  (%rcx), %xmm0, %xmm0
vmovsd  %xmm0, -16(%rbx,%rbp)
vmovsd  (%r10), %xmm0
vaddsd  (%rcx), %xmm0, %xmm0
vmovsd  %xmm0, -8(%rbx,%rbp)
vmovsd  (%r10), %xmm0
vaddsd  (%rcx), %xmm0, %xmm0
vmovsd  %xmm0, (%rbx,%rbp)
vmovsd  (%r10), %xmm0
vaddsd  (%rcx), %xmm0, %xmm0
vmovsd  %xmm0, 8(%rbx,%rbp)
vmovsd  (%r10), %xmm0
vaddsd  (%rcx), %xmm0, %xmm0
vmovsd  %xmm0, 16(%rbx,%rbp)
vmovsd  (%r10), %xmm0
vaddsd  (%rcx), %xmm0, %xmm0
vmovsd  %xmm0, 24(%rbx,%rbp)
addq    $8, %rdx
addq    $64, %rbx
cmpq    %rdx, %rdi
jne LBB0_48    
于 2017-04-14T00:58:27.160 回答
5

我不记得这是否是最好的方法,但如果您不介意以不同的方式编译函数,您可以执行以下操作:

from numba.compiler import compile_isolated

# second argument specifies the argument types to the sum function
cfunc = compile_isolated(sum, (types.int64, types.int64))

# get llvm IR as string
llvm_code_str = str(cfunc.llvm_module)

需要指定参数类型,因为在知道签名(通过显式指定或通过实际调用函数)之前不会实际编译函数。

通过设置 NUMBA_DUMP_LLVM=1 环境变量并运行 python 脚本(或使用安装在 Anaconda bin 路径或 Numba 存储库中的 bin 目录中的 numba 命令,仍然可以从终端转储 llvm IR:numba --dump- llvm test.py)。

于 2014-09-19T21:57:00.883 回答