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.
我想补充一下您具体关于嵌入式 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 上的通用计算:成熟了吗?
您需要比较从GPU内存移动数据的成本与使用GPU的任何速度优势.尽管可能会稍微重叠I/O和计算,但如果I/O带宽要求大于计算带宽,您仍可能会受到影响.如果您在FFT数据驻留在GPU内存中时可以对FFT数据执行任何其他计算,则可以帮助降低I/O成本.
值得注意的是,基于GPU的FFT通常只能为单精度数据提供良好的性能.此外,您需要与基于CPU的最佳FFT进行比较,例如,针对单精度构建的FFTW和使用SSE.