如何使用 GPU 实现更快的 convolve2d

YFG*_*YFG 5 python opencv scipy cupy cusignal

我最近正在学习 PyCuda,并计划替换相机系统的一些代码以加快图像处理速度。该部分最初使用cv2.filter2D。我的目的是用GPU加速处理。

Time for signal.convolve2d: 1.6639747619628906
Time for cusignal.convolve2d: 0.6955723762512207
Time for cv2.filter2D: 0.18787837028503418
Run Code Online (Sandbox Code Playgroud)

然而,cv2.filter2D 似乎仍然是三者中最快的。如果输入是一长串图像,自定义 PyCuda 内核是否会超过 cv2.filter2D?

import time
import cv2
from cusignal.test.utils import array_equal
import cusignal
import cupy as cp
import numpy as np
from scipy import signal
from scipy import misc
ascent = misc.ascent()
ascent = np.array(ascent, dtype='int16')

ascentList = [ascent]*100

filterSize = 3
scharr = np.ones((filterSize, filterSize), dtype="float") * (1.0 / (filterSize*filterSize))

startTime = time.time()
for asc in ascentList:
    grad = signal.convolve2d(asc, scharr, boundary='symm', mode='same')
endTime = time.time()
print("Time for signal.convolve2d: "+str(endTime - startTime))

startTime = time.time()
for asc in ascentList:
    gpu_convolve2d = cp.asnumpy(cusignal.convolve2d(cp.asarray(asc), scharr, boundary='symm', mode='same'))
endTime = time.time()
print("Time for cusignal.convolve2d: "+str(endTime - startTime))
print("If signal equal to cusignal: "+ str(array_equal(grad, gpu_convolve2d)))

startTime = time.time()
for asc in ascentList:
    opencvOutput = cv2.filter2D(asc, -1, scharr)
endTime = time.time()
print("Time for cv2.filter2D: "+str(endTime - startTime))
print("If cv2 equal to cusignal: "+ str(array_equal(opencvOutput, gpu_convolve2d)))
Run Code Online (Sandbox Code Playgroud)

小智 2

  1. 在 GPU 的时序分析中,您要计算复制asc到 GPU、执行convolve2d并将答案传回的时间。在这种情况下,与 GPU 之间的传输速度非常慢。如果您想要计算的真实比较,只需配置文件convolve2d

  2. 目前它cuSignal.convolve2d是用 Numba 编写的。我们正在将其移植为使用 CuPy Raw Kernels,并且将会有所改进。我没有 的预计到达时间convolve2d

  3. 看起来可能有一个 OpenCV CUDA 版本https://github.com/opencv/opencv_contrib/blob/master/modules/cudafilters/src/cuda/filter2d.cu

  4. 你有没有尝试过scipy.ndimage.filters.convolve- http://blog.rtwilson.com/convolution-in-python-which-function-to-use/

  5. 另外,查看 CuPy 的convolve- https://github.com/cupy/cupy/blob/master/cupyx/scipy/ndimage/filters.py

现在回答你原来的问题。当尝试确定 GPU 是否比 CPU 更快时,您需要确保有足够的工作来保持 GPU 忙碌。众所周知,在某些情况下,数据量较小,CPU 的执行速度会更快。