【发布时间】:2021-08-15 04:13:09
【问题描述】:
我是 Numba 的初学者。我很难在 GPU 中重新排列数组的行。
例如,在 Numba CPU 中,这可以通过
from numba import njit
import numpy as np
@njit
def numba_cpu(A, B, ind):
for i, t in enumerate(ind):
B[i, :] = A[t, :]
ind = np.array([3, 2, 0, 1, 4])
A = np.random.rand(5, 3)
B = np.zeros((5, 3))
numba_cpu(A, B, ind)
但它不适用于 cuda.jit
from numba import cuda
import numpy as np
@cuda.jit
def numba_gpu(A, B, ind):
for i, t in enumerate(ind):
B[i, :] = A[t, :]
d_ind = cuda.to_device(np.array([3, 2, 0, 1, 4]))
d_A = cuda.to_device(np.random.rand((5, 3)))
d_B = cuda.to_device(np.zeros((5, 3)))
numba_gpu[16,16](d_A, d_B, d_ind)
程序失败并出现很多异常,并显示“需要 NRT 但未启用”。
当然,我可以使用嵌套循环逐个复制条目,但它看起来很糟糕,因为我知道 a 行在连续的内存中。即使是类似 C 语言的 memcpy 也会更好。但似乎 Numba 不支持memcpy。
【问题讨论】:
-
在 numba CUDA 中最有效的方法是使用相邻线程将
A行中的相邻元素复制到B行中的相邻元素。您不想使用“普通”循环。 numba CUDA 支持的比普通的 numba 支持的少,也远低于 numpy 或 python 所支持的。支持的功能列表是here。如果您要执行的操作不在该列表中,则通常是行不通的。 -
谢谢。很高兴知道限制。