cuda - 用 cuda.jit 装饰器替换 njit 装饰器
问题描述
我有一个 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: No conversion from int64 to none for '$0.5', defined at None。
当我切换装饰器@cuda.jit(device = True) 时,我得到: TypeError: 'DeviceFunctionTemplate' object is not callable。
当我为输入和输出指定类型并使用装饰器@cuda.jit(int32(int32,int32)) 时,我得到:TypeError: CUDA kernel must have void return type。
解决方案
numba cuda 内核不返回任何内容。您必须通过参数/参数将结果返回给函数。这样做的起点通常是某种 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.]
$
可能还有很多其他的事情可以说;您可能希望利用上面链接的文档,或者例如本教程。通常,在 GPU 计算变得有趣之前,您会想要处理比两个标量相乘更大的问题。
此外,numba 提供了其他方法来访问 GPU 计算,这些方法不依赖于@cuda.jit
装饰器的使用。这些方法,如@vectorize
已记录在案。
我还在调用product
. 这在 numba cuda 中是合法的,但它会导致启动包含 1 个线程的 1 个块的内核。这适用于这个特定的示例,但这基本上是一种使用 CUDA GPU 的荒谬方式。
推荐阅读
- java - 如何从片段内调用 asyncTask 到外部服务
- java - 图形类画的圆不动
- javascript - “信用卡”输入栏不可用
- html - 重复第 n 个子值
- vue.js - VueJs Web 应用程序无法显示产品
- jwt - 从 JWT 生成访问令牌
- xpath - 表格中的 Google 工作表导入数据(ImportXML 和 ImportHTML 不起作用)
- scala - Scala RestAPI 客户端设计:处理异常
- javascript - 如何从客户端发送 Firebase 令牌并在 server.js 中接收它
- opengl - 如何手动绘制 3 个深度缓冲区?每个深度缓冲区值必须大于其前一个计数器部分