【问题标题】:How many FLOPS for FFT?FFT 有多少 FLOPS?
【发布时间】:2016-10-14 06:46:05
【问题描述】:

我想知道快速傅里叶变换 (FFT) 执行了多少 FLOPS

那么,如果我有一个由N 浮点数组成的1 维数组,并且我想计算这组数字的FFT,那么需要执行多少个FLOPS

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

我也知道 FFT 的缩放是N*log(N) 的数量级,但这不能回答我的问题。

【问题讨论】:

  • 除非您使用的硬件非常有限,否则您不太可能从这些数据中推断出您可以执行多大的 FFT。
  • (对于任何给定的输入和(机器级)实现,它将执行许多 FloatingPointOperations - FLO?对于一个给定的机器(&-设置和边界条件(想想 热节流) >)),这将需要一些分配或挂钟秒数,以便计算出 FLOPS。)(与 F.Haglund 相呼应:预计 大量 内存层次结构效应。)
  • FFT 执行时间主要由内存延迟决定,因为它执行的内存访问是跨步的。在典型的处理器上,数学是最简单的部分,访问内存是个问题。
  • 这个问题是重复的:stackoverflow.com/questions/7957907/…
  • @doug65536 仅适用于足够大的 FFT 变换。例如,64^3 3D FFT 适合缓存。

标签: algorithm fft flops


【解决方案1】:

这取决于实施。最快不一定意味着最低 FLOP 或最高 FLOPS。速度通常是通过利用 HW 架构而不是降低 FLOP 来实现的。那里有太多的实现,所以没有实际代码和架构的问题是无法回答的。

我喜欢预先计算的W 矩阵实现,因为我通常多次将FFT 用于单分辨率矩阵,因此无需在每个分辨率中多次计算W。这可以显着减少每个递归层的 FLOP

例如,这个 DFFTcc 每次迭代有 14 个 FLOP,仅使用 +,-,* 操作。假设 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

如果您使用 Real 输入/输出,您甚至可以降低第一个/最后一个递归层的值。但是简单的 FLOP 计数是不够的,因为某些操作比其他操作更复杂。而且FLOP并不是唯一影响速度的因素。

现在要获得 FLOPS,只需测量time [s] FFT 需要:

FLOPS = FLOP/time

【讨论】:

  • 我假设您的意思是浮点运算(@greybeard 所说的 FLO?),而不是每秒浮点运算?
  • @MayeulC FLOP = 浮点运算是且 FLOPS 为 FLOP/s
  • @MayeulC 你只能测量 FLOPS 而不能计算它。然后你可以比较你的硬件数据表参数来估计利用率,因为 graybeard 提到会有很大的不同。主要是由于内存、调度、同步和其他问题。
【解决方案2】:

正如 Spektre 所强调的,实际的FLOPS(每秒浮点运算次数)取决于特定的硬件和实现,更高的FLOP(浮点运算)算法可能对应于更低的FLOPS 实现,因为使用这样的实现可以更有效地利用硬件。

如果您想计算 Decimation In Time radix-2 方法的浮点运算次数,可以参考下图:

N 为要转换的序列的长度。共有log2N 个阶段,每个阶段包含N/2 个蝴蝶。然后让我们考虑通用蝴蝶:

让我们将泛型蝴蝶的输出改写为

E(i + 1) = E(i) + W * O(i)
O(i + 1) = E(i) - W * O(i)

因此,蝴蝶涉及一个复数乘法和两个复数加法。在用实部和虚部重写上述方程时,我们有

real(E(i + 1)) = real(E(i)) + (real(W) * real(O(i)) - imag(W) * imag(O(i)))
imag(E(i + 1)) = imag(E(i)) + (real(W) * imag(O(i)) + imag(W) * real(O(i)))

real(O(i + 1)) = real(O(i)) - (real(W) * real(O(i)) - imag(W) * imag(O(i)))
imag(O(i + 1)) = imag(O(i)) - (real(W) * imag(O(i)) + imag(W) * real(O(i)))

因此,我们有

4 次乘法

real(W) * real(O(i)), 
imag(W) * imag(O(i)), 
real(W) * imag(O(i)), 
imag(W) * real(O(i)).

6 个总和

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

因此,Decimation In Time radix 2 方法的运算次数为

2N * log2(N) multiplications
3N * log2(N) additions

如果乘法的排列方式不同,这些操作计数可能会发生变化,请参阅Complex numbers product using only three multiplications

同样的结果也适用于Decimation in Frequency radix 2的情况,见图

【讨论】:

    【解决方案3】:

    您可以在FFTW benchmark page 估计失败的性能。有点过时,但包含最有效的 FFT 实现的结果。

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-12
        • 2021-07-21
        • 2015-11-16
        • 1970-01-01
        相关资源
        最近更新 更多