Let’s say I have a function with the following signature:
float fractal(vector position, float H , float lacunarity , int octaves, string type)
and I want to register this buitin function in order to use it from njit functions
How do I do that?
Let’s say I have a function with the following signature:
float fractal(vector position, float H , float lacunarity , int octaves, string type)
and I want to register this buitin function in order to use it from njit functions
How do I do that?
Hi @rpopovici
I’m not quite sure what you are asking. If you have a function fractal
that is already jit compatible then just @numba.njit
decorate it? If you are referring to fractal
as a prototype from an external API and you wish to replicate the functionality with @jit
, then I suggest using @numba.extending.overload
docs are here and a user guide is here.
Hope this helps?
@stuartarchibald The function is already implemented in C and exported as a builtin for python. Basicaly, I am trying to call this builtin from an njit but I get:
Untyped global name 'hybrid_multi_fractal': Cannot determine Numba type of <class 'builtin_function_or_method'>
If it’s an exported C symbol then perhaps user Numba’s ctypes
support. Example of binding to libm
's cos
function.
In [1]: import ctypes
In [2]: from numba import njit
In [3]: libm = ctypes.CDLL('libm.so')
In [4]: libm.cos.restype = ctypes.c_double # define return type
In [5]: libm.cos.argtypes = (ctypes.c_double,) # define arg type(s)
In [6]: cos_binding = libm.cos # bind directly to the function so that numba can resolve it
In [7]: @njit
...: def foo(x):
...: return cos_binding(x)
...:
In [8]: cos_binding(3.14159) # Call ctypes binding directly
Out[8]: -0.9999999999964793
In [9]: foo(3.14159) # Call ctypes binding from jit code
Out[9]: -0.9999999999964793
If cython
is used for creating or exporting the function then this might help too: https://numba.readthedocs.io/en/stable/extending/high-level.html#importing-cython-functions
@stuartarchibald that’s the thing. This function is statically linked to the main executable. There is no dll to load with ctypes. I don’t know if it’s possible to convert the imported python wrapper to a ctypes function call…
Without a library symbol to bind to there’s not a lot of options available for use by python (as a raw function call) or anything else? I suspect it will not be possible to convert the wrapper to a ctype
s call, the wrapper will expect PyObject
instances and return the same so it’s not suitable. Options available are to either try and find a way to get hold of that symbol, translate the compiled code into Python and JIT it, or use an objmode
block and accept the performance penalty for doing so.