2

FLOP のカウント方法を把握するのに苦労しています。ある瞬間、私はそれを理解したと思いますが、次の瞬間には意味がありません。これを説明する助けをいただければ幸いです。このトピックに関する他のすべての投稿を見てきましたが、私がよく知っているプログラミング言語で完全に説明されているものはありません (MATLAB と FORTRAN をいくつか知っています)。

これは、私の本の 1 つから、私がやろうとしていることの例です。

次のコードでは、フロップの合計数(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

n上記と同じ原則を適用して、次のコード (MATLAB)の方程式の数の関数として 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
4

1 に答える 1

2

私は決して MATLAB の専門家ではありませんが、やってみます。

ベクトルのコード インデックス範囲の行がないことに気付きました。いいですね、つまり、目の前にあるすべての操作には、1 組の数値が関係しているということです。したがって、最初のループは反復ごとに 5 FLOPS であり、2 番目のループは反復ごとに 3 であると思います。そして、真ん中にその単一の操作があります。

ただし、MATLAB は既定ですべてを double として格納します。したがって、ループ変数 k 自体は、ループごとに 1 回操作され、インデックスがそこから計算されるたびに操作されます。つまり、最初のループでは 4、2 番目のループでは 2 です。

しかし、待ってください-最初のループには「k-1」が2回あるため、理論的には、それを計算して保存し、反復ごとにFLOPの数を1つ減らすことで、それを少し最適化できます。MATLAB インタープリターはおそらく、そのような最適化を自分自身で見つけることができます。そして、私が知っている限りでは、k が実際には整数である可能性があり、すべてが問題ないことがわかります。

したがって、あなたの質問に対する答えは、場合によるということです。CPU が実行する FLOP の数、またはコードで表現される最小数 (つまり、ベクトルのみの操作の数)、または最適化をまったく行わなかった場合に MATLAB が実行する厳密な FLOP の数を知りたいですか? ? MATLAB には、この種のものをカウントするための flops() 関数がありましたが、もうありません。私は決して MATLAB の専門家ではありませんが、インタープリターが賢くなりすぎて多くの最適化を行ったため、 flops() がなくなったのではないかと思います。

なぜあなたが知りたいのか、少し興味があります。以前は、C で書かれたリアルタイムで機能させるために必要なコンピューティングのうなり声を推定する大雑把な方法として、ある数学の一部が実行した操作の数をカウントするために flops() を使用していました。

最近では、プリミティブ自体を調べています (たとえば、1k の複素数 FFT があり、ライブラリのデータシートによると、その CPU で 7us になり、2k のベクトル乗算があり、2.5us になるなど)。キャッシュの速度やデータセットのサイズなどを考慮する必要があるため、少し注意が必要です。数学ライブラリ (fftw など) 自体は事実上不透明であるため、できることはそれだけです。

したがって、その理由で FLOP を数えている場合、おそらくあまり良い答えが得られないでしょう。

于 2013-03-28T06:20:48.960 に答える