Frage
Das nimmt mir wirklich Zeit. Ich konnte keine einfache Möglichkeit finden, Flops für einen folgenden Code (die Schleife) abzuschätzen.
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;
}
...
}
Es sieht einfach aus, aber ich wurde mit einigen anderen Zahlen verwechselt, also wäre es großartig, wenn jemand eine genaue Nummer geben kann.
Vielen Dank.
Lösung
Ich sehe (in der Reihenfolge der zunehmenden Komplexität):
- 8 Ergänzungen (Inc. Subtraktionen)
- 3 Multiplikationen
- 1 wechselseitige Quadratwurzel
Wie sich diese miteinander beziehen, hängt stark von der CPU -Familie ab.
Andere Tipps
Versuchen Sie, entweder Code für den Zwischenmontage zu nehmen oder exe zu dekompilen.
Zählen Sie dann alle schwimmenden Punktvorgänge (in X86 -Montagecode, mit dem sie beginnen F
Präfix wie FSIN
).
Ich zähle 12 plus eine SQRT (die wahrscheinlich Newtons Methode verwendet, die eine Schleife ist), aber das hängt von den Datentypen einiger Variablen ab, die Sie nicht angegeben haben einige Operationen).
Ich zähle jedes +, /, -oder *, wobei der Ausdruck mindestens eine schwimmende Punktvariable enthält, sodass Arrayindizes und die Schleifeninvariante nicht zählen, und dies sind ganzzahlige Operationen.
Versuchen Sie, eine Leistungsmessbibliothek wie Papi zu verwenden. Sie geben Hardware -Zähler Abstraktionen, die am besten am besten sind, um die Flops zu messen. Papi_flops.