gpt4 book ai didi

python - 从 Numba 检索生成的 LLVM

转载 作者:太空狗 更新时间:2023-10-29 21:34:24 25 4
gpt4 key购买 nike

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

from numba import jit

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

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

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

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

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

谢谢

最佳答案

作为记录,从 numba 版本 0.18.0 ( link to pull request ) 开始,获取 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

关于python - 从 Numba 检索生成的 LLVM,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25213137/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com