0

看起来我的应用程序开始是(i)FFT 有界的,它对平均大小约为 500x200(宽度和高度总是均匀)的矩形进行了大量的 2D 相关。场景和往常一样 - 执行两个 FFT(每个字段一个),将复杂字段相乘,然后执行一个 iFFT。

因此,在 CPU(Intel Q6600,带有 JTransforms 库)上,根据分析器,FFT 转换占用大约 70% 的时间,在 GPU(GTX670,cuFFT 库)上 - 大约 50%(因此,CUDA 的性能有所提高,但没有我想要的是)。我意识到,可能是 GPU 没有完全饱和(带宽有限)的情况,但从其他情况来看 - 批量计算会显着增加应用程序的复杂性。

问题:

  1. 我可以做些什么来减少至少几次在 FFT 上花费的时间?
  2. 我应该尝试 FFTW 库吗(目前我不确定它是否会比 JTransforms 带来显着的收益)?
  3. 是否有任何专用硬件可以插入 PC 进行 FFT 转换?
4

1 回答 1

3

我正在回答你的第一个问题:我可以做些什么来减少 cuFFT 花费的时间?

引用 CUFFT LIBRARY 用户指南

  1. 将所有维度的大小限制为可表示为2^a*3^b*5^c*7^d。CUFFT 库具有高度优化的内核,用于维度具有这些主要因素的变换。
  2. 限制沿每个维度的大小以使用更少的不同主要因子。例如,大小的变换3^n通常会比大小的一个更快,2^i*3^j即使后者稍微小一些。
  3. 将维度的二次幂分解项限制为单精度变换或双精度变换x的倍数。这进一步有助于内存合并。25664
  4. 将单精度变换的维度限制x为严格的 2 的幂,无论是在Fermi 级、Kepler 级和更新的 GPU 之间还是在2早期架构之间。这些转换被实现为专门的手工编码内核,将所有中间结果保存在共享内存中。819222048
  5. 使用本机兼容模式进行原地复数到实数或实数到复数的转换。该方案减少了填充字节的写入/读取,因此有助于合并数据。

从 CUFFT 库的 3.1 版开始,当 x 维的二次幂分解项至少为4 的倍数。大型 1D 尺寸(大于 65,536 的 2 的幂)、2D 和 3D 变换从实数到复数或复数到实数转换的实现中的性能优化中受益最大。

您可以做的其他事情是(引用 Robert Crovella对在 GPU 上运行 FFTW 与使用 CUFFT的回答):

  1. cuFFT 例程可以被多个主机线程调用,因此可以对 cufft 进行多次调用以进行多个独立的转换。如果单个变换足够大以使用机器,那么您不太可能会从中看到很大的加速。

  2. cufft 还支持批处理计划,这是“一次”执行多个转换的另一种方式。

请注意:

  1. 如果变换的维度不够大,与优化的顺序或多核 FFT 相比,cuFFT 可能不方便;
  2. 您可以从CUDA Toolkit 4.0 性能报告中大致了解 cuFFT 与 Intel MKL 的性能。
于 2014-04-02T21:01:46.007 回答