C++ CUDA FFT-二次幂

C++ CUDA FFT-二次幂,c++,cuda,convolution,C++,Cuda,Convolution,我正在看CUDA SDK上的FFT示例,我想知道:当填充数据的一半是二的幂时,为什么CUFT要快得多?(一半是因为在频域中,一半是冗余的) 有两个大小的幂来工作有什么意义?我想这就是你的答案。它使用不同的算法 “我一直在做类似的工作 问题。在袖口手册中,它是 解释说cuFFT使用两个 不同的实现算法 FFTs。一个是Cooley Tuckey 方法和另一个是Bluestein 算法。当维度 只有2,3,5和7的素因子,例如 (675=3^3 x 5^5),然后是675 x 675 性能比say

我正在看CUDA SDK上的FFT示例,我想知道:当填充数据的一半是二的幂时,为什么CUFT要快得多?(一半是因为在频域中,一半是冗余的)


有两个大小的幂来工作有什么意义?

我想这就是你的答案。它使用不同的算法

“我一直在做类似的工作 问题。在袖口手册中,它是 解释说cuFFT使用两个 不同的实现算法 FFTs。一个是Cooley Tuckey 方法和另一个是Bluestein 算法。当维度 只有2,3,5和7的素因子,例如 (675=3^3 x 5^5),然后是675 x 675 性能比say 674好得多 x 674或677 x 677。使用 Cooley-Tuckey方法。如果 首要因素是首要的其他因素 大于2,3,5或7,则为 使用 蓝斯坦法,蓝斯坦法 比较慢,还有一些 精度损失。”

从手册中:

CUFFT库实现了几个 FFT算法,每个算法具有不同的 性能和准确性。最好的 性能路径对应于 变换满足两个条件的大小 标准:

  • 适合CUDAʹ共享 记忆
  • 是单一因素的力量吗 (例如,2的幂)
这些 变换也是最精确的 由于 选择FFT算法。变换 符合第一个标准的尺寸 但不是第二个,CUFFT使用了更多 通用混合基FFT算法 通常速度较慢,数值较小 精确的因此,如果可能的话 最好使用的尺寸是 两个或四个,或其他小的 素数(例如,3、5或 七)。此外,2的幂 CUFFT中的FFT算法使最大 通过阻塞使用共享内存 不符合以下条件的信号的子变换 满足第一个标准


只需为Ade的回答添加一点背景:

通常,离散傅里叶变换需要大量计算。N个点的一维FFT需要N*N次乘法。FFT(快速傅立叶变换)之所以更快,是因为在N是2的幂的情况下,可以重写方程,这样只需要N*log2n次乘法

在大多数应用程序中,您不关心样本的确切数量。所以你选择二次幂,以获得最佳性能


三或五的幂也会起作用,但二的幂是最快的,也是最容易编写的算法,因此多年来一直占据主导地位

链接示例或显示相关代码可能会有所帮助。