1

我一直在使用Nvidia Performance Primitives (NPP)的图像卷积函数。但是,相对于图像大小,我的内核相当大,而且我听说 NPP 的卷积是直接卷积而不是基于 FFT 的卷积。(我不认为 N​​PP 源代码可用,所以我不确定它是如何实现的。)

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

您可能会说“嘿,只需将您的图像放入 cuFFT 中,看看它有多快!” 如果我使用的是 Matlab,那你是对的——这是Matlab 中的单行调用

%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 的例程是计划在未来发布的

  • 在 Matlab File Exchange 上找到了一些执行 2D 卷积的代码。重要部分在 C/CUDA 中实现,但有一个 Matlab 包装器。我正在努力剥离 Matlab 包装器以支持纯 C/C++/CUDA,但我仍然很好奇是否有任何更优雅和/或经过验证的解决方案。

这三个选项中有什么建议吗?

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

4

1 回答 1

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. 傅里叶变换
  2. 卷积和过滤

免责声明:

  • ArrayFire 不是开源的。但是它有一个免费使用的版本。
  • 我在 AccelerEyes 工作并开发 arrayfire。我链接到我们的产品是因为 @solvingPuzzles 专门要求提供一个类似于 arrayfire 正在做的库。
于 2012-11-26T07:32:41.967 回答