将FFT计算卸载到嵌入式GPU是否值得?

时间:2011-11-16 21:02:53

标签: embedded fft gpu gpgpu

我们正在考虑从专用数字信号处理芯片移植应用程序以在通用x86硬件上运行。该应用程序进行了大量的傅立叶变换,从简短的研究来看,FFT似乎非常适合在GPU而不是CPU上进行计算。例如,这个页面有一些基准测试,其中Core 2 Quad和GF 8800 GTX在使用GPU时计算时间减少了10倍:

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

然而,在我们的产品中,尺寸限制限制了我们使用PC104或Mini-ITX等小尺寸因素,因此限制了嵌入式GPU。

将计算卸载到GPU上只需要在适当的PCIe总线上使用多肉图形卡,或者甚至嵌入式GPU可以提高性能吗?

5 个答案:

答案 0 :(得分:11)

在x86硬件和GPU上开发了FFT例程(在CUDA之前,7800 GTX Hardware)我从我自己的结果中发现,使用较小的FFT(低于2 ^ 13),CPU速度更快。超过这些尺寸,GPU更快。例如,2 ^ 16大小的FFT在GPU上的计算速度比CPU上的等效变换快2-4倍。请参阅下面的表格(所有时间都是以秒为单位,比较3GHz奔腾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传输数据是您的最佳选择。可以在CPU上执行较小的FFT,一些实现/大小完全在缓存中。这使得CPU成为小FFT(低于~1024点)的最佳选择。另一方面,如果你需要对数据执行大批量的工作,而只需要进行最小的GPU移动,那么GPU就会击败CPU。

如果您想要快速FFT实现,我建议使用FFTW,如果您想要更快(商业)实现,我建议使用英特尔数学库。对于FFTW,使用FFTW_Measure标志执行计划将测量并测试特定硬件的最快FFT程序。我在this question详细介绍了这一点。

对于GPU实现,您无法比NVidia CUDA提供的更好。自从我在7800GTX上进行实验以来,GPU的性能显着提高,因此我建议根据您的具体要求提供SDK。

答案 1 :(得分:5)

您需要比较从GPU内存移动数据的成本与使用GPU的任何速度优势。尽管可能会稍微重叠I / O和计算,但如果I / O带宽要求大于计算带宽,您仍可能会受到影响。如果您在FFT数据驻留在GPU内存中时可以对FFT数据执行任何其他计算,那么这有助于降低I / O成本。

值得注意的是,基于GPU的FFT通常只能为单精度数据提供良好的性能。此外,您需要与最佳的基于CPU的FFT进行比较,例如FFTW针对单精度构建并使用SSE。

答案 2 :(得分:3)

我想特别针对嵌入式GPU添加您的问题。

与台式机上的高端GPU相比,它们通常具有非常少的着色器核心,较少的核心寄存器和较低的内存带宽。但是,与板载多核CPU相比,在嵌入式GPU上运行类似FFT的应用程序可以提供更好的性能[1]。嵌入式GPU的主要优点是它们与CPU共享一个公共存储器,从而避免了从主机到设备的存储器复制过程。

几乎所有嵌入式GPU,如来自ARM的Mali,来自Qualcomm的adreno等都支持OpenCL,因此在嵌入式GPU上使用OpenCL库进行FFT可以提供更好的性能(来自AMD的clFFT是众所周知的和开源)。调整嵌入式GPU架构的OpenCL代码可以使其更好。(请参考ARM Mali-T600系列GPU OpenCL 开发人员指南http://infocenter.arm.com

[1] Arian Maghazeh,Unmesh,Bordoloi Petru,Eles Peng。一般 低功耗嵌入式GPU的目的计算:有它 年龄来了吗?

答案 3 :(得分:2)

8800大约有100个内核运行在大约半GHz。我不认为任何针对小型封装的当前嵌入式GPU都具有接近任意数量的着色器/计算核心。

答案 4 :(得分:1)

一个问题可能是获取在GPU上加载和执行代码以及与CPU通信和交换数据所需的技术信息。 Nvidia专门为此目的提供了一个名为CUDA的API。因此,选择一款支持CUDA的Nvidia GPU主板,您可以以极低的成本进行实验和基准测试,甚至可以在普通台式PC上进行原型设计。

对于小型硬件,this discussion可能是相关的。