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

Embedded 将FFT计算卸载到嵌入式GPU是否值得?,embedded,fft,gpu,gpgpu,Embedded,Fft,Gpu,Gpgpu,我们正在考虑从专用数字信号处理芯片移植一个应用程序,以便在通用x86硬件上运行。该应用程序进行了大量的傅立叶变换,从简单的研究来看,FFT似乎非常适合在GPU而不是CPU上进行计算。例如,此页面中的一些基准测试具有Core 2 Quad和GF 8800 GTX,使用GPU时,计算时间减少了10倍: 然而,在我们的产品中,尺寸限制将我们限制在较小的外形因素上,如PC104或Mini-ITX,从而限制了嵌入式GPU 将计算负载转移到GPU上是只值得在适当的PCIe总线上使用大量图形卡做的事情,还是

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

然而,在我们的产品中,尺寸限制将我们限制在较小的外形因素上,如PC104或Mini-ITX,从而限制了嵌入式GPU


将计算负载转移到GPU上是只值得在适当的PCIe总线上使用大量图形卡做的事情,还是嵌入式GPU可以提供性能改进?

8800大约有100个内核,运行速度约为半GHz。我不认为当前任何一款用于小型外形的嵌入式GPU都有这么多的着色器/计算内核。

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


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

一个问题可能是获取在GPU上加载和执行代码以及与CPU通信和交换数据所需的技术信息。Nvidia提供专门为此目的调用的API。所以,选择一块带有支持CUDA的Nvidia GPU的主板,你就可以用很少的成本进行实验和基准测试,甚至可以在普通的台式PC上进行原型测试


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

在x86硬件和GPU上开发了FFT例程(在CUDA之前),我从自己的结果中发现,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加速比 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将轻而易举地击败CPU

如果您想要快速FFT实现,我建议您使用FFTW,如果您想要更快(商业)实现,我建议您使用英特尔数学库。对于FFTW,使用FFTW_测量标志执行计划将测量和测试特定硬件的最快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。) 开发者指南(网址:

[1] 阿里安·马加泽、埃厄特派团、博尔多洛伊·佩特罗、埃利斯·彭。一般的 低功耗嵌入式GPU上的用途计算:有吗
长大成人?

我认为这些董事会不再那么有限了;不是@se 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