为什么 cuFFT 在 K40 上是 "slow"?

Why cuFFT is "slow" on K40?

我在双精度模式下比较了 GTX 780 和 Tesla K40 上的简单 3D cuFFT 程序。

我在 GTX 780 上测量到大约 85 Gflops,而在 K40 上我测量到大约 160 Gflops。这些结果让我感到困惑:GTX 780 具有 166 Gflops 的峰值理论性能,而 K40 具有 1.4 Tflops。

cuFFT 在 K40 上的有效性能与理论峰值性能相差如此之远的事实也来自 Nvidia 在 this link.

创建的图表

有人可以向我解释为什么会这样吗? cuFFT 库有限制吗?也许一些缓存动机...

非常简短的回答是,GTX 780 上的双精度 FFT 很可能受算术指令吞吐量限制,但同样的 FFT 操作在 Tesla K40 上受内存带宽限制。

稍微长一点的答案是 K40 有大约 288 Gb/s 峰值内存带宽,对于像 IEEE 754 float64 这样的 8 字节类型来说是 36 Gwords/s。 FFT 的算术吞吐量将限于它可以针对该内存吞吐量执行的 FLOP 数量。达到双精度峰值 FLOP/s 需要每个内存事务进行接近 40 次双精度运算。显然,FFT 的算术强度不够,结果是峰值算术吞吐量低得多。

在GTX 780上,内存带宽与K40差不多,但峰值双精度吞吐量低了大约8倍,似乎有可能在可用内存带宽下更接近算术峰值。