例如,下面是用指针来返回一个简单的C函数值:如何调用使用指针在Numba返回值ctypes的功能@jit
void add(double x, double y, double *r)
{
*r = x + y;
}
我想打电话给每一个元素add()
功能在两个数组中,并通过numba @jit函数收集结果。
第一编译的C代码:
!gcc -c -fpic func.c
!gcc -shared -o func.so func.o
而且通过ctypes的加载:
lib = ctypes.cdll.LoadLibrary("./func.so")
add = lib.add
add.argtypes = ctypes.c_double, ctypes.c_double, ctypes.c_void_p
add.restype = None
则numba函数:
from numba import jit, float64
@jit(float64(float64[:], float64[:]))
def f(x, y):
z = np.zeros_like(x)
for i in range(x.shape[0]):
add(x[i], y[i], &z[i]) # here I want to pass the address of z[i]
return z
但是numba没有AddressOf运算或函数。
目前我正在使用以下方法。但是这种方法不能用于nopython模式,并且我不知道for循环中的代码是否具有python对象。
@jit(float64(float64[:], float64[:]))
def f(x, y):
z = np.zeros_like(x)
tmp = ctypes.c_double(0.0)
addr = intp(ctypes.addressof(tmp))
val = carray(ctypes.pointer(tmp), 1)
for i in range(x.shape[0]):
add(x[i], y[i], addr)
z[i] = val[0]
return z
如何编写一个在整个数组上运行的C包装函数,所以你根本不需要Numba? –
目前我正在使用cython来完成这项工作,但是我想切换到numba,并且坚持了这个问题。 – HYRY
供参考:'add.argtypes = ctypes.c_double,ctypes.c_double,ctypes.POINTER(ctypes.c_double)'会更准确。传递参数是:'tmp = ctypes.c_double()'和'add(1.0,2.0,ctypes.byref(tmp))''。 'tmp.value'就是结果。 –