2011-05-13 58 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