2014-03-31 36 views
0

看起來我的應用程序開始是(i)FFT有界的,它爲平均尺寸約500x200(寬度和高度總是均勻)的矩形做了很多二維相關。場景與往常一樣 - 執行兩次FFT(每場一次),乘以複數場,然後乘以一次iFFT。因此,CPU(Intel Q6600,帶有JTransforms libraly)根據profiler在GPU(GTX670,cuFFT庫)上大約耗時70%的FFT轉換 - 大約50%(所以,性能有所提高CUDA,但不是我想要的)。我意識到,可能是GPU沒有完全飽和(帶寬有限),但從其他情況 - 批量計算會顯着增加應用程序的複雜性。加速二維相關

問題:

  1. 我可以做進一步減少花費在FFT至少數 倍的時間?
  2. 我應該試試FFTW庫(在這一刻,我不確定它會比JTransforms獲得顯着的收益)?
  3. 是否有任何專用硬件可以插入PC 進行FFT轉換?
+1

此演示文稿的幻燈片19 [快速傅立葉變換(FFT) 和圖形處理單元(GPU)](http://www.umiacs.umd.edu/~ramani/cmsc828e_gpusci/DeSpain_FFT_Presentation.pdf)可能是對你有用。我要說的是,所涉及的FFT不像FFTW那樣需要大得多的性能。此外,在[在GPU上運行FFTW vs使用CUFFT]的答案(http://stackoverflow.com/questions/16780258/running-fftw-on-gpu-vs-using-cufft),我會說,對於小尺寸調用來自不同主機線程的cuFFT可能是批處理案例的替代方案。 – JackOLantern

+0

傑克,謝謝你的回答。實際上,有4個並行線程(每個CPU核心有一個線程),每個線程都調用cuFFT進行轉換 - 因此,看起來我已經在使用批量處理的替代方法。 – Arsen

回答

3

我在回答你的第一個問題:我可以進一步減少cuFFT花費的時間?

引述CUFFT庫用戶指南

  1. 限制大小沿着所有維度是可表示爲2^a*3^b*5^c*7^d。 CUFFT庫具有高度優化的內核,用於尺寸具有這些主要因素的變換。
  2. 限制沿每個維度的尺寸以使用較少的不同主要因素。例如,如果後者略小,則尺寸爲3^n的變換通常將快於尺寸爲2^i*3^j,甚至是 中的一個。
  3. 將尺寸爲x尺寸的冪的二分解項限制爲單精度變換的256或雙精度變換的64的倍數。這進一步幫助記憶合併。
  4. 限制的單精度的x維變換是嚴格兩個要麼222048之間8192爲費米級,開普勒級,和更近的GPU或之間,用於早期體系結構的功率。這些轉換被實現爲專用的手動編碼內核,將所有中間結果保存在共享內存中。
  5. 使用原生兼容模式進行原地複雜到實際或實到復變換。該方案減少了填充字節的寫/讀操作,從而有助於數據的合併。

從CUFFT庫的版本3.1開始,實數到複數輸出數據數組和複數到實數輸入數據數組的陣列的共軛對稱性被利用,當兩個冪的因式分解項x尺寸至少是4的倍數。大的一維尺寸(兩個冪乘兩個大於65,536),二維和三維轉換在實現複雜性或複雜性時優化性能方面最爲有利,真正的變換。

你可以做其他事情(引自羅伯特Crovella的回答running FFTW on GPU vs using CUFFT):

  1. CUFFT程序可以通過多個主機線程調用,所以它可以多次調用到CUFFT多獨立變換。如果單個轉換足夠大以利用機器,則不太可能會看到更多的加速。

  2. cufft還支持分批計劃,這是「一次」執行多個轉換的另一種方法。

請注意:

  1. CUFFT可以相比於一個優化的順序的或多核FFT如果變換的尺寸是不足夠大來是不方便;
  2. 與英特爾MKL從CUDA Toolkit 4.0 Performance Report相比,您可以大致瞭解cuFFT的性能。