用cuda.jit装饰器替换njit装饰器

时间:2019-05-03 20:55:19

标签: cuda numba numba-pro

我有Nvidia GPU,已下载CUDA,并正在尝试使用它。

说我有这个代码:

#@cuda.jit (Attempted fix #1)
#@cuda.jit(device = True) (Attempted fix #2)
#@cuda.jit(int32(int32,int32)) (Attempted fix #3)

@njit
def product(rho, theta):
    x = rho * (theta)
    return(x)
a = product(1,2)
print(a)

我如何使其与cuda.jit装饰器而不是njit一起使用?

我尝试过的事情:

当我将装饰器从@njit切换到@ cuda.jit时,我得到:TypingError:对于'$ 0.5',没有将int64转换为none,定义为None。

当我切换装饰器@ cuda.jit(device = True)时,我得到:TypeError:'DeviceFunctionTemplate'对象不可调用。

当我为输入和输出指定类型并使用装饰器@ cuda.jit(int32(int32,int32))时,我得到:TypeError:CUDA内核必须具有void返回类型。

1 个答案:

答案 0 :(得分:1)

numba cuda内核don't return anything。您必须通过参数/参数将结果返回给函数。这样做的起点通常是某种numpy数组。这是一个示例:

$ cat t44.py
from numba import cuda
import numpy as np

@cuda.jit
def product(rho, theta, x):
        x[0] = rho * (theta)

x = np.ones(1,dtype=np.float32)
product(1,2,x)
print(x)
$ python t44.py
[ 2.]
$

可能还有很多其他的事情要说;您可能希望利用上面链接的文档,例如this tutorial。通常,在GPU计算变得有趣之前,您将要处理比乘以两个标量大得多的问题。

此外,numba还提供了其他访问GPU计算的方法,这些方法不依赖于@cuda.jit装饰器的使用。这些方法,例如@vectorize已记录。

在调用product时,我还将省略任何内核启动配置语法。这在numba cuda中是合法的,但是它导致启动包含1个线程的1个块的内核。这适用于此特定示例,但这基本上是使用CUDA GPU的荒谬方式。