为什么此 numba.cuda 查找 table 实施失败?
Why is this numba.cuda lookup table implementation failing?
我正在尝试实现一个转换,该转换在其中的某个阶段具有查找 table < 1K 的大小。在我看来,这应该不会对现代显卡造成问题。
但是下面的代码因未知错误而失败:
from numba import cuda, vectorize
import numpy as np
tmp = np.random.uniform( 0, 100, 1000000 ).astype(np.int16)
tmp_device = cuda.to_device( tmp )
lut = np.arange(100).astype(np.float32) * 2.5
lut_device = cuda.to_device(lut)
@cuda.jit(device=True)
def lookup(x):
return lut[x]
@vectorize("float32(int16)", target="cuda")
def test_lookup(x):
return lookup(x)
test_lookup(tmp_device).copy_to_host() # <-- fails with cuMemAlloc returning UNKNOWN_CUDA_ERROR
我在做什么违背了numba.cuda的精神?
即使将 lookup
替换为以下简化代码也会导致相同的错误:
@cuda.jit(device=True)
def lookup(x):
return x + lut[1]
一旦出现这个错误,我基本上就完全无法再使用cuda上下文了。例如,通过 cuda.to_device
分配一个新数组会导致:
numba.cuda.cudadrv.driver.CudaAPIError: [719] Call to cuMemAlloc results in UNKNOWN_CUDA_ERROR
运行 上:4.9.0-5-amd64 #1 SMP Debian 4.9.65-3+deb9u2 (2018-01-04)
驱动程序版本:390.25
numba: 0.33.0
以上代码修改粗体部分修复:
@cuda.jit(device=True)
def lookup(x):
lut_device = cuda.const.array_like(lut)
return lut_device[x]
我 运行 代码的多种变体,包括简单地从这个内核中接触查找 table,但不使用它的输出。这与@talonmies 断言 UNKNOWN_CUDA_ERROR 通常与无效指令一起出现相结合,我认为可能存在导致问题的共享内存约束。
上面的代码使整个事情正常进行。但是,我仍然不明白为什么要深刻。
如果有人知道并理解原因,请随时为这个答案做出贡献。
我正在尝试实现一个转换,该转换在其中的某个阶段具有查找 table < 1K 的大小。在我看来,这应该不会对现代显卡造成问题。
但是下面的代码因未知错误而失败:
from numba import cuda, vectorize
import numpy as np
tmp = np.random.uniform( 0, 100, 1000000 ).astype(np.int16)
tmp_device = cuda.to_device( tmp )
lut = np.arange(100).astype(np.float32) * 2.5
lut_device = cuda.to_device(lut)
@cuda.jit(device=True)
def lookup(x):
return lut[x]
@vectorize("float32(int16)", target="cuda")
def test_lookup(x):
return lookup(x)
test_lookup(tmp_device).copy_to_host() # <-- fails with cuMemAlloc returning UNKNOWN_CUDA_ERROR
我在做什么违背了numba.cuda的精神?
即使将 lookup
替换为以下简化代码也会导致相同的错误:
@cuda.jit(device=True)
def lookup(x):
return x + lut[1]
一旦出现这个错误,我基本上就完全无法再使用cuda上下文了。例如,通过 cuda.to_device
分配一个新数组会导致:
numba.cuda.cudadrv.driver.CudaAPIError: [719] Call to cuMemAlloc results in UNKNOWN_CUDA_ERROR
运行 上:4.9.0-5-amd64 #1 SMP Debian 4.9.65-3+deb9u2 (2018-01-04)
驱动程序版本:390.25
numba: 0.33.0
以上代码修改粗体部分修复:
@cuda.jit(device=True)
def lookup(x):
lut_device = cuda.const.array_like(lut)
return lut_device[x]
我 运行 代码的多种变体,包括简单地从这个内核中接触查找 table,但不使用它的输出。这与@talonmies 断言 UNKNOWN_CUDA_ERROR 通常与无效指令一起出现相结合,我认为可能存在导致问题的共享内存约束。
上面的代码使整个事情正常进行。但是,我仍然不明白为什么要深刻。
如果有人知道并理解原因,请随时为这个答案做出贡献。