使用cuFFT实现图像卷积的GPU库?

时间:2012-11-26 06:41:06

标签: image-processing cuda fft convolution

我一直在使用Nvidia Performance Primitives (NPP)的图片卷积功能。然而,我的内核在图像大小方面相当大,我听说有传言说NPP的卷积是直接卷积而不是基于FFT的卷积。 (我认为NPP源代码不可用,所以我不确定它是如何实现的。)

我想看看基于cuFFT的卷积函数在我正在处理的图像处理应用程序中运行的速度有多快。

您可能会说“嘿,只需将您的图片放入cuFFT,看看它有多快!”如果我使用Matlab,你就是对的 - 它在Matlab中是one-line call

%assuming the images are padded
convolved = ifft2(fft2(image).* fft2(filter));

然而,需要很多样板才能让cuFFT进行图像卷积。所以,我正在寻找能够进行基于cuFFT的卷积并抽象实现的代码。事实上,我确实找到了一些东西:

    WARNING: GpuFFTConvOp currently don't return the good answer
    TODO: extend to cover more case, as in many case we will crash!
  • 我觉得Kitware VTK/ITK代码库提供了基于cuFFT的图像卷积。唉,事实证明(充其量)做基于cuFFT的例程是planned for future releases

  • 我发现some code on the Matlab File Exchange进行2D卷积。重要的部分是在C / CUDA中实现的,但是有一个Matlab包装器。我正在努力剥离Matlab包装器,转而使用纯C / C ++ / CUDA,但我仍然很好奇是否有更优雅和/或经过验证的解决方案。

这三个选项中的任何建议都是什么?

基于cuFFT的图像卷积的预构建代码还有什么其他内容?

1 个答案:

答案 0 :(得分:3)

您可以尝试arrayfire

在ArrayFire中,您可以执行以下操作。

array image(rows, columns, h_image);
array filter(frows, fcols, h_filter);
array res = convolve(image, filter); 

根据过滤器的大小,conolve命令使用cufft或更快的手动调整内核。如果您更喜欢使用fft2,则可以执行以下操作

array res = ifft2(fft2(image) * fft2(filter));

但我强烈建议您使用convolve,因为它已经过优化,可以获得最佳性能。

更有用的链接:

  1. Fourier Transforms
  2. Convolution and filtering
  3. 声明:

    • ArrayFire不是开源的。但是它有一个免费使用的版本。
    • 我在AccelerEyes工作并开发arrayfire。我正在链接到我们的产品,因为@solvePuzzles专门要求一个类似于arrayfire正在做的库。