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

Ian*_*ton 10 embedded gpu gpgpu fft

我们正在考虑从专用数字信号处理芯片移植应用程序以在通用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可以提高性能吗?

Dr.*_*ABT 11

在x86硬件和GPU上开发了FFT例程(在CUDA之前,7800 GTX硬件),我从自己的结果中发现,使用较小的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程序.我在这个问题中详细介绍了这一点.

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

  • 是的,这是在十多年前我做了这项工作.今天的GPus具有更快的带宽,可以从主内存传输到GPU内存,但同样,CPU和缓存也要快得多.我没有对它进行基准测试,但我想象今天存在类似的问题:较小的数据集将在SIMD优化的C++中计算得更快,在GPu上的数据集更快.他到底在哪里?这是测试的问题! (3认同)

Kar*_*gde 6

我想补充一下您具体关于嵌入式 GPU 的问题。

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

几乎所有嵌入式 GPU(例如 ARM 的 Mali、高通的 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 上的通用计算:成熟了吗?


Pau*_*l R 5

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

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


hot*_*aw2 2

8800 有大约 100 个核心,运行频率约为 0.5 GHz。我认为目前任何小型嵌入式 GPU 都没有那么多的着色器/计算核心。