2015-11-13 2 views
1

J'écris un programme C qui fait une multiplication matricielle 50x50.Pourquoi perf affiche-t-il moins d'événements à virgule flottante que prévu?

Je l'ai compilé à l'assemblage et je vois qu'il a au moins 2 instructions à virgule flottante (mulsd et addsd) dans la boucle la plus interne. La boucle est exécutée 125000 fois, donc je m'attendais à perf stat pour me donner au moins 250000 opérations en virgule flottante comptées.

Cependant quand j'exécutez la commande suivante,

perf stat -e r530110 -e r531010 -e r532010 -e r534010 -e r538010 ./matmul 

Je ne reçois les chefs d'accusation suivants

  448 r530110              
      0 r531010              
      0 r532010              
      0 r534010              
<not counted> r538010     

    0.001082287 seconds time elapsed 

Mon compilateur ne produit pas d'instructions SSE de sorte que les autres zéro comptages sont attendus. Cependant, j'ai seulement 448 opérations en virgule flottante.

Que se passe-t-il?

+0

Veuillez produire un exemple minimal et donnez-nous le code d'assemblage. Si vous le faites, vous répondrez probablement à votre propre question. –

+0

Également rendre les titres plus précis: qu'est-ce qui est «suspect»? :-) J'ai essayé de l'éditer pour l'améliorer. –

Répondre

2

Je l'ai compris. J'ai mal compris: mulsd et addsd sont en fait des instructions SSE. La statistique r530110 (FP_COMPS_OPS_EXE: X87) ne compte pas mulsd ou addsd. J'ai besoin de regarder r538010 (FP_COMPS_OPS: SSE_SCALAR_DOUBLE).

Ma conjecture pour la raison pour laquelle c'était <not counted> dans mon programme était parce que le programme s'est terminé trop rapidement. Lorsque j'ai augmenté la taille de la matrice (de sorte que le programme s'exécute plus longtemps), le nombre d'événements à virgule flottante est correct.