【问题标题】:Numba cuda is compiling but not working, without throwing exceptionsNumba cuda 正在编译但不工作,没有抛出异常
【发布时间】:2021-03-07 19:34:08
【问题描述】:

我正在尝试编写一个简单的函数来测试为什么 numba.cuda 不起作用。该函数应将变量设置为固定值。当我调用该函数时,它似乎可以编译,但没有任何反应。我补充说,它应该引发一个异常,只是为了看看,它被调用了,但又什么也没发生。我没有得到任何异常给我一个提示,为什么它不起作用。

功能:

from numba import cuda


@cuda.jit     # also tried it with brackets: @cuda.jit()
def cuda_func(out):
    out = 1
    raise NameError('MyException')

我这样调用函数:

>>> import Cuda_Class
>>> a = 0
>>> Cuda_Class.cuda_func[1, 1](a)
>>> a
0

numba.cuda.is_available 返回 True。

我在 miniconda 环境中工作,在安装 cuda 时遇到了一些问题。我不小心安装了多个版本,所以我不得不清除所有内容,并在我的基础环境中安装了 cuda 10.2。在 conda 环境中我安装了 cudatoolkit (10.2.89)。

我将CUDA_HOME 设置为/usr/local/cuda-10.2。所以nvcc --version 给了我正确的版本。所以编译器是可以访问的。

NUMBA_CUDA_DRIVER 应该指向cudalib.so,我很难找到它。我没有手动安装nvidia驱动,它是结合cuda安装的。我在/usr/local/cuda-10.2/targets/x86_64-linux/lib/stubs/libcuda.so 下找到了 cudalib.so。没有其他名为 libcuda.so 的文件,只有 libcuda.so.7。但是,即使在我设置 NUMBA_CUDA_DRIVER 并且它为空之前,行为也是完全相同的。没有反应,没有例外。看起来函数会被正确调用,但没有任何反应。

我剩下的唯一想法是,这可能是个问题,libcuda.so 位于“存根”文件夹中?

【问题讨论】:

  • 如果您在纯 Python 中毫无例外地编写了该代码(CUDA 内核不支持该代码),您会期望 a 的值在调用该函数后发生变化吗?整数是不可变的。
  • 它说here numba 支持 CUDA python 中的 raise 函数。因此,我认为它也支持引发异常。是的,我确实预料到了。我无法在内核函数中返回值。我只是将它更改为一个 numpy 数组并更改了第一个值。现在它真的变了。谢谢!
  • 应该注意的是,在 cuda 编译函数中引发异常(当然有某种条件保护)并不是一件明显的坏事。当我设置环境变量NUMBA_ENABLE_CUDASIM=1 然后在我的设备函数中设置各种异常条件和断言语句以捕获逻辑错误和意外行为时,我发现它很有帮助。通常assertexceptions 不会编译,但使用该环境变量会切换cuda 模拟器并允许更多pythonic 调试;但是,请注意,模拟器确实会减慢速度。

标签: exception cuda jit numba


【解决方案1】:

第一条评论解决了我的问题:

  1. 我尝试更改不可变 Integer 的值。
  2. 虽然 numba.cuda 支持 raise,但显然不支持异常。

这些错误都不会导致错误消息。

将“out”更改为数组并操作第一个值有效。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多