Question
prend vraiment mon temps. Je ne pouvais pas trouver un moyen simple d'estimation FLOPS un code suivant (la boucle), Combien FLOPS sont pour une seule itération de la boucle:
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;
}
...
}
Il semble simple, mais je me suis confondu avec d'autres chiffres donnés plus tôt, donc ce serait bien si quelqu'un peut donner un nombre exact.
Merci.
La solution
Je vois (dans l'ordre de complexité croissante):
- 8 additions (inc. Soustractions)
- 3 multiplications
- 1 racine réciproque carré
Comment ceux-ci sont liées entre elles dépend fortement de la famille de CPU.
Autres conseils
essayer de prendre soit le code assembleur intermédiaire ou décompilation exe.
Comptez ensuite toutes les opérations à virgule flottante (en code assembleur x86, ils commencent par le préfixe de F
comme FSIN
).
Je compte 12 plus un sqrt (qui utilise probablement la méthode de Newton, qui est une boucle), mais cela dépend des types de données de certaines variables que vous ne spécifiez pas, et le résultat de la compilation (qui peut ajouter, ou optimiser certaines opérations).
Je compte chaque +, /, -., Ou * où l'expression contient au moins une variable à virgule flottante, de sorte que les indices de tableau et l'invariant de boucle ne comptent pas, et ceux qui sont des nombres entiers opérations
Essayez d'utiliser une bibliothèque de mesure du rendement comme PAPI, ils donnent des abstractions aux compteurs matériels qui seraient mieux votre mieux pour mesurer la FLOPS. PAPI_FLOPS.