从Numba检索生成的LLVM

时间:2014-08-08 22:26:58

标签: python numba

用Numba编译Python函数后如:

from numba import jit

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

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

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

类似的功能似乎也以dumping the generated LLVM assembly的形式存在(在编译期间)。然而,这似乎不再起作用 - 除非我做错了什么。不管怎样,必须运行终端命令并不理想,因为我真的很喜欢Python中的代码,尽管我知道我可以用子进程执行此操作。

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

由于

2 个答案:

答案 0 :(得分:5)

对于记录,从numba版本0.18.0link to pull request)开始,获取LLVM IR和汇编代码的标准方法是inspect_llvm和{{ 1}}调用jitted函数,例如

inspect_asm

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

@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)

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

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

答案 1 :(得分:3)

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

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命令或Numba repo中的bin目录:numba - 仍然可以从终端转储llvm IR -dump-llvm test.py)。