numba 操作pytorch GPU tensor

numba可以对numpy的array使用gpu进行并行计算,从而进行加速。

import numpy as np
from numba import cuda

自定义numba cuda函数
@cuda.jit
def mat_add(A, B, C):
    j, i = cuda.grid(2)
    C[i, j] = A[i, j] + B[i, j]

a = np.arange(12).reshape(3, 4)
b = np.arange(12, 24).reshape(3, 4)
c = cuda.device_array_like(a_in)

a_dev = cuda.to_device(a)
b_dev = cuda.to_device(b)

blocks = (1, 1)
threads_per_block = (4, 3)

mat_add[blocks, threads_per_block](a_dev, b_dev, c)
print(c.copy_to_host())

其它

stride_j, stride_i = cuda.gridsize(2)

使用共享内存
tmp = cuda.shared.array((32, 32), numba.types.int32)
对共享内存的读写要注意进行同步
cuda.syncthreads()

pytorch现在提供给numba一个接口,可以使用numba直接对pytorch的gpu tensor进行操作,从而可以比较方便地实现自己想要的一些运算。

import torch
import numba.cuda

a = torch.arange(12).reshape(3,4).cuda()
a_nb = numba.cuda.as_cuda_array(a)
# 这里a_nb和a的数据是同一片内存空间的,因此a_nb对数据修改,a的数据也会同样修改,反之亦然。
# 得到a_nb后,就可以用自定义的并行运算函数进行操作了