尝试numba的巨大错误 [英] Huge errors trying numba

查看:343
本文介绍了尝试numba的巨大错误的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我使用numba遇到了大量错误.具有讽刺意味的是,错误后会打印正确的结果.我正在使用最新的Anaconda python并使用

I'm running into a big load of errors using numba. Ironically, the correct result is printed after the errors. I'm using the newest Anaconda python and installed numba with

conda install numba

一次在Ubuntu 13、64位和anaconda 64位上运行,以及在Windows 64位和32位版本的anaconda上运行.

once on Ubuntu 13, 64 bit and also anaconda 64 bit and on windows 64 bit with a 32 bit version of anaconda.

我要执行的脚本是:

# -*- coding: utf-8 -*-

import math
from numba import autojit

pi = math.pi

@autojit
def sinc(x):
    if x == 0.0:
        return 1.0
    else:
        return math.sin(x*pi)/(pi*x)    


if __name__ == '__main__':
    a = 4.5
    print sinc(a)

我得到的错误是:

DEBUG -- translate:361:translate
; ModuleID = 'tmp.module.__main__.sinc.45bce60'

@PyArray_API = linkonce_odr global i8** inttoptr (i64 140030693224864 to i8**)

define double @__numba_specialized_0___main___2E_sinc(double %x) {
entry:
  %return_value = alloca double
  br label %"if_cond_13:7"

cleanup_label:                                    ; preds = %"else_body_16:8", %"if_body_14:8", %error_label
  %0 = load double* %return_value
  ret double %0

error_label:                                      ; No predecessors!
  store double 0x7FF8000000000000, double* %return_value
  br label %cleanup_label

"if_cond_13:7":                                   ; preds = %entry
  %1 = fcmp oeq double %x, 0.000000e+00
  %2 = icmp ne i1 %1, false
  br i1 %2, label %"if_body_14:8", label %"else_body_16:8"

"if_body_14:8":                                   ; preds = %"if_cond_13:7"
  store double 1.000000e+00, double* %return_value
  br label %cleanup_label

"else_body_16:8":                                 ; preds = %"if_cond_13:7"
  %3 = fmul double %x, 0x400921FB54442D18
  %4 = call double @"numba.math.['double'].sin"(double %3)
  %5 = fmul double 0x400921FB54442D18, %x
  %6 = fdiv double %4, %5
  store double %6, double* %return_value
  br label %cleanup_label
}

declare { i64, i8* }* @Py_BuildValue(i8*, ...)

declare i32 @PyArg_ParseTuple({ i64, i8* }*, i8*, ...)

declare void @PyErr_Clear()

declare double @"numba.math.['double'].sin"(double)

!tbaa = !{!0, !1}

!0 = metadata !{metadata !"root"}
!1 = metadata !{metadata !"char *", metadata !0}


DEBUG -- translate:361:translate
; ModuleID = 'numba_executable_module'

@PyArray_API = linkonce_odr global i8** inttoptr (i64 140030693224864 to i8**)

define void @Py_INCREF({ i64, i8* }* %obj) {
decl:
  %obj1 = alloca { i64, i8* }*
  store { i64, i8* }* %obj, { i64, i8* }** %obj1
  %0 = bitcast { i64, i8* }* %obj to i64*
  %1 = load i64* %0
  %2 = add i64 %1, 1
  store i64 %2, i64* %0
  ret void
}

define void @Py_DECREF({ i64, i8* }* %obj) {
decl:
  %obj1 = alloca { i64, i8* }*
  store { i64, i8* }* %obj, { i64, i8* }** %obj1
  %0 = bitcast { i64, i8* }* %obj to i64*
  %1 = load i64* %0
  %2 = icmp sgt i64 %1, 1
  br i1 %2, label %if.then, label %if.else

if.then:                                          ; preds = %decl
  %3 = add i64 %1, -1
  store i64 %3, i64* %0
  br label %if.end

if.else:                                          ; preds = %decl
  call void @Py_DecRef({ i64, i8* }* %obj)
  br label %if.end

if.end:                                           ; preds = %if.else, %if.then
  ret void
}

declare void @Py_DecRef({ i64, i8* }*)

define void @Py_XINCREF({ i64, i8* }* %obj) {
decl:
  %obj1 = alloca { i64, i8* }*
  store { i64, i8* }* %obj, { i64, i8* }** %obj1
  %0 = ptrtoint { i64, i8* }* %obj to i64
  %1 = icmp ne i64 %0, 0
  br i1 %1, label %if.then, label %if.end

if.then:                                          ; preds = %decl
  %2 = bitcast { i64, i8* }* %obj to i64*
  %3 = load i64* %2
  %4 = add i64 %3, 1
  store i64 %4, i64* %2
  br label %if.end

if.end:                                           ; preds = %if.then, %decl
  ret void
}

define void @Py_XDECREF({ i64, i8* }* %obj) {
decl:
  %obj1 = alloca { i64, i8* }*
  store { i64, i8* }* %obj, { i64, i8* }** %obj1
  %0 = ptrtoint { i64, i8* }* %obj to i64
  %1 = icmp ne i64 %0, 0
  br i1 %1, label %if.then, label %if.end

if.then:                                          ; preds = %decl
  call void @Py_DECREF({ i64, i8* }* %obj)
  br label %if.end

if.end:                                           ; preds = %if.then, %decl
  ret void
}

define i8* @IndexAxis(i8* %data, i64* %in_shape, i64* %in_strides, i64 %src_dim, i64 %index) {
decl:
  %data1 = alloca i8*
  %in_shape2 = alloca i64*
  %in_strides3 = alloca i64*
  %src_dim4 = alloca i64
  %index5 = alloca i64
  %result = alloca i8*
  store i8* %data, i8** %data1
  store i64* %in_shape, i64** %in_shape2
  store i64* %in_strides, i64** %in_strides3
  store i64 %src_dim, i64* %src_dim4
  store i64 %index, i64* %index5
  %0 = load i64** %in_strides3
  %1 = load i64* %src_dim4
  %2 = getelementptr inbounds i64* %0, i64 %1
  %3 = load i64* %2
  %4 = mul i64 %3, %index
  %5 = load i8** %data1
  %6 = getelementptr inbounds i8* %5, i64 %4
  store i8* %6, i8** %result
  ret i8* %6
}

define void @NewAxis(i64* %out_shape, i64* %out_strides, i32 %dst_dim) {
decl:
  %out_shape1 = alloca i64*
  %out_strides2 = alloca i64*
  %dst_dim3 = alloca i32
  store i64* %out_shape, i64** %out_shape1
  store i64* %out_strides, i64** %out_strides2
  store i32 %dst_dim, i32* %dst_dim3
  %0 = load i64** %out_shape1
  %1 = getelementptr inbounds i64* %0, i32 %dst_dim
  store i64 1, i64* %1
  %2 = load i64** %out_strides2
  %3 = load i32* %dst_dim3
  %4 = getelementptr inbounds i64* %2, i32 %3
  store i64 0, i64* %4
  ret void
}

define i32 @Broadcast(i64* %dst_shape, i64* %src_shape, i64* %src_strides, i32 %max_ndim, i32 %ndim) {
decl:
  %dst_shape1 = alloca i64*
  %src_shape2 = alloca i64*
  %src_strides3 = alloca i64*
  %max_ndim4 = alloca i32
  %ndim5 = alloca i32
  %0 = alloca i32
  store i64* %dst_shape, i64** %dst_shape1
  store i64* %src_shape, i64** %src_shape2
  store i64* %src_strides, i64** %src_strides3
  store i32 %max_ndim, i32* %max_ndim4
  store i32 %ndim, i32* %ndim5
  %1 = load i32* %max_ndim4
  %2 = sub i32 %1, %ndim
  store i32 0, i32* %0
  br label %loop.cond

loop.cond:                                        ; preds = %if.end11, %decl
  %3 = load i32* %0
  %4 = load i32* %ndim5
  %5 = icmp slt i32 %3, %4
  br i1 %5, label %loop.body, label %loop.end

loop.body:                                        ; preds = %loop.cond
  %6 = load i64** %src_shape2
  %7 = getelementptr inbounds i64* %6, i32 %3
  %8 = add i32 %3, %2
  %9 = load i64** %dst_shape1
  %10 = getelementptr inbounds i64* %9, i32 %8
  %11 = load i64* %7
  %12 = icmp eq i64 %11, 1
  br i1 %12, label %if.then, label %if.else

loop.end:                                         ; preds = %if.else7, %loop.cond
  %merge = phi i32 [ 1, %loop.cond ], [ 0, %if.else7 ]
  ret i32 %merge

if.then:                                          ; preds = %loop.body
  %13 = load i64** %src_strides3
  %14 = getelementptr inbounds i64* %13, i32 %3
  store i64 0, i64* %14
  br label %if.end11

if.else:                                          ; preds = %loop.body
  %15 = load i64* %10
  %16 = icmp eq i64 %15, 1
  br i1 %16, label %if.then6, label %if.else7

if.then6:                                         ; preds = %if.else
  store i64 %11, i64* %10
  br label %if.end11

if.else7:                                         ; preds = %if.else
  %17 = icmp ne i64 %11, %15
  br i1 %17, label %loop.end, label %if.end11

if.end11:                                         ; preds = %if.else7, %if.then6, %if.then
  %18 = load i32* %0
  %19 = add i32 %18, 1
  store i32 %19, i32* %0
  br label %loop.cond
}

define double @__numba_specialized_0___main___2E_sinc(double %x) {
entry:
  %0 = fcmp oeq double %x, 0.000000e+00
  br i1 %0, label %cleanup_label, label %"else_body_16:8"

cleanup_label:                                    ; preds = %entry, %"else_body_16:8"
  %storemerge = phi double [ %3, %"else_body_16:8" ], [ 1.000000e+00, %entry ]
  ret double %storemerge

"else_body_16:8":                                 ; preds = %entry
  %1 = fmul double %x, 0x400921FB54442D18
  %2 = tail call double @"numba.math.['double'].sin"(double %1)
  %3 = fdiv double %2, %1
  br label %cleanup_label
}

declare double @"numba.math.['double'].sin"(double)

define { i64, i8* }* @__numba_specialized_1_numba_2E_codegen_2E_llvmwrapper_2E___numba_wrapper_sinc(i8* %self, { i64, i8* }* %args) {
entry:
  %objtemp = alloca { i64, i8* }*
  store { i64, i8* }* null, { i64, i8* }** %objtemp, !tbaa !2
  %0 = alloca { i64, i8* }*
  %return_value = alloca { i64, i8* }*
  %1 = call i32 ({ i64, i8* }*, i8*, ...)* @PyArg_ParseTuple({ i64, i8* }* %args, i8* getelementptr inbounds ([2 x i8]* @__STR_0, i32 0, i32 0), { i64, i8* }** %0)
  %2 = icmp eq i32 %1, 0
  br i1 %2, label %cleanup.if.true, label %cleanup.if.end

cleanup_label:                                    ; preds = %no_error, %error_label
  %3 = load { i64, i8* }** %objtemp, !tbaa !2
  call void @Py_XDECREF({ i64, i8* }* %3)
  %4 = load { i64, i8* }** %return_value
  ret { i64, i8* }* %4

error_label:                                      ; preds = %empty1, %empty2, %cleanup.if.true
  store { i64, i8* }* null, { i64, i8* }** %return_value
  %5 = load { i64, i8* }** %return_value, !tbaa !2
  call void @Py_XINCREF({ i64, i8* }* %5)
  br label %cleanup_label

cleanup.if.true:                                  ; preds = %entry
  br label %error_label

cleanup.if.end:                                   ; preds = %entry
  %6 = load { i64, i8* }** %0
  %7 = call double @PyFloat_AsDouble({ i64, i8* }* %6)
  %8 = call double @__numba_specialized_0___main___2E_sinc(double %7)
  br label %empty

empty:                                            ; preds = %cleanup.if.end
  %9 = call i8* @PyErr_Occurred()
  %10 = ptrtoint i8* %9 to i64
  %11 = icmp ne i64 %10, 0
  br i1 %11, label %empty2, label %empty1

empty1:                                           ; preds = %empty
  %12 = call { i64, i8* }* @PyFloat_FromDouble(double %8)
  store { i64, i8* }* %12, { i64, i8* }** %objtemp, !tbaa !2
  %13 = ptrtoint { i64, i8* }* %12 to i64
  %14 = icmp eq i64 %13, 0
  br i1 %14, label %error_label, label %no_error

empty2:                                           ; preds = %empty
  br label %error_label

no_error:                                         ; preds = %empty1
  %15 = load { i64, i8* }** %objtemp, !tbaa !2
  store { i64, i8* }* %15, { i64, i8* }** %return_value
  %16 = load { i64, i8* }** %return_value, !tbaa !2
  call void @Py_XINCREF({ i64, i8* }* %16)
  br label %cleanup_label
}

declare { i64, i8* }* @PyFloat_FromDouble(double)

declare double @PyFloat_AsDouble({ i64, i8* }*)

declare i8* @PyErr_Occurred()

declare { i64, i8* }* @Py_BuildValue(i8*, ...)

declare i32 @PyArg_ParseTuple({ i64, i8* }*, i8*, ...)

declare void @PyErr_Clear()

!tbaa = !{!0, !1, !0, !1, !2}

!0 = metadata !{metadata !"root"}
!1 = metadata !{metadata !"char *", metadata !0}
!2 = metadata !{metadata !"object", metadata !1}

--------------------- Numba Encountered Errors or Warnings ---------------------

^
Warning 0:0: Unreachable code
--------------------------------------------------------------------------------
0.0707355302631

如您所见,最后显示正确的结果.

and as you can see, at the end the correct result is presented.

有人知道原因吗?

谢谢! 约翰·富兰克林爵士

Thank you! SirJohnFranklin

推荐答案

这看起来像LLVM中间代码.我无法在最后解释警告,但否则,您似乎就不必担心它.

That looks like the LLVM intermediate code. I can't explain the warning at the end, but otherwise, it doesn't look like you should worry about it.

我不确定您使用的是哪个版本的numba,但可能这个旧的(和现已关闭) numba问题可以为您提供帮助:显然,使用python -O运行可以抑制该输出.

I'm not sure what version of numba you're using, but perhaps this old (and now closed) numba issue can help you: apparently running with python -O can suppress that output.

如果没有,您应该尝试找到一种设置调试级别的方法(也许是在其他地方设置;如何运行代码?),这样就不会在级别.

If not, you should try and find a way to set the debug level (perhaps this is set somewhere else; how do you run the code?), so that you're not running/compiling the code at the DEBUG level.

更新

进行一些搜索后,似乎在logging.DEBUG上保留了一些调试级别.您可以在导入结束时执行以下操作,在脚本中解决此问题:

After some searching, it would appear that some debug levels were left at logging.DEBUG. You can work around this in your script by doing the following, at the end of your imports:

import logging
import numba
numba.codegen.debug.logger.setLevel(logging.INFO)

不太漂亮,也许还有更好的方法,但是作为一种变通办法,这可能行得通.

Not pretty, and perhaps there are better ways, but as a workaround this could work.

这篇关于尝试numba的巨大错误的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆