【问题标题】:Understanding how to count FLOPs了解如何计算 FLOP
【发布时间】:2013-03-27 22:30:36
【问题描述】:

我很难掌握如何计算 FLOP。前一刻我觉得我明白了,下一刻对我来说毫无意义。一些帮助解释这一点将不胜感激。我查看了有关该主题的所有其他帖子,但没有一篇完全用我熟悉的编程语言解释(我知道一些 MATLAB 和 FORTRAN)。

这是我的一本书中的一个示例,说明我正在尝试做的事情。

对于下面这段代码,总的失败次数可以写成(n*(n-1)/2)+(n*(n+1)/2),相当于n^2 + O(n)

[m,n]=size(A)
nb=n+1;
Aug=[A b];
x=zeros(n,1);
x(n)=Aug(n,nb)/Aug(n,n);
for i=n-1:-1:1
    x(i) = (Aug(i,nb)-Aug(i,i+1:n)*x(i+1:n))/Aug(i,i);
end

我正在尝试应用上述相同的原理来在以下代码 (MATLAB) 中找到 FLOP 总数作为方程数 n 的函数。

% e = subdiagonal vector
% f = diagonal vector
% g = superdiagonal vector
% r = right hand side vector
% x = solution vector

n=length(f);

% forward elimination
for k = 2:n
    factor = e(k)/f(k­‐1);
    f(k) = f(k) – factor*g(k‐1);
    r(k) = r(k) – factor*r(k‐1);
end

% back substitution
x(n) = r(n)/f(n);
for k = n‐1:­‐1:1
    x(k) = (r(k)‐g(k)*x(k+1))/f(k);
end

【问题讨论】:

  • 不,不是。我需要了解如何根据方程式“n”的数量来确定触发器的总数。我不想要代码或其他东西来为我确定它。
  • 首先,您没有在问题中提供该信息。其次,你的第一个循环有问题:迭代变量应该是k,而不是x。你运行了这段代码吗?
  • 是的,发布时出错。我解决了我的问题。无需全力防守。
  • 您的问题非常模糊,您正在寻找的答案似乎不清楚。您是在问如何计算 FLOPs?您是否在寻找作为 n 函数的解析表达式?图形可视化就足够了吗?

标签: matlab floating-point counting flops


【解决方案1】:

我绝不是 MATLAB 方面的专家,但我会试一试。

我注意到你的代码中没有任何行索引你的向量的范围。很好,这意味着我之前看到的每个操作都涉及一对数字。所以我认为第一个循环是每次迭代 5 FLOPS,第二个循环是每次迭代 3。然后就是中间那个单一的操作。

但是,MATLAB 默认将所有内容存储为双精度数。因此,循环变量 k 本身在每个循环中运行一次,然后每次从中计算索引。所以这是第一个循环的额外 4 和第二个循环的 2。

但是等等——第一个循环有两次“k-1”,所以理论上可以通过计算和存储来优化它,每次迭代减少 FLOP 的数量。 MATLAB 解释器可能能够为自己发现这种优化。据我所知,它可以计算出 k 实际上可以是一个整数,并且一切都还可以。

因此,您的问题的答案是视情况而定。您是否想知道 CPU 执行的 FLOP 数量,或代码中表示的最小数量(即仅对向量进行的操作数量),或者如果 MATLAB 根本不进行优化,它将执行的 FLOP 的严格数量? MATLAB 曾经有一个 flops() 函数来计算这类事情,但现在已经不存在了。我无论如何都不是 MATLAB 专家,但我怀疑 flops() 已经消失了,因为解释器变得太聪明了并且做了很多优化。

我有点想知道你为什么想知道。我曾经使用 flops() 来计算一段数学运算做了多少次运算,作为粗略的方法来估算我需要多少计算任务才能让它实时工作,用 C 语言编写。

现在我查看原语本身(例如,有一个 1k 复数 FFT,根据库数据表,在那个 CPU 上将是 7us,有一个 2k 向量乘法,这将是 2.5us,等等)。这有点棘手,因为必须考虑缓存速度、数据集大小等。数学库(例如 fftw)本身实际上是不透明的,因此只能做到这一点。

因此,如果您出于这个原因计算 FLOP,您可能不会得到很好的答案。

【讨论】:

  • 所以如果我的代码在循环内索引了向量的范围,那将是一个更复杂的问题,对吧?因为它不再是对它们进行操作的单个数字集,所以它将是带有操作的数字的整个索引,然后是循环迭代?我应该为我正在上课的课程学习这个概念,教授不是很有帮助,所以我需要一些额外的建议。
  • 是的,大概就是这么大。想象一下用计算器手动完成所有操作。每次你点击 +、-、* 或 / 时,你都在做 FLOP。例如,y=8*x(1:10) 可以归结为将 x 中的 10 个元素中的每一个元素乘以 8。那将是 10 个 FLOP。但正如我所暗示的,代码中明显的操作数量并不意味着 MATLAB 实际上执行了那么多;优化就是减少完成的工作,但最终得到完全相同的结果。 MATLAB 非常慢,所以我认为 Mathworks 投入了一些精力来动态优化代码。
猜你喜欢
  • 1970-01-01
  • 2015-11-14
  • 1970-01-01
  • 2013-09-11
  • 1970-01-01
  • 2012-07-28
  • 1970-01-01
  • 2010-12-05
  • 2020-08-31
相关资源
最近更新 更多