作为记录,从numba
版本开始0.18.0
(链接到拉取请求),获取 LLVM IR 和汇编代码的标准方法是通过inspect_llvm
和inspect_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