Question

J'écris un code de micro-analyses comparatives pour certaines opérations très courtes en C. Par exemple, une chose que je mesure est combien de cycles sont nécessaires pour appeler une fonction vide en fonction du nombre d'arguments passés.

À l'heure actuelle, je suis synchronisation à l'aide d'une instruction RDTSC avant et après chaque opération pour obtenir le nombre de cycles de la CPU. Cependant, je crains que les instructions émises avant la première RDTSC peuvent ralentir les instructions réelles je mesure. Je suis aussi inquiet que l'opération complète peut ne pas être terminée avant la deuxième RDTSC obtient émis.

Quelqu'un sait-il d'une instruction x86 qui oblige toutes les instructions en vol pour commettre avant que de nouvelles instructions sont émises? On m'a dit que CPUID pourrait le faire, mais je suis incapable de trouver tous les documents qui le dit.

Était-ce utile?

La solution

A ma connaissance, il n'y a pas d'instruction qui spécifiquement « drains » le pipeline. Ceci peut être facilement accompli en utilisant si une instruction sérialisation.

CPUID est une instruction de sérialisation, ce qui signifie exactement ce que vous cherchez. Toutes les questions d'instruction avant qu'il ne soit garanti à exécuter avant l'instruction CPUID.

Ce faisant, les éléments suivants doivent obtenir l'effet désiré:

cpuid
rdtsc
# stuff
cpuid
rdtsc

Mais, en aparté, je ne recommande pas que vous faites cela. Vos « trucs » peut encore être fait par beaucoup d'autres choses en dehors de votre contrôle (comme les caches CPU, d'autres processus en cours d'exécution sur le système, etc.), et vous ne serez jamais en mesure de les éliminer tous. La meilleure façon d'obtenir des statistiques précises de performance est d'effectuer l'opération (s) que vous souhaitez mesurer au moins plusieurs millions de fois et en moyenne le temps d'exécution du lot.

Modifier La plupart des références d'instructions pour CPUID mentionneront ses propriétés sérialisation, comme le MSNA annexe B manuel .

Edit 2 : pouvez également jeter un oeil à cette question connexe.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top