【问题标题】:Is it worth offloading FFT computation to an embedded GPU?将 FFT 计算卸载到嵌入式 GPU 是否值得?
【发布时间】:2011-12-30 19:30:31
【问题描述】:

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

【问题讨论】:

  • 我认为这些板不再那么有限了;不是if they feature a Sandybridge i7, for instance
  • @sehe 我知道 Mini-ITX(甚至 PC104)支持有支持最新 CPU 的模型,我的问题是他们的板载 GPU 是否值得烦恼。 Mini-ITX 通常提供一个 PCIe 插槽,但我们产品的尺寸将处理模块限制在一块近似 Mini-ITX 大小的板上,并且不允许我们从主板上添加额外的显卡。
  • 您的 FFT 有多大?您的算法是否允许您在“批处理模式”下同时计算大量(大小相同)?

标签: embedded fft gpu gpgpu


【解决方案1】:

8800 有大约 100 个内核,运行频率约为半 GHz。我认为当前任何小型嵌入式 GPU 的着色器/计算内核数量都不多。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

        在 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 加速 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 之间的数据传输是您受到的打击。可以在 CPU 上执行更小的 FFT,某些实现/大小完全在缓存中。这使得 CPU 成为小型 FFT(低于 ~1024 点)的最佳选择。另一方面,如果您需要对数据执行大批量的工作,而与 GPU 之间的移动最少,那么 GPU 将击败 CPU。

        如果您想要快速的 FFT 实现,我建议使用 FFTW,如果您想要更快的(商业)实现,我建议使用英特尔数学库。对于 FFTW,使用 FFTW_Measure 标志执行计划将为您的特定硬件测量和测试最快的 FFT 例程。我在this question 中对此进行了详细介绍。

        对于 GPU 实现,您无法比 NVidia CUDA 提供的更好。自从我在 7800GTX 上进行实验以来,GPU 的性能已经显着提高,所以我建议您根据自己的特定要求使用他们的 SDK。

        【讨论】:

        • 虽然答案很好,但感觉已经过时了。您是否曾经对与 gpu 共享内存以进行 FFT 的新一代移动设备进行基准测试? (编辑:当我写移动设备时,我指的不仅仅是手机或平板电脑,还包括新的物联网、嵌入式等设备)
        • 是的,我在 10 多年前做过这项工作。今天的 GPU 从主内存到 GPU 内存的传输带宽要快得多,但同样,CPU 和缓存也快得多。我没有对它进行基准测试,但我想今天也存在类似的问题:较小的数据集在 SIMD 优化的 C++ 中计算速度更快,在 GPU 上较大的数据集计算速度更快。他到底在哪里?这是测试的问题!
        • 你能添加一个现代的 CPU 和 GPU 基准测试结果吗,因为这个答案是我在互联网上能找到的唯一真实信息,但 GPU 在过去已经走了很长一段路执政 9 年 - 很好奇事情发生了怎样的变化。
        • 抱歉,我无法再访问此代码,但我可以告诉您,我现在继续在 www.scichart.com 上从事 GPU / CPU 性能工作,我们仍在寻找(现在更是如此)如果你可以将某些东西卸载到 GPU 上,那就去做吧,因为它非常强大。通过将一些关键算法转移到 GPU,我们看到了 100 倍的性能提升。瓶颈仍然是从 GPU 获取数据或从 GPU 获取数据,但现代 PCI/Express 3.0 正在接近主内存的带宽。这使得 GPU 在几乎所有领域都成为高性能计算的有力竞争者。
        【解决方案5】:

        我想补充一下您关于嵌入式 GPU 的具体问题。

        与台式机上的高端 GPU 相比,它们通常具有很少的着色器内核、更少的内核寄存器和更低的内存带宽。然而,与板载多核 CPU [1] 相比,在嵌入式 GPU 上运行类似 FFT 的应用程序可以提供更好的性能。嵌入式 GPU 的主要优点是它们与 CPU 共享一个公共内存,从而避免了从主机到设备的内存复制过程。

        几乎所有嵌入式 GPU(如 ARM 的 Mali、Qualcomm 的 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 上的目的计算:有吗 成年了吗?

        【讨论】:

          猜你喜欢
          • 2022-11-04
          • 2012-04-18
          • 1970-01-01
          • 2012-06-12
          • 2016-09-11
          • 2019-01-02
          • 1970-01-01
          • 2011-02-09
          • 2013-06-28
          相关资源
          最近更新 更多