加速2D相关

时间:2014-03-31 09:34:09

标签: cuda fft correlation cufft

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

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

问题:

  1. 我可以做些什么来减少至少花费在FFT上的时间 次?
  2. 我应该尝试使用FFTW库(此时我不确定与JTransforms相比它会带来显着的增益吗?)
  3. 是否有可以插入PC的专用硬件 用于FFT转换?

1 个答案:

答案 0 :(得分:3)

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

引用CUFFT LIBRARY用户指南

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

    从CUFFT库的3.1版本开始,当x维度的二次幂分解项为时,利用了实际到复杂输出数据阵列和复杂到实际输入数据阵列的共轭对称性。大型1D尺寸(大于65,536的功率),2D和3D变换从实现复杂或复杂到真实变换的性能优化中获益最多。

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

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

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

  3. 请注意:

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