【CUDA编程系列】Numba:在python中实现cuda编程

前言: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加速需要用到的修饰器主要是vectorizecuda
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.jitcuda的内核函数不可以有返回值,@cuda.jit(device=True)cuda的设备函数可以有返回值
6.函数内部不能调用自己定义的普通函数和绝大多数第三方库函数

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值