cuFFT运行缓慢 - 任何加速方式?

时间:2015-04-30 20:42:37

标签: performance cuda fft

我正在使用袖带来计算矩阵和阵列的每一行的1D fft。矩阵大小为512(x)X 720(y),阵列大小为512 X 1.这意味着fft应用于每行有512个元素720次的矩阵,并应用一次数组。

然而,这个操作结果非常慢,基本上只有一秒钟。这是正常的,还是我可以加速代码的任何机会?

这是我的代码(来自NVIDIA示例代码):

void FFTSinoKernel(cufftComplex* boneSinoF, 
                   cufftComplex* kernelF,
                   int nChanDetX,    // 512
                   int nView)        // 720
{
    cufftHandle plan;

    // fft sino
    cufftPlan1d(&plan, nChanDetX, CUFFT_C2C, nView);
    cufftExecC2C(plan, boneSinoF, boneSinoF, CUFFT_FORWARD);

    // fft kernel
    cufftPlan1d(&plan, nChanDetX, CUFFT_C2C, 1);
    cufftExecC2C(plan, kernelF, kernelF, CUFFT_FORWARD);

    cufftDestroy(plan);
}

我试图使用cufftExecR2C(),,但我认为该函数有错误,因为我的DC组件每行移动1或2个单位。所以我已经提交了一份报告。但是现在cufftExecC2C()给了我正确的结果,所以我决定坚持下去。

更新

有趣的是,我发现如果再次调用此函数,它将显着加速,小于10毫秒。因此,每当cufft被称为第一个时间时,它就会很慢。之后,它变得更快。我不明白为什么第一次这么慢,以及如何避免它。有没有类似的经历?感谢。

1 个答案:

答案 0 :(得分:3)

将FFT初始化(计划创建)移到性能关键循环之外。设置代码必须分配内存并计算O(N)超越函数,这可能比FFT计算本身内的O(NlogN)简单算术运算慢得多。