Question

I'm trying to get started with Numba, and having gotten it installed my first experience was with the following bit of code:

from numba import autojit

@autojit
def trial(a,b):
    return a+b

trial(1,1)

I get the following error, which tells me autojit is misinterpreting a variable type, but doesn't tell me much more. (The same happens with other ways of wrapping the function, like @jit(...) for example.) The problem is similar to this, but is not operation-specific: it happens regardless of what the function is doing or how simple it is (as the example shows). Any suggestions for what the problem might be? Running on Ubuntu 12.04 and installed according to the instructions on Github.

---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-1-653102b59b98> in <module>()
      5     return a+b
      6 
----> 7 trial(1,1)

/usr/local/lib/python2.7/dist-packages/numba/numbawrapper.so in numba.numbawrapper._NumbaSpecializingWrapper.__call__ (numba/numbawrapper.c:3934)()

/usr/local/lib/python2.7/dist-packages/numba/wrapping/compiler.pyc in compile_from_args(self, args, kwargs)
     67     def compile_from_args(self, args, kwargs):
     68         signature = self.resolve_argtypes(args, kwargs)
---> 69         return self.compile(signature)
     70 
     71     def compile(self, signature):

/usr/local/lib/python2.7/dist-packages/numba/wrapping/compiler.pyc in compile(self, signature)
     86                      env=self.env, func_ast=self.ast, **self.flags)
     87 
---> 88         compiled_function = dec(self.py_func)
     89         return compiled_function
     90 

/usr/local/lib/python2.7/dist-packages/numba/decorators.pyc in _jit_decorator(func)
    222         sig, lfunc, wrapper = compile_function(env, func, argtys,
    223                                                restype=return_type,
--> 224                                                nopython=nopython, func_ast=func_ast, **kwargs)
    225         return numbawrapper.create_numba_wrapper(func, wrapper, sig, lfunc)
    226 

/usr/local/lib/python2.7/dist-packages/numba/decorators.pyc in compile_function(env, func, argtypes, restype, func_ast, **kwds)
    131     assert kwds.get('llvm_module') is None, kwds.get('llvm_module')
    132 
--> 133     func_env = pipeline.compile2(env, func, restype, argtypes, func_ast=func_ast, **kwds)
    134 
    135     function_cache.register_specialization(func_env)

/usr/local/lib/python2.7/dist-packages/numba/pipeline.pyc in compile2(env, func, restype, argtypes, ctypes, compile_only, func_ast, **kwds)
    142         pipeline = env.get_pipeline(kwds.get('pipeline_name', None))
    143         func_ast.pipeline = pipeline
--> 144         post_ast = pipeline(func_ast, env)
    145         func_signature = func_env.func_signature
    146         symtab = func_env.symtab

/usr/local/lib/python2.7/dist-packages/numba/pipeline.pyc in __call__(self, ast, env)
    189 
    190         if self.is_composed:
--> 191             ast = self.transform(ast, env)
    192         else:
    193             try:

/usr/local/lib/python2.7/dist-packages/numba/pipeline.pyc in transform(self, ast, env)
    654                 stage_tuple = (stage, utils.ast2tree(ast))
    655                 logger.debug(pprint.pformat(stage_tuple))
--> 656             ast = stage(ast, env)
    657         return ast
    658 

/usr/local/lib/python2.7/dist-packages/numba/pipeline.pyc in _stage(ast, env)
    639             def _stage(ast, env):
    640                 stage_obj = getattr(env.pipeline_stages, name)
--> 641                 return _check_stage_object(stage_obj)(ast, env)
    642             _stage.__name__ = name
    643             stage = _stage

/usr/local/lib/python2.7/dist-packages/numba/pipeline.pyc in __call__(self, ast, env)
    192         else:
    193             try:
--> 194                 ast = self.transform(ast, env)
    195             except error.NumbaError as e:
    196                 func_env = env.translation.crnt

/usr/local/lib/python2.7/dist-packages/numba/pipeline.pyc in transform(self, ast, env)
    551             **func_env.kwargs)
    552 
--> 553         func_env.translator.translate()
    554         func_env.lfunc = func_env.translator.lfunc
    555         return ast

/usr/local/lib/python2.7/dist-packages/numba/codegen/translate.pyc in translate(self)
    327         self.lfunc = None
    328         try:
--> 329             self.setup_func()
    330             if isinstance(self.ast, ast.FunctionDef):
    331                 # Handle the doc string for the function

/usr/local/lib/python2.7/dist-packages/numba/codegen/translate.pyc in setup_func(self)
    304 
    305         # TODO: Put current function into symbol table for recursive call
--> 306         self.setup_return()
    307 
    308         if self.have_cfg:

/usr/local/lib/python2.7/dist-packages/numba/codegen/translate.pyc in setup_return(self)
    471             llvm_ret_type = self.func_signature.return_type.to_llvm(self.context)
    472             self.return_value = self.builder.alloca(llvm_ret_type,
--> 473                                                     "return_value")
    474 
    475         # All non-NULL object emporaries are DECREFed here

/usr/local/lib/python2.7/dist-packages/llvm/core.pyc in alloca(self, ty, size, name)
   2303 
   2304     def alloca(self, ty, size=None, name=""):
-> 2305         sizeptr = size._ptr if size else None
   2306         return _make_value(self._ptr.CreateAlloca(ty._ptr, sizeptr, name))
   2307 

AttributeError: 'str' object has no attribute '_ptr'

Edit: In response to @JoshAdel, I used the instructions for "Custom Python Environments" on the Github page, with my LLVM_BUILD_DIR=/opt/. From the CHANGE_LOG in the repo, I take the version I installed to be 0.11. If I run the example you provide, I get

from numba import autojit, typeof

@autojit
def trial(a,b):
    print typeof(a), typeof(b)
    return a+b

trial(1,1)

to which

  File "<unknown file>", line 2
    print typeof(a), typeof(b)
               ^
SyntaxError: invalid syntax

If I remove the @autojit it works ok. That it throws a SyntaxError with @autojit invoked is certainly a clue, but I'm new enough to this that I couldn't say what...

Also, in case it matters, I'm running this in an IPython Notebook so that numpy, scipy, and matplotlib are automatically loaded on startup.

Was it helpful?

Solution

I think the problem might be related to this commit:

https://github.com/llvmpy/llvmpy/commit/b9752e1e981499879823f1f371e61b037706be4b

You'll see the API to alloca changed (the second argument is now size, instead of name). The NUMBA code appears to be passing a name (i.e. 'return_value') as the second argument. As a glace I would guess that you could change all of the numba calls to pass None. For example, here is one line where I got the same error:

        self.return_value = self.builder.alloca(llvm_ret_type,
                                                "return_value")

Switching it to:

        self.return_value = self.builder.alloca(llvm_ret_type, None,
                                                "return_value")

And you would get the correct behavior.

OTHER TIPS

This code works for using Numba 0.11.1 from the Anaconda distribution on OSX. Which version are you using? You said you installed via the instructions on github, but there are several options listed for doing so. Also, what is the output of this slight change (you might have to tweak things further, like drop the return statement to get it to run):

from numba import autojit, typeof

@autojit
def trial(a,b):
    print typeof(a), typeof(b)
    return a+b

print trial(1,1)

I get:

int int
2
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top