2011-11-16 98 views
7

我们正在考虑将专用数字信号处理芯片的应用程序移植到通用x86硬件上。该应用程序进行了大量的傅立叶变换,并且从简短的研究来看,FFT似乎非常适合在GPU上而不是在CPU上进行计算。例如,这个页面有一个Core 2四核和GF 8800 GTX一些基准使用GPU时,显示在计算时间降低10倍:值得将FFT计算卸载到嵌入式GPU吗?

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

然而,在我们的产品,尺寸的限制限制我们使用PC104或Mini-ITX等小型设备,从而限制嵌入式GPU。

是否正在将计算任务转移到GPU上,这些工作只有在适当的PCIe总线上使用丰富的图形卡才能实现,或者即使嵌入式GPU提供了性能改进?

+0

我不认为这些板子已经如此有限了;不是[如果他们使用Sandybridge i7,例如](http://www.silentpcreview.com/zotac-h67itx) – sehe

+0

@sehe我知道Mini-ITX(甚至PC104)支持的模型支持最近的CPU ,我的问题是他们的* G * PU是否值得打扰。 Mini-ITX通常提供一个PCIe插槽,但是我们的产品尺寸限制了处理模块的大小为Mini-ITX尺寸,并且不允许我们在主板上添加额外的显卡。 –

+0

你的FFT有多大?您的算法是否允许您在“批处理模式”下执行这些操作,并且同时计算大量(大小相同)? –

回答

2

8800拥有大约半个GHz的100个内核。我认为目前嵌入式GPU的小尺寸任何地方都有接近任意数量的着色器/计算内核。

5

您需要比较GPU内存和GPU内存之间的数据移动成本与使用GPU的速度优势之间的成本。虽然有可能在某种程度上重叠I/O和计算,但如果I/O带宽要求高于计算带宽,您仍然可能会受到影响。如果您有任何额外的计算可以在FFT数据中执行,而它们驻留在GPU内存中,那么这可以帮助减轻I/O成本。

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

1

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

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

6

在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适合您的具体要求。

+0

虽然答案很好,但感觉过时了。你有没有对新一代移动设备进行基准测试,其中的内存是与gpu共享的FFT? (编辑:当我写手机时,我不是指手机或平板电脑,而是新的iot,嵌入式等设备) – emrahgunduz

+1

是的,它是在10年前我做了这项工作。今天的GPus有更快的带宽从主内存传输到GPU内存,但同样,CPU和缓存也要快得多。我没有对它进行基准测试,但我想今天会出现类似的问题:较小的数据集在SIMD优化的C++中计算速度更快,在GPu上的数据集速度更快。他究竟在哪里?这是测试的问题! –

1

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

与台式机上看到的高端GPU相比,它们通常具有非常少的着色器核心,较少的核心寄存器和较低的内存带宽。然而,像嵌入式GPU上的应用那样运行FFT可以提供比板载多核CPU更好的性能[1]。嵌入式GPU的主要优势在于它们与CPU共享一个共同内存,从而避免了从主机到设备的内存复制过程。几乎所有像ARM这样的Mali嵌入式GPU,Qualcomm等公司的adreno都支持OpenCL,因此在嵌入式GPU上使用OpenCL库进行FFT可以提供更好的性能(来自AMD的clFFT是众所周知的并且是开源的)。调优的嵌入式GPU架构OpenCL的代码可以做的更好。(请在http://infocenter.arm.com的ARM Mali-T600系列GPU的OpenCL 开发者指南)

[1]阿里安Maghazeh,Unmesh,Bordoloi彼得鲁杜米特,ELES鹏。通用 目的计算低功耗嵌入式GPU:有它 来吧?