2011-11-16 19 views
7

我們正在考慮將專用數字信號處理芯片的應用程序移植到通用x86硬件上。該應用程序進行了大量的傅立葉變換,並且從簡短的研究來看,FFT似乎非常適合在GPU上而不是在CPU上進行計算。例如,這個頁面有一個Core 2四核和GF 8800 GTX一些基準使用GPU時,顯示在計算時間降低10倍:值得將FFT計算卸載到嵌入式GPU嗎?

http://www.cv.nrao.edu/~pdemores/gpu/

然而,在我們的產品,尺寸的限制限制我們使用PC104或Mini-ITX等小型設備,從而限制嵌入式GPU。

是否正在將計算任務轉移到GPU上,這些工作只有在適當的PCIe總線上使用豐富的圖形卡才能實現,或者即使嵌入式GPU提供了性能改進?

+0

我不認爲這些板子已經如此有限了;不是[如果他們使用Sandybridge i7,例如](http://www.silentpcreview.com/zotac-h67itx) – sehe

+0

@sehe我知道Mini-ITX(甚至PC104)支持的模型支持最近的CPU ,我的問題是他們的* G * PU是否值得打擾。 Mini-ITX通常提供一個PCIe插槽,但是我們的產品尺寸限制了處理模塊的大小爲Mini-ITX尺寸,並且不允許我們在主板上添加額外的顯卡。 –

+0

你的FFT有多大?您的算法是否允許您在「批處理模式」下執行這些操作,並且同時計算大量(大小相同)? –

回答

2

8800擁有大約半個GHz的100個內核。我認爲目前嵌入式GPU的小尺寸任何地方都有接近任意數量的着色器/計算內核。

5

您需要比較GPU內存和GPU內存之間的數據移動成本與使用GPU的速度優勢之間的成本。雖然有可能在某種程度上重疊I/O和計算,但如果I/O帶寬要求高於計算帶寬,您仍然可能會受到影響。如果您有任何額外的計算可以在FFT數據中執行,而它們駐留在GPU內存中,那麼這可以幫助減輕I/O成本。

注意到基於GPU的FFT通常僅爲單精度數據提供良好的性能也很重要。此外,您需要與基於CPU的最佳FFT進行比較,例如爲單精度和使用SSE而構建的FFTW。

1

一個問題可能是獲取在GPU上加載和執行代碼以及與CPU通信和交換數據所需的技術信息。 Nvidia專門爲此提供了一個名爲CUDA的API。因此,選擇支持CUDA的Nvidia GPU的主板,您可以以極低的成本進行實驗和基準測試,甚至可以在普通桌面PC上進行原型設計。

對於小型硬件,this discussion可能是相關的。

6

在x86硬件和GPU上開發FFT例程(在CUDA之前,7800 GTX Hardware)我從我自己的結果中發現,使用更小尺寸的FFT(低於2^13),CPU更快。超過這些尺寸的GPU速度更快。例如,2^16大小的FFT在GPU上計算的速度比CPU上的等效轉換快2-4倍。看下面的時間表(所有時間都是幾秒鐘的時間,比較一下3GHz Pentium 4和7800GTX,這項工作早在2005年就已經完成了,如前所述,非CUDA,較新的庫可能會有更大的改進)

 
N  FFTw (s) GPUFFT (s) GPUFFT MFLOPS GPUFFT Speedup 
8  0   0.00006  3.352705  0.006881 
16  0.000001 0.000065 7.882117  0.010217 
32  0.000001 0.000075 17.10887  0.014695 
64  0.000002 0.000085 36.080118  0.026744 
128  0.000004 0.000093 76.724324  0.040122 
256  0.000007 0.000107 153.739856  0.066754 
512  0.000015 0.000115 320.200892  0.134614 
1024 0.000034 0.000125 657.735381  0.270512 
2048 0.000076 0.000156 1155.151507  0.484331 
4096 0.000173 0.000215 1834.212989  0.804558 
8192 0.000483 0.00032  2664.042421  1.510011 
16384 0.001363 0.000605 3035.4551  2.255411 
32768 0.003168 0.00114  3450.455808  2.780041 
65536 0.008694 0.002464 3404.628083  3.528726 
131072 0.015363 0.005027 3545.850483  3.05604 
262144 0.033223 0.012513 3016.885246  2.655183 
524288 0.072918 0.025879 3079.443664  2.817667 
1048576 0.173043 0.076537 2192.056517  2.260904 
2097152 0.331553 0.157427 2238.01491  2.106081 
4194304 0.801544 0.430518 1715.573229  1.861814 

正如其他海報所建議的那樣,將數據傳輸到GPU或從GPU傳輸數據是您所需要的。較小的FFT可以在CPU上執行,一些實現/大小完全在緩存中。這使得CPU成爲小FFT的最佳選擇(低於1024點)。另一方面,如果您需要在GPU上執行大量的數據處理工作,並且GPU的移動量最小,那麼GPU將會勝過CPU。

如果您想要快速的FFT實現,我會建議使用FFTW,或者如果您想要更快的(商業)實現,則建議使用英特爾數學庫。對於FFTW,使用FFTW_Measure標誌執行計劃將測量並測試特定硬件的最快可能的FFT程序。我在this question中詳細介紹了這一點。

對於GPU實現,您無法比NVidia CUDA提供的更好。自從我在7800GTX上進行實驗以來,GPU的性能有了顯着提高,所以我建議讓他們的SDK適合您的具體要求。

+0

雖然答案很好,但感覺過時了。你有沒有對新一代移動設備進行基準測試,其中的內存是與gpu共享的FFT? (編輯:當我寫手機時,我不是指手機或平板電腦,而是新的iot,嵌入式等設備) – emrahgunduz

+1

是的,它是在10年前我做了這項工作。今天的GPus有更快的帶寬從主內存傳輸到GPU內存,但同樣,CPU和緩存也要快得多。我沒有對它進行基準測試,但我想今天會出現類似的問題:較小的數據集在SIMD優化的C++中計算速度更快,在GPu上的數據集速度更快。他究竟在哪裏?這是測試的問題! –

1

我想特別針對嵌入式GPU添加您的問題。

與臺式機上看到的高端GPU相比,它們通常具有非常少的着色器核心,較少的核心寄存器和較低的內存帶寬。然而,像嵌入式GPU上的應用那樣運行FFT可以提供比板載多核CPU更好的性能[1]。嵌入式GPU的主要優勢在於它們與CPU共享一個共同內存,從而避免了從主機到設備的內存複製過程。幾乎所有像ARM這樣的Mali嵌入式GPU,Qualcomm等公司的adreno都支持OpenCL,因此在嵌入式GPU上使用OpenCL庫進行FFT可以提供更好的性能(來自AMD的clFFT是衆所周知的並且是開源的)。調優的嵌入式GPU架構OpenCL的代碼可以做的更好。(請在http://infocenter.arm.com的ARM Mali-T600系列GPU的OpenCL 開發者指南)

[1]阿里安Maghazeh,Unmesh,Bordoloi彼得魯杜米特,ELES鵬。通用 目的計算低功耗嵌入式GPU:有它 來吧?