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

17
我们正在考虑将一款应用程序从专用数字信号处理芯片移植到通用的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也能提供性能改进?

我不认为这些主板还有那么多限制了;尤其是如果它们配备了Sandybridge i7处理器(例如:http://www.silentpcreview.com/zotac-h67itx)。 - sehe
@sehe 我知道Mini-ITX(甚至PC104)支持最近的CPU型号,我的问题是它们的内置GPU是否值得关注。 Mini-ITX通常提供PCIe插槽,但我们产品的尺寸限制了处理模块只能使用大约Mini-ITX大小的单板,无法允许我们添加一个从主板上突出的额外显卡。 - Ian Renton
你的FFT有多大?你的算法是否允许你以“批处理模式”进行计算,即同时计算许多相同大小的FFT? - Brooks Moses
我在音乐和弦识别中使用fftw3,它占用了Acer Nitro 4%的CPU。也许这篇斯坦福论文对你有兴趣:https://mc.stanford.edu/cgi-bin/images/7/75/SC08_FFT_on_GPUs.pdf - relascope
5个回答

18

我曾经在x86硬件和GPU上(在CUDA之前,7800 GTX Hardware)开发过FFT例程。从我的结果来看,当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是你需要承受的成本。较小的FFT可以在CPU上执行,某些实现/大小完全在缓存中。这使得CPU成为小FFT(1024点以下)的最佳选择。另一方面,如果您需要对具有最少移动到/从GPU的数据执行大批量工作,则GPU将轻松击败CPU。
我建议使用FFTW如果您想要快速的FFT实现,或者使用英特尔数学库如果您想要更快的(商业)实现。对于FFTW,使用FFTW_Measure标志执行计划将测量和测试适用于特定硬件的最快FFT例程。我在这个问题中详细介绍了这一点。
对于GPU实现,您无法获得比NVidia CUDA提供的更好的实现。自从我在7800GTX上进行实验以来,GPU的性能已经显着提高,因此我建议针对您的特定需求尝试他们的SDK。

1
虽然答案很好,但感觉有些过时了。你有没有测试过新一代移动设备,在其中内存与GPU共享用于FFT?(编辑:我在写“移动”时并不仅指手机或平板电脑,而是包括新的物联网、嵌入式等设备) - emrahgunduz
9
是的,我这项工作已经超过10年了。现在的GPU在从主存储器传输到GPU存储器方面具有更快的带宽,但是同样,CPU和缓存速度也提高了很多。我没有进行基准测试,但我想象今天仍然存在类似的问题:使用SIMD优化的C ++可以更快地计算较小的数据集,而GPU可以更快地计算较大的数据集。确切的界限在哪里?那得通过测试来确定! - Dr. Andrew Burnett-Thompson
你能否增加现代化的台式机CPU和GPU性能测试结果?因为这篇回答是我在互联网上找到的唯一有用的信息,但是在过去的9年里,GPU的性能已经有了巨大的提升,非常好奇事情的变化。 - WDUK
1
抱歉,我现在无法访问此代码,但我可以告诉你,我现在继续在www.scichart.com上进行GPU / CPU性能工作,并且我们仍然发现(尤其是现在),如果您可以将某些内容卸载到GPU,那就这么做,因为它确实非常强大。通过将某些关键算法移动到GPU,我们看到了高达100倍的性能提升。瓶颈仍然是将数据传输到/从GPU,但现代PCI / Express 3.0接近主存储器的带宽。这使得GPU在几乎任何领域都成为高性能计算的一个重要竞争者。 - Dr. Andrew Burnett-Thompson

8
你需要比较移动数据到和从GPU内存的成本与使用GPU所带来的任何速度优势。虽然可以在一定程度上重叠I/O和计算,但如果I/O带宽要求大于计算带宽,则仍可能遇到问题。如果您有任何其他计算可以在FFT数据驻留在GPU内存时执行,则可以帮助缓解I/O成本。
还要注意,基于GPU的FFT通常只对单精度数据提供良好的性能。此外,您需要与最佳可能的基于CPU的FFT进行比较,例如针对单精度并使用SSE构建的FFTW。

6
我希望就嵌入式GPU问题为您进行补充。
它们通常具有非常少的着色器核心,较少的核心寄存器和比桌面上高端GPU低的内存带宽。然而,在嵌入式GPU上运行类似FFT的应用程序可以比在机载多核CPU上获得更好的性能[1]。嵌入式GPU的主要优势在于,它们与CPU共享一个公共存储器,从而避免了从主机到设备的内存复制过程。
几乎所有像ARM的Mali,Qualcomm的Adreno等嵌入式GPU都支持OpenCL,因此在嵌入式GPU上使用OpenCL库可以提供更好的性能(来自AMD的clFFT是众所周知的并且开源的)。调整针对嵌入式GPU架构的OpenCL代码可以使其更好。(请参阅http://infocenter.arm.com的ARM Mali-T600系列GPU OpenCL开发人员指南)
[1] Arian Maghazeh,Unmesh, Bordoloi Petru, Eles Peng. 低功耗嵌入式GPU的通用计算:已经成熟吗?

2

8800拥有大约100个核心,运行速度约为半GHz。我认为目前小型嵌入式GPU中没有任何一个具有如此多的着色器/计算核心。


2

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

关于小型硬件,这个讨论可能是相关的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接