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) 个简单算术运算要慢得多。
我正在使用 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) 个简单算术运算要慢得多。