Cuda 加速二维相关

Cuda 加速二维相关,cuda,fft,correlation,cufft,Cuda,Fft,Correlation,Cufft,看起来我的应用程序开始(i)FFT有界了,它对平均大小约为500x200(宽度和高度总是相等)的矩形进行了大量2D关联。场景和往常一样-进行两次FFT(每个字段一次),乘以复数字段,然后进行一次iFFT 因此,根据profiler的数据,在CPU(Intel Q6600,带有JTTransforms library)上,在GPU(GTX670,cuFFT library)上,FFT转换占用了大约70%的时间-大约50%(因此,CUDA上的性能有所提高,但不是我想要的)。我意识到,GPU可能没有完

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

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

问题:

  • 我可以做些什么来进一步减少花在FFT上的时间,至少几个小时 时代
  • 我是否应该尝试FFTW库(目前我不确定它与JTTransforms相比是否会带来显著的收益)
  • 有没有专门的硬件可以插到电脑上 用于FFT转换

  • 我在回答你的第一个问题:我能做些什么来进一步减少cuFFT花费的时间?

    引用《CUFFT图书馆用户指南》

  • 将所有尺寸的大小限制为
    2^a*3^b*5^c*7^d
    。CUFFT库具有高度优化的转换内核,其维度具有这些基本因子
  • 限制每个维度的大小,以使用较少的不同素数因子。例如,大小为
    3^n
    的变换通常比大小为
    2^i*3^j
    的变换更快 如果后者稍小
  • 对于单精度变换,将
    x
    维度的两个因子分解项的幂限制为
    256
    的倍数,对于双精度变换,将其幂限制为
    64
    。这进一步有助于记忆融合
  • 对于费米级、开普勒级和最近的GPU,将单精度变换的
    x
    维度严格限制为
    2
    8192
    之间的二次幂,或者对于早期架构,限制为
    2
    2048
    之间的二次幂。这些转换被实现为专门的手工编码内核,将所有中间结果保存在共享内存中
  • 对就地复杂到真实或真实到复杂的转换使用本机兼容模式。此方案减少了填充字节的写入/读取,因此有助于合并数据 从CUFFT库的3.1版开始,当x维的两个因子分解项的幂至少为4的倍数时,利用实到复输出数据数组和复到实输入数据数组的共轭对称性。大的1D大小(两个大于65536的幂)、2D和3D变换从实数到复数或复数到实数变换实现中的性能优化中获益最大

    你可以做的其他事情是(引用罗伯特·克罗维拉的答案):

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

  • cufft还支持批处理计划,这是“同时”执行多个转换的另一种方式

  • 请注意:

  • 如果变换的维数不够大,则与优化的顺序或多核FFT相比,CUFT可能不方便
  • 与英特尔MKL相比,您可以大致了解cuFFT的性能
    我在回答你的第一个问题:我能做些什么来进一步减少cuFFT花费的时间?

    引用《CUFFT图书馆用户指南》

  • 将所有尺寸的大小限制为
    2^a*3^b*5^c*7^d
    。CUFFT库具有高度优化的转换内核,其维度具有这些基本因子
  • 限制每个维度的大小,以使用较少的不同素数因子。例如,大小为
    3^n
    的变换通常比大小为
    2^i*3^j
    的变换更快 如果后者稍小
  • 对于单精度变换,将
    x
    维度的两个因子分解项的幂限制为
    256
    的倍数,对于双精度变换,将其幂限制为
    64
    。这进一步有助于记忆融合
  • 对于费米级、开普勒级和最近的GPU,将单精度变换的
    x
    维度严格限制为
    2
    8192
    之间的二次幂,或者对于早期架构,限制为
    2
    2048
    之间的二次幂。这些转换被实现为专门的手工编码内核,将所有中间结果保存在共享内存中
  • 对就地复杂到真实或真实到复杂的转换使用本机兼容模式。此方案减少了填充字节的写入/读取,因此有助于合并数据 从CUFFT库的3.1版开始,当x维的两个因子分解项的幂至少为4的倍数时,利用实到复输出数据数组和复到实输入数据数组的共轭对称性。大的1D大小(两个大于65536的幂)、2D和3D变换从实数到复数或复数到实数变换实现中的性能优化中获益最大

    你可以做的其他事情是(引用罗伯特·克罗维拉的答案):

  • cuFFT例程可以由多个主机线程调用,因此可以为多个独立的转换对cuFFT进行多次调用。如果单个变换很大,则不太可能从中看到太多的加速