8
votes

Qu'est-ce qui compte comme un flop?

dire que j'ai un programme C que dans pseudoisish est: xxx

est le nombre de flops pour cela (1 [x ++] + 1 [x * 5] + 1 [2+ (2+ ( x + 5))] * 10 [boucle], pour 30 tongs? J'ai du mal à comprendre ce qu'est un flop.

Note Les [...] indiquent où je reçois mes comptes pour "Opérations" de.


4 commentaires

Nitpick: Flops est FL Point d'ovation O Perations P ER S ECOND, une mesure de la performance. Le flop est FL Point d'ovation OP . Les tongs (minuscules) sont le pluriel de flop.


Vous ne mentionnez pas de types de variables. Si tous sont des intemplaires, il s'agit de 0 et des tongs.


Les flops sont spécifiques aux opérations ponctuelles flottantes. Peut-être que vous êtes intéressé par des "cycles" (nombre de tiques qu'il prend la CPU pour effectuer certaines tâches)?


@Quixoto: et les cycles n'ont aucune relation directe avec le nombre d'instructions dans le code compilé.


5 Réponses :


7
votes

Les flops représentent des opérations flottantes par seconde. Si vous avez affaire à des entiers, vous n'avez aucune opération de point flottante dans votre code.


1 commentaires

Il semble que l'auteur sache ce que signifie les flops et ne veut que demander quelles opérations sont incluses dans la définition.



1
votes

est x un entier ou une variable à virgule flottante? Si c'est un entier, votre boucle peut ne pas contenir de tongs.


0 commentaires

3
votes

Les affiches ont précisé que les flops (détaillés ici ) sont concernés par un point flottant (par opposition aux entiers) Opérations par seconde , vous devez donc non seulement compter combien d'opérations que vous effectuez, mais en quelle période de temps.

Si "x" et "A" sont des flotteurs, vous faites une bonne tentative pour compter le nombre d'opérations dans votre code, mais vous devez vérifier le code d'objet pour vous assurer de quelle quantité d'instructions de points flottants sont effectivement utilisés. Par exemple, si "A" n'est pas utilisé ultérieurement, un compilateur d'optimisation pourrait ne pas être dérangé pour le calculer.

En outre, certaines opérations flottantes (telles que l'ajout) pourraient être beaucoup plus rapides que d'autres (telles que la multiplication), une boucle de seuls ajouts de flotteur pourrait fonctionner à de nombreuses autres tops qu'une boucle de float se multiplie sur la même machine.


0 commentaires

10
votes

Aux fins des mesures de flops, mais seulement des ajouts et des multiplications sont inclus. Des choses comme les divisions, les réciproques, les racines carrées et les fonctions transcendantaux sont trop chères pour inclure comme une seule opération, tandis que des choses comme des charges et des magasins sont trop triviales.

En d'autres termes, votre corps de boucle contient 2 ajouts et 1 multiplier, donc (en supposant que x est un point flottant) chaque itération de la boucle est de 3 ops; Si vous exécutez la boucle 10 fois, vous avez fait 30 ops.

Notez que lorsque vous mesurez MIPS, votre boucle serait plus de 3 instructions car elle comprend également des charges et des magasins que la mesure des flops ne compte pas.


0 commentaires

3
votes

flops (les minuscules indiquent le pluriel de flop, le commentaire de Martinho Fernandes) fait référence à des instructions de point flottant en langage de la machine, cela dépend de la manière dont votre code compile votre code.

Tout d'abord, si tous ces Les variables sont des entiers, alors il n'y a pas de flops dans ce code. Supposons cependant que votre langue reconnaît toutes ces constantes et variables en tant que variables à virgule flottante à une précision unique (utilisant une seule précision permet de charger les constantes plus facilement).

Ce code pourrait compiler à (sur MIPS). : xxx

Donc, selon la définition de GABE, il y a 4 tongs à l'intérieur de la boucle (3x add.s et 1x mul.s < / code>). Il y a 5 tongs si vous comptez également la comparaison de boucle c.gt . Multipliez ceci par 10 pour un total de 40 (ou 50) flops utilisées par le programme.

Un meilleur compilateur d'optimisation peut reconnaître que la valeur du A n'est pas utilisée à l'intérieur du boucle, il suffit donc de calculer la valeur finale de A . Il pourrait générer du code qui ressemble à xxx

dans ce cas, vous avez 2 ajouts et 1 comparaison à l'intérieur de la boucle (Mutiplied par 10 vous donne 20 ou 30 tongs), plus 1 multiplication et 1 ajout en dehors de la boucle. Ainsi, votre programme prend maintenant 22 ou 32 tongs selon que nous comptons des comparaisons.


2 commentaires

Je dirais que c'est presque universellement le cas que lorsqu'une boucle ressemble à pour i = 0 à 10 , i est un entier et le corps de boucle fonctionne 11 fois.


Vrai. Ceci est pour la démonstration. Mon point est que c'est à la hauteur de comprendre la sémantique de sa langue et comment son compilateur génère un assemblée, s'il va compter des flops. Peu importe la fictivesse mon interprétation de sa langue.