将 FFT 发送到 GPU 的好启发式点在计算上值得吗?

信息处理 fft
2022-01-19 00:37:55

这是一个相当简单的问题,但在过去 5 年左右的时间里,我没有发现太多关于在 GPU 与 CPU 上计算 FFT 的良好经验法则。我知道 GPU 计算的 FFT 的大部分开销是您必须首先将数据写入缓冲区,然后将该数据从 CPU 传输到 GPU,以便计算转换。

这自然意味着 GPU 计算 FFT 更适合较大的 FFT 计算,其中与 GPU 执行的计算数量相比,写入 GPU 的数量相对较少。但接下来的问题是知道 FFT 在 CPU 与 GPU 上的表现在什么时候更好。我发现的最好的是“当你计算更大的 FFT 时”,但这对于从业者来说是一个特别有意义的指南,这有点相对论,特别是考虑到 GPU 技术在过去几年中一直在快速加速。

我只是在寻找一个更具体的估计,即在什么时候计算 GPU 与 CPU 上的转换变得有效(也许那里有一个基准?)。提前感谢您提供的任何帮助。

1个回答

恐怕永远不会有经验法则!

原因是多方面的,主要是您正在考虑的系统和您尝试解决的问题都在很大范围内变化。

基于问题的方面

你说你想做一个 FFT——但这总是你真正想做的事情的一半!

需要将 FFT 转换为它的 abs²,然后映射到颜色,然后显示在屏幕上吗?在 GPU 中做,就在它所属的地方;fosphor在有能力的 PC/GPU 组合上以 200MS/s 的速度轻松做到这一点:

磷光体

在这种情况下,FFT 的大小甚至无关紧要。您的数据将由 GPU 进一步处理,因此在那里进行 FFT。

另一方面,您可能想做一些依赖于对 FFT 中的单个元素进行大量检查的事情,在 CPU 中?可能只有一个 FFT,然后不会更多?

在这种情况下,您的理论吞吐量根本对您没有帮助。只是等待数据从 CPU 缓存中返回到相干内存中,因此可以将其 DMA 传输到 GPU,然后在其中启动 FFT(可能会在途中浪费中断/上下文切换),只是为了等到它完成后,GPU DMA 将数据返回到您的主内存,然后您将其放入 CPU 的缓存中,即使是中等大小的 FFT,也不会支付任何费用。

所以:这整个“高延迟数学加速器业务”只有在你等待的时候能做一些明智的事情才会真正得到回报。如果你不能,就会有巨大的延迟损失。

基于系统的方面

好的,这里不再赘述,但是:

  • DSP 系统受 CPU 或内存带宽限制
  • 如果您的 GPU 操作有助于限制 CPU,但在内存接口上增加了额外的数据移动负载,而实际上系统的其余部分受内存带宽限制,那么您正在伤害自己。
  • 同样适用于其他方式:也许您的算法(您感兴趣的特定大小的 FFT)受 CPU 限制,但您的 GPU 加速会导致额外的中断
  • 您的 CPU 可以做得很好的 FFT 大小是多少?这可能是由它的 L1 和 L2 缓存的大小定义的。Xeon 数字运算 CPU 将有数十兆字节,而在 Jetson NVidia SoC 中运行的 ARM 则不会。
  • 你的显卡擅长的 FFT 尺寸是多少?并行线程的数量、它们的灵活性和跨卡的内存带宽存在巨大差异。
  • “好”的衡量标准是什么?只是吞吐量和延迟的一些奇怪的比率,但也许还有能量和让正确的资源免费用于其他工作?
  • 您的 CPU<-> 主内存接口是什么?是运行在近 2GHz 的四通道 DDR4 接口,还是单通道 DDR?
  • 您的 GPU<->GPU 内存接口是什么?
  • 您的 GPU<-> 主内存接口是什么?
  • 您的 CPU<->GPU 通信在您的特定用例中的效果如何?
  • 例如,PCIe 总线上是否存在高负载,因为同一个 PCIe 交换机必须处理流入和流出高速系统的数据(例如,存储,但更有可能是 10 Gigabit 以太网或视频数据) ?

所以,答案可能不会令人满意,但它确实是:

对于单精度 FFT ,某处高于 64 个 bin,某处低于 2 20 个bin。这取决于。