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.

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top