Fonctionnement du fetch CPU TSC, en particulier dans un environnement multi-processeur multicore

dans le monde Linux, pour obtenir nano secondes minuteur de précision / horloges on peut utiliser:

#include <sys/time.h>

int foo()
{
   timespec ts;

   clock_gettime(CLOCK_REALTIME, &ts); 
   //--snip--      
}

Cette réponse suggère une asm approche d'interroger directement par le processeur de l'horloge avec le RDTSC de l'enseignement.

dans une architecture multi-core, multi-processeurs, comment cette valeur de pointage/minuterie est-elle synchronisée entre plusieurs cœurs/processeurs? Ma compréhension est qu'il n'y en inhérente barrières faire. Est-ce la compréhension correcte?

pouvez-vous suggérer une documentation qui expliquerait cela en détail? Je m'intéresse aux microarchitectures Intel Nehalem et Sandy Bridge.

MODIFIER

limiter le processus à un seul noyau ou cpu n'est pas une option car le processus est vraiment énorme(en termes de ressources consommées) et voudrait utiliser de manière optimale toutes les ressources dans la machine qui comprend tous les cœurs et les transformateurs.

Modifier

Merci pour la confirmation que le TSC est synchronisé à travers les cœurs et les processeurs. Mais ma question initiale est de savoir comment se fait cette synchronisation ? est-il avec une sorte d'escrime ? savez-vous de tout document public ?

Conclusion

Merci pour toutes les contributions: Voici la conclusion pour ce discussion: les TSCs sont synchronisés lors de l'initialisation à l'aide d'une réinitialisation qui se produit à travers les cœurs et les processeurs dans un système multi-processeur/multi-noyau. Et après ça, chaque noyau est sur son propre. Les TSCs sont maintenus invariants avec une boucle de phase verrouillée qui normaliserait les variations de fréquence et donc les variations d'horloge dans un noyau donné et c'est ainsi que le TSC reste synchronisé entre les cœurs et les processeurs.

13
demandé sur Community 2012-06-06 23:53:57

4 réponses

sur les nouveaux CPU (i7 Nehalem+ IIRC) le TSC est synchronisé à travers tous les noyaux et fonctionne à une vitesse constante. Ainsi pour un seul processeur, ou plus d'un processeur sur un seul package ou mainboard(!) vous pouvez compter sur un TSC synchronisé.

du manuel du système Intel 16.12.1

le compteur d'horodatage dans les nouveaux processeurs peut supporter une amélioration, appelé invariant TSC. Le soutien de processeurs pour TSC invariant est indiqué par CPUID.80000007H: EDX[8]. L'invariant TSC s'exécute à taux constant dans tous les ACPI P -, C -. et T-unis. C'est le le comportement architectural va de l'avant.

sur les processeurs plus anciens, vous ne pouvez pas compter sur la vitesse constante ou la synchronisation.

Edit: au moins sur les processeurs multiples d'un paquet ou d'une carte principale, l'invariant TSC est synchronisé. Le TSC est réinitialisé à zéro à A / RESET puis coche en avant à un vitesse constante sur chaque processeur, sans dérive. Le signal / RESET est garanti pour arriver à chaque processeur en même temps.

14
répondu Gunther Piez 2012-06-08 07:15:52

directement D'Intel, voici une explication de la façon dont les processeurs récents maintiennent un TSC qui tourne à une vitesse constante, est synchrone entre les cœurs et les paquets sur une carte mère multi-socket, et peut même continuer à Tic-Tac lorsque le processeur entre dans un État C de sommeil profond, en particulier voir l'explication de Vipin Kumar E K (Intel):

http://software.intel.com/en-us/articles/best-timing-function-for-measuring-ipp-api-timing /

Voici une autre référence D'Intel discutant de la synchronisation du TSC entre les cœurs, dans ce cas, ils mentionnent le fait que rdtscp vous permet de lire à la fois le TSC et l'id du processeur atomiquement, c'est important dans le traçage des applications... supposons que vous voulez tracer l'exécution d'un thread qui pourraient migrer d'un coeur à un autre, si vous le faites dans deux instructions distinctes (non-atomique), alors vous n'avez pas la certitude de base que le fil était à l' le temps de la lecture de l'horloge.

http://software.intel.com/en-us/articles/intel-gpa-tip-cannot-sychronize-cpu-timestamps /

toutes les douilles / paquets d'une carte-mère reçoivent deux signaux externes communs:

  1. RESET
  2. horloge de référence

toutes les sockets voir réinitialisation en même temps lorsque vous alimentez la carte mère, tous les paquets de processeur recevoir un signal d'horloge de référence d'un oscillateur à cristal externe et les horloges internes dans le processeur sont maintenus en phase (bien que généralement avec un multiplicateur élevé, comme 25x) avec des circuits appelés boucle de phase verrouillée (PLL). Les processeurs récents vont pointer le TSC à la fréquence la plus élevée (multiplicateur) que le processeur est évalué (appelé TSC constant), quel que soit le multiplicateur que n'importe quel noyau peut utiliser en raison de la température ou de la gestion de puissance étrangler (appelé invariant TSC.) Les processeurs Nehalem comme le X5570 sorti en 2008 (et les nouveaux processeurs Intel) prennent en charge un "TSC non-stop" qui continuera à tourner même en conservant la puissance dans un État-C (C6) profond. Voir ce lien pour plus d'informations sur les différents éteindre les états:

http://www.anandtech.com/show/2199

après d'autres recherches, je suis tombé sur un brevet Intel déposé le 22/12/2009 et a été publié le 23/06/2011 intitulée "le Contrôle de Time Stamp Counter (TSC) les Compensations Pour de Multiples Cœurs Et Fils"

http://www.freepatentsonline.com/y2011/0154090.html

page Google pour cette demande de brevet (avec lien vers la page USPTO)

http://www.google.com/patents/US20110154090

D'après ce que j'ai compris il y a un TSC dans l'uncore (la logique dans un paquet entourant les noyaux mais pas une partie d'un noyau) qui est incrémenté sur chaque horloge de bus externe par la valeur dans le champ du Registre spécifique de la machine spécifié par Vipin Kumar dans le lien ci-dessus (MSR_PLATFORM_INFO[15:8]). L'Horloge extérieure du bus tourne à 133,33 MHz. En outre, chaque noyau possède son propre registre TSC, enregistré par un domaine d'horloge qui est partagé par tous les noyaux et peut être différent de l'horloge pour n'importe quel noyau - par conséquent, il doit y avoir une sorte de tampon lorsque le TSC du noyau est lu par le RDTSC (ou RDTSCP) instruction tournant dans un noyau. Par exemple, MSR_PLATFORM_INFO[15:8] peut être réglé à 25 sur un paquet, chaque horloge de bus les incréments TSC uncore par 25, Il y a une PLL qui multiplie l'horloge de bus par 25 et fournit cette horloge à chacun des noyaux pour chronométrer leur registre TSC local, gardant ainsi tous les registres TSC en synchronisation. Ainsi, pour faire correspondre la terminologie au matériel réel

  • constante TSC est mis en œuvre en utilisant l'horloge bus externe fonctionnant à 133,33 MHz qui est multiplié par un multiplicateur constant spécifié dans MSR_PLATFORM_INFO[15:8]
  • TSC Invariant est mis en œuvre en gardant le TSC dans chaque noyau sur un domaine d'horloge séparé
  • Non-stop TSC est mis en œuvre en ayant un UNCORE TSC qui est incrémenté par MSR_PLATFORM_INFO[15:8] tics sur chaque horloge de bus, de cette façon un paquet multi-core peut entrer dans deep power down (État C6) et peut arrêter le PLL... il n'est pas nécessaire de garder une horloge à l' plus le multiplicateur. Lorsqu'un noyau est repris à partir de L'État C6, son TSC interne sera initialisé à la valeur du TSC uncore (celui qui ne s'est pas endormi) avec un ajustement de décalage au cas où le logiciel aurait écrit une valeur au TSC, dont les détails se trouvent dans le brevet. Si le logiciel écrit au TSC alors le TSC pour ce noyau sera déphasé avec d'autres noyaux, mais à un décalage constant (la fréquence des horloges TSC sont toutes liées à l'horloge de référence du bus par une constante multiplicateur.)
22
répondu amdn 2012-06-16 21:06:45

RTDSC n'est pas synchronisé entre les Processeurs. Ainsi, vous ne pouvez pas compter sur elle dans un systèmes multi-processeurs. La seule solution que je puisse imaginer pour Linux serait de restreindre le processus à un seul CPU en définissant son affinité. Cela peut être fait extérieurement en utilisant taskset utilitaire ou "interne" en utilisant sched_setaffinity ou pthread_setaffinity_np fonctions.

5
répondu 2012-06-06 20:11:30

ce manuel , chapitre 17.12, décrit L'invariant TSC utilisé dans les processeurs les plus récents. Disponible avec Nehalem ce horodatage, avec l'instruction rtscp, permet de lire un horodatage (non affecté par les États d'attente, etc) et une signature de processeur dans une opération atomique.

on dit qu'il convient pour calculer l'Heure de l'horloge murale, mais il est évident qu'il ne s'attend pas à ce que la valeur soit la même pour tous les processeurs. L'déclaré idée est-ce que vous pouvez voir si les lectures successives sont à la même horloge CPU, ou pour ajuster pour plusieurs lectures CPU. "Il peut également être utilisé pour ajuster les différences par CPU dans les valeurs TSC dans un système NUMA."

Voir aussi rdtsc précision sur les cœurs de processeurs

cependant, je ne suis pas sûr que la conclusion finale de cohérence dans la réponse acceptée découle de l'énoncé que le tsc peut être utilisé pour l'Heure de l'horloge murale. Si elle était cohérente, ce raison y aurait-il pour atomiquement la détermination de la CPU de la source du temps.

N.B. les informations TSC sont passées du chapitre 11 au chapitre 17 du manuel Intel.

5
répondu John S Gruber 2017-05-23 12:01:02