6

これは本当に時間がかかっています。次のコード(ループ)のFLOPSを推定する簡単な方法が見つかりませんでした。ループの1回の反復でのFLOPSの量は次のとおりです。

float func(float * atominfo, float energygridItem, int xindex, int yindex)
{
   ...
   for (atomid=0; atomid<numatoms*4; atomid+=4) 
   {
       float dy = coory - atominfo[atomid+2];
       float dysqpdzsq = (dy * dy) + atominfo[atomid+3];
       float dx1 = coorx1 - atominfo[atomid+1];

       float s, y, t;
       s = atominfo[atomid] * (1.0f / sqrtf(dx1*dx1 + dysqpdzsq));
       y = s - energycomp1;
       t = energyvalx1 + y;
       energycomp1 = (t - energyvalx1)  - y;
       energyvalx1 = t;
    }
    ...
}

見た目はシンプルですが、先ほどの数字と混同してしまいましたので、正確な数字を教えていただければ幸いです。

ありがとう。

4

4 に答える 4

6

私は(複雑さが増す順に)わかります:

  • 8加算(減算を含む)
  • 3回の掛け算
  • 1逆数平方根

これらが互いにどのように関連するかは、CPUファミリに大きく依存します。

于 2011-03-16T19:34:15.400 に答える
5

中間アセンブリコードを取得するか、exeを逆コンパイルしてみてください。

次に、すべての浮動小数点演算をカウントします(x86アセンブリコードでは、Fのようなプレフィックスで始まりますFSIN)。

于 2011-03-16T19:36:21.177 に答える
1

私は12とsqrt(ループであるニュートン法を使用している可能性が高い)を数えますが、それは指定しなかったいくつかの変数のデータ型とコンパイルの結果(さらに追加または最適化される可能性があります)に依存しますいくつかの操作)。

式に少なくとも1つの浮動小数点変数が含まれている場合、各+、/、-、または*をカウントしているため、配列インデックスとループ不変条件はカウントされません。これらは整数演算です。

于 2011-03-16T19:38:40.413 に答える
0

PAPIのようなパフォーマンス測定ライブラリを使用してみてください。これらは、FLOPSを測定するのに最適なハードウェアカウンタを抽象化します。PAPI_FLOPS。

于 2011-03-16T20:15:58.770 に答える