【问题标题】:speed up 2D correlation加快二维相关性
【发布时间】:2014-03-31 09:34:08
【问题描述】:

看起来我的应用程序开始是 (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 转换?

【问题讨论】:

  • 幻灯片 19 Fast Fourier Transforms (FFTs) and Graphical Processing Units (GPUs) 可能对您有用。我想说,所涉及的 FFT 并没有比 FFTW 具有明显更好的性能所需的那么大。此外,在对running FFTW on GPU vs using CUFFT 的回答中,我会说对于从不同主机线程调用 cuFFT 的小尺寸可能是批处理情况的替代方案。
  • 杰克,谢谢你的回答。实际上,有 4 个并行线程(每个 CPU 内核一个线程),每个都调用 cuFFT 进行转换 - 所以,看起来我已经在使用批量大小的替代方法了。

标签: cuda fft correlation cufft


【解决方案1】:

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

引用 CUFFT LIBRARY 用户指南

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

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

您可以做的其他事情是(引用 Robert Crovella 对running FFTW on GPU vs using CUFFT 的回答):

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

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

请注意:

  1. 如果变换的维度不够大,与优化的顺序或多核 FFT 相比,cuFFT 可能不方便;
  2. 您可以从CUDA Toolkit 4.0 Performance Report 中大致了解 cuFFT 与英特尔 MKL 的性能对比。

【讨论】:

    猜你喜欢
    • 2010-11-09
    • 2017-12-30
    • 2017-08-09
    • 1970-01-01
    • 2013-03-25
    • 1970-01-01
    • 2011-05-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多