【问题标题】:GPU library that implements Image Convolution using cuFFT?使用 cuFFT 实现图像卷积的 GPU 库?
【发布时间】: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 的卷积并抽象出实现的代码。而且,确实,我确实发现了一些东西:

    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


    【解决方案1】:

    你可以试试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

    免责声明:

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

    【讨论】:

    • 谢谢!我刚刚在您的网站上查找了 Arrayfire 的 convolution benchmarking results。我链接的页面有 1D 和 2D 可分离卷积基准。你知道 Arrayfire 2D 不可分离卷积的任何基准测试结果吗?
    • 另外,在 Arrayfire fft2ifft2 中有可选的零填充参数是纯粹的天才。我希望来自 Nvidia 的香草 cuFFT 代码也有这个!
    • @solvingPuzzles 我无法访问 2D 卷积的基准。但是,如果您可以指定 Image 和 Filter 的大小,我可以做一个快速测试,让您知道它有多快。
    • 让我们尝试几个极端:9000x9000 图像,3x3 滤镜。 9000x9000 图像,5x5 滤镜。 9000x9000 图像,200x200 滤镜。谢谢你这样做!如果结果看起来不错,我将安装 Arrayfire 并在明天使用它。
    • 24、64 和 512 毫秒。其余的你可以给我发电子邮件(你可以在我的个人资料中找到),以便我们更详细地讨论它。
    猜你喜欢
    • 2013-11-27
    • 2013-10-28
    • 1970-01-01
    • 2018-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-15
    相关资源
    最近更新 更多