我正在使用袖带来计算矩阵和阵列的每一行的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
被称为第一个时间时,它就会很慢。之后,它变得更快。我不明白为什么第一次这么慢,以及如何避免它。有没有类似的经历?感谢。
答案 0 :(得分:3)
将FFT初始化(计划创建)移到性能关键循环之外。设置代码必须分配内存并计算O(N)超越函数,这可能比FFT计算本身内的O(NlogN)简单算术运算慢得多。