Algorithm FFT有多少次失败?

Algorithm FFT有多少次失败?,algorithm,fft,flops,Algorithm,Fft,Flops,我想知道一个快速傅立叶变换(FFT)执行多少次FLOPS 因此,如果我有一个1的N浮点数的维数组,我想计算这组数的FFT,需要执行多少次FLOPS 我知道这取决于所使用的算法,但是可用的最快算法呢 我还知道FFT的缩放顺序为N*log(N),但这并不能回答我的问题。您可以在最短时间内估计触发器的性能。稍微过时,但包含最有效FFT实现的结果 对于3.0 GHz Intel Xeon Core Duo,粗略估计大约为5000 mFLOP您可以在最短时间内估计flops性能。稍微过时,但包含最有效FF

我想知道一个快速傅立叶变换(FFT)执行多少次
FLOPS

因此,如果我有一个
1
N
浮点数的维数组,我想计算这组数的FFT,需要执行多少次
FLOPS

我知道这取决于所使用的算法,但是可用的最快算法呢


我还知道FFT的缩放顺序为
N*log(N)
,但这并不能回答我的问题。

您可以在最短时间内估计触发器的性能。稍微过时,但包含最有效FFT实现的结果


对于3.0 GHz Intel Xeon Core Duo,粗略估计大约为5000 mFLOP

您可以在最短时间内估计flops性能。稍微过时,但包含最有效FFT实现的结果


3.0 GHz Intel Xeon Core Duo的粗略估计大约为5000 mFLOP,这取决于具体实现。最快并不一定意味着最低的翻牌或最高的翻牌。速度通常是通过利用HW体系结构而不是降低FLOP来实现的。有太多的实现存在,所以你的问题没有实际的代码和架构是无法回答的

我喜欢预先计算的
W
矩阵实现,因为我通常多次对单分辨率矩阵使用FFT,因此无需对每个分辨率计算
W
多次。这可以显著减少每个递归层的触发器

例如,仅使用
+,-,*
操作,每次迭代有14次触发器。假设1D FFT情况
N=8
,如果我没有犯任何愚蠢的错误,则使用基本数据类型:

FLOP = 8*14 + (4+4)*14 +(2+2+2+2+2)*14 +(1+1+1+1+1+1+1+1)*2 = 14*N*log2(N) + 2*N = 352
如果您使用真实的输入/输出,您甚至可以降低第一个/最后一个递归层的输入/输出。但是简单的触发器计数是不够的,因为有些操作比其他操作更复杂。而且,FLOP不是影响速度的唯一因素

现在要获得触发器只需测量
时间
FFT
所需时间:

FLOPS = FLOP/time

这取决于执行情况。最快并不一定意味着最低的翻牌或最高的翻牌。速度通常是通过利用HW体系结构而不是降低FLOP来实现的。有太多的实现存在,所以你的问题没有实际的代码和架构是无法回答的

我喜欢预先计算的
W
矩阵实现,因为我通常多次对单分辨率矩阵使用FFT,因此无需对每个分辨率计算
W
多次。这可以显著减少每个递归层的触发器

例如,仅使用
+,-,*
操作,每次迭代有14次触发器。假设1D FFT情况
N=8
,如果我没有犯任何愚蠢的错误,则使用基本数据类型:

FLOP = 8*14 + (4+4)*14 +(2+2+2+2+2)*14 +(1+1+1+1+1+1+1+1)*2 = 14*N*log2(N) + 2*N = 352
如果您使用真实的输入/输出,您甚至可以降低第一个/最后一个递归层的输入/输出。但是简单的触发器计数是不够的,因为有些操作比其他操作更复杂。而且,FLOP不是影响速度的唯一因素

现在要获得触发器只需测量
时间
FFT
所需时间:

FLOPS = FLOP/time

“可用的最快算法”不仅非常依赖于处理器,而且可能在我的测试中使用完全不同的算法。但我计算了非递归就地抽取时间基-2 FFT的失败次数,该FFT取自旧ACM算法教科书中长度为1024的FFT,得到20480个fmuls和30720个FADD(这是使用预先计算的旋转因子表,因此超越函数计算不包括在失败次数中)。但请注意,这段代码还使用了大量整数数组索引计算、正弦表查找和数据移动,这些操作可能比FPU占用更多的CPU周期。更大的FFT可能还会导致大量额外的数据缓存未命中和其他内存延迟惩罚。在这种情况下,可以通过添加更多的触发器来加速代码,以减少内存层次结构延迟惩罚。因此,YMMV.

可用的最快算法不仅非常依赖于处理器,而且可能在我的测试中使用完全不同的算法。但我计算了非递归就地抽取时间基-2 FFT的失败次数,该FFT取自旧ACM算法教科书中长度为1024的FFT,得到20480个fmuls和30720个FADD(这是使用预先计算的旋转因子表,因此超越函数计算不包括在失败次数中)。但请注意,这段代码还使用了大量整数数组索引计算、正弦表查找和数据移动,这些操作可能比FPU占用更多的CPU周期。更大的FFT可能还会导致大量额外的数据缓存未命中和其他内存延迟惩罚。在这种情况下,可以通过添加更多的触发器来加速代码,以减少内存层次结构延迟惩罚。因此,YMMV.

正如Spektre强调的那样,实际的
触发器
(每秒浮点运算)取决于特定的硬件和实现,更高的
触发器
(浮点运算)算法可能对应于更低的
触发器
实现,只是因为有了这样的实现,您可以更有效地利用硬件

如果您想计算时间基数为2的抽取的浮点运算数,您可以参考下图:

N
转换序列的长度。这是一个整体
real(W) * real(O(i)), 
imag(W) * imag(O(i)), 
real(W) * imag(O(i)), 
imag(W) * real(O(i)).
real(W) * real(O(i)) – imag(W) * imag(O(i))     (1)
real(W) * imag(O(i)) + imag(W) * real(O(i))     (2)
real(E(i)) + eqn.1
imag(E(i)) + eqn.2
real(E(i)) – eqn.1
imag(E(i)) – eqn.2
2N * log2(N) multiplications
3N * log2(N) additions