可以在用户创建的 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 传输数据这么慢?

如何使用 Python 和 Numba 获取 GPU 中的 CUDA 内核数量?

在 Python 中访问 GPU 硬件规范?