我有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返回类型。
答案 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的荒谬方式。