设备函数在返回列表而不是整数时抛出nopython异常

时间:2018-07-04 14:02:10

标签: python cuda numba

我编写的设备函数总是抛出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列表构造。帮助我的另一种方法是使用受支持的元组。

1 个答案:

答案 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)

使用循环来遍历各个数组切片并在每个元素之间执行减法。