如何在 cuda 中获取当前工作网格索引 python
How to get current working grid index in cuda python
您好,我正在尝试了解 cuda 内核的每一步。很高兴获得数据占用的所有网格索引。我的代码是添加 2 个向量并用 python numba 编写。
n = 10
x = np.arange(n).astype(np.float32)
y = x + 1
设置网格中的线程数和块数
threads_per_block = 8
blocks_per_grid = 2
内核
def kernel_manual_add(x, y, out):
threads_number = cuda.blockDim.x
block_number = cuda.gridDim.x
thread_index = cuda.threadIdx.x
block_index = cuda.blockIdx.x
grid_index = thread_index + block_index * threads_number
threads_range = threads_number * block_number
for i in range(grid_index, x.shape[0], threads_range):
out[i] = x[i] + y[i]
初始化内核:
kernel_manual_add[blocks_per_grid, threads_per_block](x, y, out)
当我尝试打印时 grid_index 我得到所有输入索引 2*8。
如何获取用于计算数据的网格索引(其中 10 个)?
编写内核的规范方式应该是这样的
@cuda.jit
def kernel_manual_add(x, y, out):
i = cuda.grid(1)
if i < x.shape[0]:
out[i] = x[i] + y[i]
您必须 运行 至少与输入数组中的元素一样多的线程。这里没有魔法,您需要在调用内核之前手动计算网格和块尺寸。请参阅 here and here 以获取建议。
您好,我正在尝试了解 cuda 内核的每一步。很高兴获得数据占用的所有网格索引。我的代码是添加 2 个向量并用 python numba 编写。
n = 10
x = np.arange(n).astype(np.float32)
y = x + 1
设置网格中的线程数和块数
threads_per_block = 8
blocks_per_grid = 2
内核
def kernel_manual_add(x, y, out):
threads_number = cuda.blockDim.x
block_number = cuda.gridDim.x
thread_index = cuda.threadIdx.x
block_index = cuda.blockIdx.x
grid_index = thread_index + block_index * threads_number
threads_range = threads_number * block_number
for i in range(grid_index, x.shape[0], threads_range):
out[i] = x[i] + y[i]
初始化内核:
kernel_manual_add[blocks_per_grid, threads_per_block](x, y, out)
当我尝试打印时 grid_index 我得到所有输入索引 2*8。
如何获取用于计算数据的网格索引(其中 10 个)?
编写内核的规范方式应该是这样的
@cuda.jit
def kernel_manual_add(x, y, out):
i = cuda.grid(1)
if i < x.shape[0]:
out[i] = x[i] + y[i]
您必须 运行 至少与输入数组中的元素一样多的线程。这里没有魔法,您需要在调用内核之前手动计算网格和块尺寸。请参阅 here and here 以获取建议。