gpt4 book ai didi

python - 如何使用 GPU 实现更快的 convolve2d

转载 作者:行者123 更新时间:2023-12-04 04:17:06 30 4
gpt4 key购买 nike

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

Time for signal.convolve2d: 1.6639747619628906
Time for cusignal.convolve2d: 0.6955723762512207
Time for cv2.filter2D: 0.18787837028503418

但是,似乎 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)))

最佳答案

  • 在您对 GPU 的时序分析中,您正在计算复制时间 asc到 GPU,执行 convolve2d ,并将答案传回。从总体上看,与 GPU 之间的传输非常缓慢。如果您想真正比较计算配置文件 convolve2d .
  • 目前cuSignal.convolve2d是用Numba写的。我们正在将其移植到使用 CuPy 原始内核的过程中,并且会有改进。我在 convolve2d 上没有预计到达时间.
  • 看起来可能有一个 OpenCV CUDA 版本 https://github.com/opencv/opencv_contrib/blob/master/modules/cudafilters/src/cuda/filter2d.cu
  • 你试过了吗scipy.ndimage.filters.convolve - http://blog.rtwilson.com/convolution-in-python-which-function-to-use/
  • 另外,请查看 CuPy 的 convolve - https://github.com/cupy/cupy/blob/master/cupyx/scipy/ndimage/filters.py

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

    关于python - 如何使用 GPU 实现更快的 convolve2d,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60523980/

    30 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com