numba.cuda OpenCV 图像处理

文章目录

  • 一、 什么是numba
  • 二、代码实现
  • 三、实验结果

一、 什么是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编程中的宁可多分配不可少分配的原则。

三、实验结果

numba.cuda OpenCV 图像处理_第1张图片

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

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

你可能感兴趣的:(CUDA技巧,opencv,图像处理,python)