我一直在使用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的图像卷积的预构建代码还有什么其他内容?
答案 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
,因为它已经过优化,可以获得最佳性能。
更有用的链接:
声明: