matlab - 了解如何计算 FLOP 次数

标签 matlab floating-point counting flops

我很难掌握如何计算失败次数。前一秒我还以为我明白了,但下一秒我就觉得毫无意义了。一些帮助解释这一点将不胜感激。我已经查看了有关此主题的所有其他帖子,但没有一个帖子用我熟悉的编程语言(我了解一些 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) 中方程 n 数量函数的 FLOP 总数。

% 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

最佳答案

我绝不是 MATLAB 专家,但我会尝试一下。

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

但是,MATLAB 默认将所有内容存储为 double 型。因此,每个循环都会对循环变量 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)本身实际上是不透明的,因此这就是人们所能做的。

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

关于matlab - 了解如何计算 FLOP 次数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15670784/

相关文章:

python - 在 python-numpy 中定义自定义 float8 并从/到 float16 转换?

c - C 中带有 AVR atmega8 的意外 float 行为

javascript - 为什么在 JS 中以不同的方式重新组合被加数有时会产生不同的结果?

python - 为数据框中的每个用户查找最长的连续零

c++ - 输出迭代器适配器计数但不复制

c++ - MATLAB 代码与 C/C++ 集成时出现 fatal error

matlab - 在 MATLAB 中实现逻辑回归

python - Ipython笔记本水平缩放

python - 为什么我的reduce lambda 表达式没有按预期工作?

matlab - 使用 MATLAB 除以两个多项式