numba.cuda OpenCV 图像处理

一、 什么是numba

python - numba
numba.cuda
numba能够帮助python进行动态编译(JIT),通过借助numba.cuda可以实现对GPU的动态编译,实现CUDA API。在Python中运行CUDA的方法有很多,NVIDIA 官方也推出了 CUDA Python

二、代码实现

本文章的代码已经托管到Gitee

程序需要导入的Python 包(可以通过项目代码中的requirements.txt来批量安装)

import time
from math import floor

import cv2 as cv
import numpy as np
from numba import cuda

以下为JIT代码

@cuda.jit
def kernel(pic):
    x = cuda.threadIdx.x + cuda.blockIdx.x * cuda.blockDim.x
    y = cuda.threadIdx.y + cuda.blockIdx.y * cuda.blockDim.y
    for i in range(pic.shape[2]):
        pic[y, x][i] = (x + y) % 256 + i * 50

CUDA代码与CPU端的代码最大的不同为:GPU端的代码通过计算出线程号来抵消掉CPU端代码中的循环操作,达到高度并行化
通过Python自带的time包 来计算GPU端处理图片的时间,具体代码如下

start = time.time()
kernel[(floor((w + 32 - 1) / 32), floor((h + 32 - 1) / 32)), (32, 32)](tmp)
end = time.time()

上图涉及到和函数启动配置的问题,总的来讲是向上取整,遵循CUDA编程中的宁可多分配不可少分配的原则。

三、实验结果

运行结果

读者可以通过修改Kernel函数中的代码 来更改图片的样式

运行时间
读取并修改800080003的图片并修改,使用了0.304s,而是用CPU端进进行计算将是沉重的代价。从此可以看出通过CUDA来并行化代码所带来的巨大增益。CUDA的SIMD形式得到了充分体现

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值