可以在用户创建的 numba CUDA 设备函数中调用 numba.cuda.random 设备函数吗?
Posted
技术标签:
【中文标题】可以在用户创建的 numba CUDA 设备函数中调用 numba.cuda.random 设备函数吗?【英文标题】:Can you call the numba.cuda.random device function in user-created numba CUDA device functions? 【发布时间】:2022-01-08 12:19:48 【问题描述】:我在 numba 中有一个 cuda 内核和几个设备函数用于一个项目。当我尝试从
拨打xoroshiro128p_uniform_float32
numba.cuda.random
模块。每当我尝试调用它时,我都会得到:
import numba
from numba import cuda
from numba.cuda.random import create_xoroshiro128p_states
from numba.cuda.random import xoroshiro128p_uniform_float64
@cuda.jit('void(float32[:,:])', device=True)
def device(rng_states):
thread_id = cuda.grid(1)
probability = xoroshiro128p_uniform_float64(rng_states, thread_id)
@cuda.jit()
def kernel(rng_states):
device(rng_states)
BPG = 10
TPB = 10
rng_states = create_xoroshiro128p_states(BPG * TPB, seed=42069)
kernel[TPB, BPG](rng_states)
TypingError: Failed in cuda mode pipeline (step: nopython frontend) Untyped global name 'xoroshiro128p_uniform_float32': Cannot determine Numba type of <class 'function'>
之前有没有人在 numba 上成功调用过 CUDA 设备函数中的导入函数?
【问题讨论】:
不,你不能。 numba documentation 描述了您可以在 CUDA 内核代码中执行/使用的操作。但是,如果您想要随机数,则可以使用 example numba code 来执行此操作(基本上是一种特殊情况)。 @RobertCrovella 这就是我想要做的...... xoroshiro128p_uniform_float32 是我试图调用的函数。它只是抛出上述错误 @RobertCrovella 编辑标题以使其更具描述性 我链接的代码给出了一个例子。如果您遇到问题,请提供minimal reproducible example @RobertCrovella 代码已添加 【参考方案1】:错误在这里:
@cuda.jit('void(float32[:,:])', device=True)
def device(rng_states):
那个签名是不正确的,也是不必要的。据我所知,没有理由认为 rng_states
是或应该是二维 float32
数组。
这样做:
@cuda.jit(device=True)
def device(rng_states):
我注意到的其他几件事不是最近的问题:
内核启动首先指定每个网格的块,然后是每个块的线程。因此,如果您将来修改某些内容,这可能是不正确的:
kernel[TPB, BPG](rng_states)
在我看来,最好写成:
kernel[BPG, TPB](rng_states)
最后,你的问题是:
当我尝试调用 xoroshiro128p_uniform_float32
但您的代码反映了:
probability = xoroshiro128p_uniform_float64(
关于这个问题:
之前有没有人在 numba 上的 CUDA 设备函数中成功调用过导入函数?
在一般情况下,来自 python 导入的函数可能在 CUDA 设备代码中可用,也可能不可用。 (大多数是not usable。)这个由numba
提供的随机数生成器可以称为“特例”。
【讨论】:
以上是关于可以在用户创建的 numba CUDA 设备函数中调用 numba.cuda.random 设备函数吗?的主要内容,如果未能解决你的问题,请参考以下文章
在numba中cuda.local.array的正确用法是什么?
即使对于巨型矩阵,NUMBA CUDA 也比并行 CPU 慢
numba和tensorflow一起给出了CUDA_ERROR_OUT_OF_MEMORY
为啥同时使用 numba.cuda 和 CuPy 从 GPU 传输数据这么慢?