2010-07-15 22 views
6

Je veux écrire un tas d'optimisations pour gcc en utilisant des algorithmes génétiques. J'ai besoin de mesurer le temps d'exécution d'une fonction d'assemblage pour certaines statistiques et fonctions d'ajustement. La mesure de temps habituelle ne peut pas être utilisée car elle est influencée par la taille de la mémoire cache.
J'ai donc besoin d'une table où je peux voir quelque chose comme ça.Comment mesurer les temps d'exécution des commandes d'assemblage x86 et x86-64 dans les cycles du processeur?

command | operands | operands sizes | execution cycles 

Est-ce que je ne comprends pas quelque chose? Désolé pour le mauvais anglais.

+0

Votre anglais va bien. J'ai juste un reproche: je ne sais pas si le jour viendra où les gens qui cherchent une accélération de quelques pourcents via la micro optimisation comprendront aussi la valeur d'obtenir de nombreux facteurs d'accélération par macro-optimisation, ce que les compilateurs ne peuvent pas faire. –

+0

Copie possible de [Combien de cycles CPU sont nécessaires pour chaque instruction d'assemblage?] (Http://stackoverflow.com/questions/692718/how-many-cpu-cycles-are-needed-for-each-assembly-instruction) –

Répondre

2

Avec CPU moderne, il n'y a pas de tables simples pour rechercher combien de temps une instruction prendra pour compléter (bien que ces tableaux existent pour certains anciens processeurs, par exemple 486). Votre meilleure information sur ce que chaque instruction fait et combien de temps cela peut prendre vient du fabricant de la puce. Par exemple. Intel's documentation manuals sont assez bons (il y a aussi un manuel d'optimisation sur cette page).

Sur pratiquement tous les processeurs modernes, il y a aussi l'instruction RDTSC qui lit le compteur d'horodatage pour le processeur sur lequel le code est exécuté dans EDX:EAX. Il y a des pièges avec ceci aussi, mais essentiellement si le code que vous profilez est représentatif d'une situation d'utilisation réelle, son exécution n'est pas interrompue ou déplacée vers un autre noyau de CPU, alors vous pouvez utiliser cette instruction pour obtenir les timings désirés. C'est à dire. entourez le code que vous optimisez avec deux instructions RDTSC et prenez la différence dans TSC comme timing. (Les écarts sur les minutages dans différents tests/situations peuvent être importants, les statistiques sont vos amis.)

1

Vous pouvez instrumenter votre code en utilisant l'assemblage (rdtsc et vos amis) ou en utilisant une API d'instrumentation telle que PAPI. Il n'est cependant pas possible de mesurer avec précision les cycles d'horloge qui ont été passés pendant l'exécution d'une instruction. Vous pouvez vous référer aux manuels de votre développeur d'architecture pour obtenir les meilleures estimations. Dans les deux cas, vous devez faire attention en prenant en compte les effets de l'exécution sur un environnement SMP.