前言:cuda编程主要是通过cuda将需要运算的数据放入GPU进行运算,GPU多核心,非常适合并行计算,处理图像算法领域的矩阵计算效率非常高。(可为每一个像素点运算分配一个核)
一般的深度学习模型已经可以自动调用CUDA,我们写的底层代码中的矩阵计算也是可以通过cuda编程实现gpu加速的。
(PS:numba除了cuda加速外,用作CPU上的加速和numpy的加速效果也非常好,这章侧重于numba对于cuda的加速)
1.安装环境:
很简单,安装numba库即可pip install cuda
2.简单应用案例(先代码,后讲解)
先尽量以最简洁的方式实现一遍应用
from numba import vectorize
#定义numba特殊格式的函数
@vectorize(["float32(float32, float32)"], target='cuda')
def Add(a, b):
return a + b
N=128
# 创建矩阵:
a = np.ones((N,N),dtype=np.float32)
b = np.ones((N,N),dtype=np.float32)
# 矩阵加法(cuda加速)
c = a+b
@vectorize装饰器在运行时生成标量函数Add的已编译矢量化版本,以便它可用于在GPU上并行处理数据数组
使用它的要求不多。基本上,你写一个自己的“普通”的Python函数,然后给函数定义添加一个装饰,如上一段代码中的:
@vectorize(["float32(float32, float32)"], target='cuda')
用到的是vectorize
型的修饰器,允许将标量参数用作numpy ufunc,cuda加速需要用到的修饰器主要是vectorize
和cuda
vectorize
特点:
1.可以直接操作数组(矩阵)计算
2.无法进行特定行列操作(像素级操作),例如二值化,求非0像素点···
3.不需要进行GPU和CPU直接的信息交互
4.不需要自己定义Block和Grid,不需要设置kernel函数(根据线程号进行操作)
5.可以有返回值
6.函数内部不能调用自己定义的普通函数和绝大多数第三方库函数
cuda
特点:
1.不可以直接操作数组(矩阵)计算
2.可以进行特定行列操作(像素级操作)
3.需要进行GPU和CPU直接的信息交互
4.需要自己定义Block和Grid,设置kernel函数
5.@cuda.jit
cuda的内核函数不可以有返回值,@cuda.jit(device=True)
cuda的设备函数可以有返回值
6.函数内部不能调用自己定义的普通函数和绝大多数第三方库函数