Collectives™ on Stack Overflow
Find centralized, trusted content and collaborate around the technologies you use most.
Learn more about Collectives
Teams
Q&A for work
Connect and share knowledge within a single location that is structured and easy to search.
Learn more about Teams
I am trying to get into
numba gpu processing
. I have this
MWE
:
import numpy as np
import numba
@numba.njit
def function():
ar = np.zeros((3, 3))
for i in range(3):
ar[i] = (1, 2, 3)
return ar
ar = function()
print(ar)
Output:
[[1. 2. 3.]
[1. 2. 3.]
[1. 2. 3.]]
Now I want to run it on my gpu
. I tried using following decorators
:
@numba.njit(target='cuda')
@numba.njit(target='gpu')
@numba.cuda.jit
none of which work. Here are the error messages of above decorators
:
Traceback (most recent call last):
File "/home/amu/Desktop/RL_framework/help_functions/test.py", line 4, in <module>
@numba.jit(target='cuda')
File "/home/amu/anaconda3/lib/python3.7/site-packages/numba/core/decorators.py", line 171, in jit
targetoptions=options, **dispatcher_args)
File "/home/amu/anaconda3/lib/python3.7/site-packages/numba/core/decorators.py", line 179, in _jit
dispatcher = registry.dispatcher_registry[target]
File "/home/amu/anaconda3/lib/python3.7/site-packages/numba/core/registry.py", line 96, in __getitem__
return super(TargetRegistry, self).__getitem__(item)
KeyError: 'cuda'
Traceback (most recent call last):
File "/home/amu/Desktop/RL_framework/help_functions/test.py", line 4, in <module>
@numba.njit(target='gpu')
File "/home/amu/anaconda3/lib/python3.7/site-packages/numba/core/decorators.py", line 236, in njit
return jit(*args, **kws)
File "/home/amu/anaconda3/lib/python3.7/site-packages/numba/core/decorators.py", line 171, in jit
targetoptions=options, **dispatcher_args)
File "/home/amu/anaconda3/lib/python3.7/site-packages/numba/core/decorators.py", line 179, in _jit
dispatcher = registry.dispatcher_registry[target]
File "/home/amu/anaconda3/lib/python3.7/site-packages/numba/core/registry.py", line 96, in __getitem__
return super(TargetRegistry, self).__getitem__(item)
KeyError: 'gpu'
Traceback (most recent call last):
File "/home/amu/Desktop/RL_framework/help_functions/test.py", line 4, in <module>
@numba.cuda.jit()
File "/home/amu/anaconda3/lib/python3.7/site-packages/numba/__init__.py", line 140, in __getattr__
) from None
AttributeError: module 'numba' has no attribute 'cuda'
numba.cuda
is not even recognized as module function
. I have numba 49.1
and cudatoolkit 9.0
installed.
Do I have to change the function
for this to work? I have a huge numba.njit
function that I need to run on a gpu
.
I was trying to learn more about numba's cuda implementation
from:
http://numba.pydata.org/numba-doc/0.16.0/modules/numba.cuda.html
Thank you in advance.
Edit:
As @talonmies proposed I imported cuda
explicitly from the numba
module and outsourced the array creation:
import numpy as np
import numba
from numba import cuda
@numba.njit(target='cuda')
def function(ar=None):
for i in range(3):
ar[i] = (1, 2, 3)
return ar
ar = np.zeros((3, 3))
ar_result = function(ar=ar)
print(ar_result)
Output:
Traceback (most recent call last):
File "/home/amu/Desktop/RL_framework/help_functions/test.py", line 12, in <module>
ar_result = function(ar=ar)
File "/home/amu/anaconda3/lib/python3.7/site-packages/numba/cuda/dispatcher.py", line 40, in __call__
return self.compiled(*args, **kws)
TypeError: __call__() got an unexpected keyword argument 'ar'
This error
occurs with every of the aforementioned decorators
except @numba.njit
.
Edit_2:
When I try to run:
import numpy as np
import numba
from numba import cuda
@numba.jit(target='cuda')
def function(ar):
for i in range(3):
ar[i] = (1,2,3)
ar = np.zeros((3, 3))
function(ar)
print(ar)
the output is:
Traceback (most recent call last):
File "/home/amu/Desktop/RL_framework/help_functions/test.py", line 11, in <module>
function(ar)
File "/home/amu/anaconda3/lib/python3.7/site-packages/numba/cuda/dispatcher.py", line 40, in __call__
return self.compiled(*args, **kws)
File "/home/amu/anaconda3/lib/python3.7/site-packages/numba/cuda/compiler.py", line 758, in __call__
kernel = self.specialize(*args)
File "/home/amu/anaconda3/lib/python3.7/site-packages/numba/cuda/compiler.py", line 769, in specialize
kernel = self.compile(argtypes)
File "/home/amu/anaconda3/lib/python3.7/site-packages/numba/cuda/compiler.py", line 785, in compile
**self.targetoptions)
File "/home/amu/anaconda3/lib/python3.7/site-packages/numba/core/compiler_lock.py", line 32, in _acquire_compile_lock
return func(*args, **kwargs)
TypeError: compile_kernel() got an unexpected keyword argument 'boundscheck'
–
–
–
–
Three points:
You have to explicitly import the cuda module from numba to use it (this isn't specific to numba, all python libraries work like this)
The nopython mode (njit
) doesn't support the CUDA target
Array creation, return values, keyword arguments are not supported in Numba for CUDA code
I can fix all that like this:
...: import numpy as np
...: import numba
...: from numba import cuda
...: @numba.jit(target='cuda')
...: def function(ar):
...: for i in range(3):
...: ar[i] = (1,2,3)
...: ar = np.zeros((3, 3))
...: function(ar)
...: print(ar)
[[1. 2. 3.]
[1. 2. 3.]
[1. 2. 3.]]
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.