【发布时间】:2012-11-13 15:13:37
【问题描述】:
我一直在使用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 的卷积并抽象出实现的代码。而且,确实,我确实发现了一些东西:
- This github repo 有一个名为 cufft_sample.cu 的文件。我认为代码看起来很有希望,但我发现 an other file in the repo 包含 cmets 说卷积实现产生了不正确的结果:
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 的图像卷积的预构建代码方面还有什么其他内容?
【问题讨论】:
标签: image-processing cuda fft convolution