2015-08-05 5 views
1

Y at-il une instruction x86 pour obtenir l'heure actuelle? Fondamentalement ... quelque chose comme un remplacement pour clock_get_time ... quelque chose avec le minimum de frais généraux ... où je ne me soucie pas vraiment d'obtenir l'heure dans un format spécifique ... tant que c'est un format que je peut utiliser. Fondamentalement, je suis en train de faire un peu de "Détection du temps de vie réel physique" et je veux être en mesure de mesurer le temps aussi souvent que possible!Instruction pour obtenir l'heure actuelle sur x86

Je suppose que vous pouvez imaginer que je fais quelque chose comme une application de profilage ... :)

J'ai vraiment besoin d'un accès efficace agressivement au temps du matériel. Donc idéalement ... de l'ASM pour avoir le temps ... de le stocker quelque part ... puis de le masser plus tard dans un format que je peux réellement traiter.

Je ne suis pas intéressé par _rdtsc comme qui mesure le nombre de cycles passés. Je dois savoir combien de temps physique a exécuté ... non cycles qui peuvent varier en fonction des fluctations thermiques ou si ..

Répondre

1

Pour le profilage, il est souvent plus utile au profil en termes de cycles d'horloge du processeur, plutôt que mur- temps d'horloge. La synchronisation dynamique de la CPU (turbo et économie d'énergie) rend désagréable l'accélération du processeur jusqu'à la pleine vitesse avant le début d'une période de mesure.

Si vous avez besoin de temps encore l'horloge murale après:

récents processeurs x86 ont un TSC qui fonctionne à un taux fixe, quel que soit le réglage de la fréquence du processeur pour-économie d'énergie. En outre, le TSC ne s'arrête pas lorsque le processeur est arrêté. (c.-à-d. pas de travail à faire, donc il a couru l'instruction HLT pour attendre une interruption en mode basse consommation.)

Il s'est avéré que l'accès efficace à une source de temps utile était plus utile à avoir dans le matériel qu'un compteur de cycle d'horloge réelle, de sorte que RDTSC est transformé en quelques générations de CPU après son introduction. Nous revenons maintenant à l'utilisation de compteurs de performance matérielle pour mesurer les cycles d'horloge.

Sous Linux, recherchez constant_tsc et nonstop_tsc dans les indicateurs de caractéristiques de la CPU dans /proc/cpuinfo. IDK s'il y a CPUID bits pour ceux-ci. Si non, utilisez le code de Linux (si vous pouvez utiliser le code GPL).

Sur une CPU avec ces deux caractéristiques clés, Linux utilise le TSC comme clocksource, IIRC.

La méthode la plus basse pour obtenir l'heure actuelle dans l'espace utilisateur sera de calculer la conversion entre RDTSC et le temps réel. Lors du profilage, vous pouvez stocker des snapshots TSC 64 bits et les convertir en temps réel plus tard. (Donc, vous pouvez gérer TSC wraparound alors). RDTSC prend seulement environ 24 cycles (tableau d'instructions Agner Fog, Intel Haswell). Je pense que la surcharge d'un appel système sera d'un ordre de grandeur plus élevé que cela. (Le noyau devra faire un RDTSC là quelque part de toute façon).

Agner Fog a documented his profiling/timing methods, et a quelques exemples de code. Je n'ai pas regardé récemment, mais il pourrait avoir des choses utiles pour cette application.

+0

Merci beaucoup exactement le genre de réponse que je voulais! Je me demande cependant ... par curiosité ... comment les gens parviennent-ils à trouver le nombre de cycles CPU maintenant que RDTSC retourne l'heure physique? – boytheo

+0

@boytheo: Avec 'perf stat./Myprog'. '-e cycles' fait partie de la sortie par défaut.En outre, je pense que la vitesse d'horloge 'rdtsc' correspond à la fréquence non-turbo" nominale "sur les processeurs Intel. –