如何在cuda中处理大规模的二维FFT

3

我已经成功编写了一些CUDA FFT代码,可以对图像进行2D卷积以及其他计算。

如何确定我可以运行的最大FFT大小?似乎2D R2C卷积的计划需要2倍的图像大小,并且另外2倍的图像大小用于C2R。这看起来是很大的开销!

此外,似乎大多数基准测试和类似的内容都是针对相对较小的FFT..为什么会这样?似乎对于大图像,我很快就会耗尽内存。这通常如何处理?可以在图像块上执行FFT卷积并组合这些结果,期望它与在整个图像上运行2D FFT时相同吗?

谢谢回答这些问题。

2个回答

5
CUFFT根据图像大小计划不同的算法。如果您无法适应共享内存并且不是2的幂,则CUFFT会计划一个非原位转换,而具有正确大小的较小图像将更易于软件处理。
如果您打算对整个图像进行FFT并需要查看GPU可以处理的内容,我的最佳答案是使用不同的图像大小进行猜测和检查,因为CUFFT规划很复杂。
请参阅文档:http://developer.download.nvidia.com/compute/cuda/1_1/CUFFT_Library_1.1.pdf 我同意Mark的观点,并说分割图像是卷积的正确方法。由于卷积只是计算许多独立积分,因此您可以将域分解为其组成部分,独立计算它们,然后将它们拼接在一起。FFT卷积技巧只是减少了您需要计算的积分的复杂性。
我预计您的GPU代码在所有情况下都应该比Matlab快得多,除非您做了一些奇怪的事情。

1

通常情况下,在整个图像上运行FFT并不实用。这不仅需要大量的内存,而且图像的宽度和高度必须是2的幂,这对您的输入施加了不合理的限制。

将图像切成瓦片是完全合理的。瓦片的大小将确定您能够实现的频率分辨率。您可能还希望重叠瓦片。


2的幂问题只有在100%最优运行时才存在,对吧?我一直在处理可变大小的图像,似乎比在16核心计算机上运行的Matlab版本的同一算法运行得更快。 - Derek
@Derek,显然有一些FFT算法不会强制执行该限制。我已经很久没有看过这方面的东西了。http://en.wikipedia.org/wiki/Fft - Mark Ransom
嗯,我想我的主要问题与无法适应GPU的大型FFT有关,以及如何处理分解问题。 - Derek

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接