2017-06-05 10 views
8

J'aime comparer time_point s de std::chrono::high_resolution_clock qui ont été mesurés dans les threads fonctionnant sur différents cœurs dans un processeur. Peut-il y avoir des différences significatives, comme des retards ou des horloges plus rapides/plus lentes? Qu'est-ce que la norme spécifie?Can Horloges de std :: chrono être différent sur différents cœurs

+0

compilateur? Malheureusement, la précision, la précision et la granularité ne sont pas uniformes (le compilateur, sa version et le processeur les affectent grandement). Comme vous pouvez l'imaginer le support matériel varie alors le standard ne peut pas être trop précis avec ses spécifications ici –

+0

Je compile avec GCC et Clang en utilisant C++ 14.Je cible les cpu Intel «modernes» – max

Répondre

3

Je vais répondre à cette spécifiquement en fonction de votre commentaire que vous exécutez ce sur une « moderne »Intel CPU.

Je vais également souligner que cela peut être une discussion très controversée car cela dépend beaucoup du CPU et de la carte mère. « Moderne » peut être un concept très fluide :)

Généralement parlant

Le « moderne » Intel CPU ont intégré quelques mécanismes pour assurer uniforme à travers les tiques noyaux. Cependant, il importe aussi quel système d'exploitation vous utilisez. Par exemple, certains noyaux Linux utiliseront le compteur d'horodatage comme source en raison de moins de frais généraux et retomberont sur la minuterie d'événement haute précision (moderne) qui tente de maintenir l'horloge uniforme à travers les cœurs. En outre, gardez à l'esprit que les processeurs Intel ont de nombreux utilitaires de consommation d'énergie qui peuvent affecter la fréquence d'horloge du processeur.

meilleur des cas Assomption

Je vérifier la CONSTANT_TSC drapeau dans le cadre du /proc/cpuinfo sur Linux car il peut alors supposer que le TSC fonctionne en fréquence fixe à travers des noyaux. Mais ... rappelez-vous les variations ci-dessus.

Il existe des événements d'état de la machine, tels que l'économie d'énergie et la mise en veille prolongée qui peuvent entraîner une modification de la fréquence d'horloge du processeur. Dans ce cas, un réétalonnage du TSC est requis et certains documents suggèrent que ce redémarrage est uniquement possible.

Recommandation:

cible un chipset spécifique et système d'exploitation et étudier la documentation spécifique. La plupart des familles d'OS auront des informations détaillées sur les spécificités de sa source d'horloge.

En fonction de vos exigences de précision de temps vous pouvez passer à utiliser

clock_gettime(CLOCK_MONOTONIC, ...); 
4

Les horloges std n'ont pas d'affinité de processeur, en fait, la plupart des threads ne le font pas non plus. Deux mesures d'horloge provenant du même fil pourraient bien avoir été faites sur différents noyaux.

En ce qui concerne l'avance et le retard associés aux mesures - cela ne serait pas différent de l'exécution de toute autre instruction; les pipelines habituels etc. peuvent avoir un impact, mais je ne le considérerais pas comme nuisible. Si cela peut être préjudiciable, vous devrez peut-être envisager d'autres outils pour le travail, tels que des outils de synchronisation de plate-forme spécialisés ou des instructions spécifiques à la CPU.