我一直在使用Nvidia Performance Primitives (NPP)的图像卷积函数。但是,相对于图像大小,我的内核相当大,而且我听说 NPP 的卷积是直接卷积而不是基于 FFT 的卷积。(我不认为 NPP 源代码可用,所以我不确定它是如何实现的。)
我想看看基于cuFFT的卷积函数在我正在处理的图像处理应用程序中运行的速度有多快。
您可能会说“嘿,只需将您的图像放入 cuFFT 中,看看它有多快!” 如果我使用的是 Matlab,那你是对的——这是Matlab 中的单行调用:
%assuming the images are padded
convolved = ifft2(fft2(image).* fft2(filter));
但是,要让 cuFFT 进行图像卷积,需要大量的样板文件。因此,我正在寻找执行基于 cuFFT 的卷积并抽象出实现的代码。而且,确实,我确实发现了一些东西:
- 这个 github repo有一个名为cufft_sample.cu的文件。我认为代码看起来很有希望,但我在 repo 中发现了另一个文件,其中包含说卷积实现产生不正确结果的注释:
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 的图像卷积的预构建代码而言,还有什么其他内容?