我编写的设备函数总是抛出no python异常,而且我不明白为什么或在哪里出错。
这是一个代表我的问题的小例子。 我有从内核调用的以下设备函数:
@cuda.jit (device=True)
def sub_stuff(vec_a, vec_b):
x0 = vec_a[0] - vec_b[0]
x1 = vec_a[1] - vec_b[1]
x2 = vec_a[2] - vec_b[2]
return [x0, x1, x2]
调用此函数的内核如下:
@cuda.jit
def kernel_via_polygon(vectors_a, vectors_b, result_array):
pos = cuda.grid(1)
if pos < vectors_a.size and pos < result_array.size:
result_array[pos] = sub_stuff(vectors_a[pos], vectors_b[pos])
三个输入数组如下:
vectors_a = np.arange(1, 10).reshape((3, 3))
vectors_b = np.arange(1, 10).reshape((3, 3))
result = np.zeros_like(vectors_a)
当我现在通过 trace_via_polygon(vectors_a,vectors_b,result)调用函数时,没有python错误被抛出。当设备功能仅返回整数值时,可以避免此错误。 有人可以向我解释我的错误在哪里吗?
编辑:仅供参考 设备代码不支持talonmies列表构造。帮助我的另一种方法是使用受支持的元组。
答案 0 :(得分:2)
错误的根源是设备功能sub_stuff
试图在GPU代码中创建列表,但不支持。
关于您能做的最好的事情是这样的:
from numba import jit, guvectorize, int32, int64, float64
from numba import cuda
import numpy as np
import math
@cuda.jit (device=True)
def sub_stuff(vec_a, vec_b, result):
for i in range(vec_a.shape[0]):
result[i] = vec_a[i] - vec_b[i]
@cuda.jit
def kernel_via_polygon(vectors_a, vectors_b, result_array):
pos = cuda.grid(1)
if pos < vectors_a.size and pos < result_array.size:
sub_stuff(vectors_a[pos], vectors_b[pos], result_array[pos])
vectors_a = 100 + np.arange(1, 10).reshape((3, 3))
vectors_b = np.arange(1, 10).reshape((3, 3))
result = np.zeros_like(vectors_a)
kernel_via_polygon[1,10](vectors_a, vectors_b, result)
print(result)
使用循环来遍历各个数组切片并在每个元素之间执行减法。