我很难掌握如何计算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
我正在尝试使用上面相同的原理来查找FLOP的总数,作为以下代码(MATLAB)中等式数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
答案 0 :(得分:1)
我不是MATLAB的专家,但我会去。
我注意到你的代码中没有一行索引你的向量范围。好,这意味着我在我面前看到的每一项操作都涉及一对数字。所以我认为第一个循环是每次迭代5个FLOPS,第二个循环是每次迭代3次。然后是中间的单一操作。
但是,MATLAB默认将所有内容存储为double。因此,循环变量k本身每个循环操作一次,然后每次从其计算索引。所以这是第一个循环的额外4和第二个循环的2。
但等等 - 第一个循环有'k-1'两次,所以从理论上讲,可以通过计算和存储它来优化一点,每次迭代减少FLOP的数量。 MATLAB解释器可能能够发现自己的那种优化。而且据我所知,它可以解决k实际上可能是一个整数,一切都还可以。
所以问题的答案取决于它。您想知道CPU执行的FLOP数量,或代码中表示的最小数量(即仅向量上的操作数),或者如果根本没有进行优化,MATLAB将执行的严格FLOP数量? MATLAB曾经有一个flops()函数来计算这类事情,但它不再存在了。我无论如何都不是MATLAB的专家,但我怀疑flops()已经消失了,因为解释器变得过于聪明并进行了大量的优化。
我有点想知道你为什么想知道。我曾经使用flops()来计算一个数学运算的操作数量,这是一种粗略的方法来估计我需要多少计算咕噜声才能使它以C语言实时工作。
现在我看一下原语本身(例如,有一个1k复数FFT,根据库数据表,该CPU上的7us将是7us,有2k向量乘法,即2.5us等)。它有点棘手,因为必须考虑缓存速度,数据集大小等。数学库(例如fftw)本身实际上是不透明的,因此所有人都能做到。
因此,如果您因为这个原因计算FLOP,那么您可能无法得到很好的答案。