質問

これには本当に時間がかかります。次のコード(ループ)のフロップを推定する簡単な方法、ループの単一の反復のフロップの量が見つかりませんでした。

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;
    }
    ...
}

シンプルに見えますが、以前に与えられた他の数字と混同されたので、誰かが正確な数字を与えることができれば素晴らしいでしょう。

ありがとう。

役に立ちましたか?

解決

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

  • 8つの追加(INC。減算)
  • 3乗算
  • 1逆二乗ルート

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

他のヒント

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

次に、すべてのフローティングポイント操作をカウントします(から始めるx86アセンブリコードで F プレフィックスのような FSIN).

私は12をカウントします。SQRT(これはおそらくニュートンのメソッドを使用していますが、ループです)ですが、それはあなたが指定しなかったいくつかの変数のデータ型と、コンパイルの結果(さらに追加するか、最適化するかもしれない)に依存しますいくつかの操作)。

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

Papiのようなパフォーマンス測定ライブラリを使用してみてください。フロップを測定するのに最適なハードウェアカウンターに抽象化を与えます。 papi_flops。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top