質問
これには本当に時間がかかります。次のコード(ループ)のフロップを推定する簡単な方法、ループの単一の反復のフロップの量が見つかりませんでした。
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。
所属していません StackOverflow