在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适合您的具体要求。
我不认为这些板子已经如此有限了;不是[如果他们使用Sandybridge i7,例如](http://www.silentpcreview.com/zotac-h67itx) – sehe
@sehe我知道Mini-ITX(甚至PC104)支持的模型支持最近的CPU ,我的问题是他们的* G * PU是否值得打扰。 Mini-ITX通常提供一个PCIe插槽,但是我们的产品尺寸限制了处理模块的大小为Mini-ITX尺寸,并且不允许我们在主板上添加额外的显卡。 –
你的FFT有多大?您的算法是否允许您在“批处理模式”下执行这些操作,并且同时计算大量(大小相同)? –