2011-05-13 71 views
3

我已经成功地编写了一些CUDA FFT代码,用于对图像进行2D卷积以及其他一些计算。如何管理cuda中的大型二维FFT

我该如何去弄清楚我能运行的最大的FFT是什么?看起来,2D R2C卷积计划需要2倍的图像尺寸,而另外2倍的图像尺寸则适用于C2R。这似乎是一个很大的开销!

另外,它似乎是大多数的基准测试,这些是相对较小的FFTs ..这是什么?对于大型图像来说,我将很快耗尽内存。这通常如何处理?你可以在图像的一个图块上执行FFT卷积并合并这些结果,并且期望它与在整个图像上运行二维FFT相同吗?

谢谢回答这些问题

回答

5

CUFFT根据图像大小计划不同的算法。如果你不能适应共享内存,并且不是2的幂,那么CUFFT计划进行不适当的转换,而尺寸合适的较小图像更适合软件。

如果您对整张图片进行FFT处理,并且需要查看您的GPU可以处理什么,那么我的最佳答案就是猜测和检查不同的图片尺寸,因为CUFFT计划很复杂。

参见文档:http://developer.download.nvidia.com/compute/cuda/1_1/CUFFT_Library_1.1.pdf

我同意马克,说平铺图像是去卷积的方式。由于卷积相当于只计算许多独立的积分,因此您可以简单地将域分解为其组成部分,独立计算这些部分并将它们拼接在一起。 FFT卷积技巧简单地降低了您需要计算的积分的复杂性。

我希望你的GPU代码在所有情况下都应该胜过matlab,除非你做了一些奇怪的事情。

1

这通常不是实际的整个图像上运行FFT。它不仅需要大量内存,而且图像的宽度和高度必须是2的幂,这对您的输入提出了不合理的限制。

将图像切割成瓦片是非常合理的。瓦片的大小将决定您能够达到的频率分辨率。您也可能想要重叠拼贴。

+0

2问题的力量是只有当它是100%最佳运行正确?我一直在运行的图像大小是可变的,似乎比运行在16核心盒子上的相同算法的matlab版本运行得更快 – Derek 2011-05-13 16:57:14

+0

@Derek,显然有FFT算法不会强加这种限制。自从我看了这些东西以来,这已经很长时间了。 http://en.wikipedia.org/wiki/Fft – 2011-05-13 17:45:22

+0

耶 - 我想我的主要问题与GPU中不适合的大型FFT有关,以及如何解决问题 – Derek 2011-05-13 19:08:10