恐怕永远不会有经验法则!
原因是多方面的,主要是您正在考虑的系统和您尝试解决的问题都在很大范围内变化。
基于问题的方面
你说你想做一个 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。这取决于。