cuFFT 运行缓慢 - 有什么方法可以加速吗?

cuFFT runs slowly - any way to accelerate?

我正在使用 cufft 沿矩阵和数组的每一行计算 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 第一次被调用时,它都很慢。之后,它变得更快。我不明白为什么第一次很慢,以及如何避免它。任何人都有类似的经历吗?谢谢

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