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

Device function throws nopython exception when its returning a list instead of an integer

我写的一个设备函数总是抛出一个 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 错误被抛出。当设备函数 return 只有整数值时,可以防止此错误。 有人可以向我解释我的错误在哪里吗?

编辑: 仅供参考 设备代码不支持 talonmies 列表构造。另一种对我有帮助的方法是使用支持的元组。

您的错误来源是设备功能 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)

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