Comment faire pour créer une haute résolution de la minuterie dans Linux pour mesurer le rendement du programme?
Je suis en train de comparer les GPU pour des performances de l'UC. Pour les GPU NVIDIA, j'ai été en utilisant le cudaEvent_t
types d'obtenir une synchronisation précise.
Pour le CPU j'ai été en utilisant le code suivant:
//Timers
clock_t start, stop;
float elapsedTime = 0;
//Capture the start time
start = clock();
//Do something here
.......
//Capture the stop time
stop = clock();
//Retrieve time elapsed in milliseconds
elapsedTime = (float)(stop - start) / (float)CLOCKS_PER_SEC * 1000.0f;
Apparemment, ce morceau de code n'est bon si vous faites le décompte en secondes. Aussi, les résultats parfois très étrange.
Personne ne sait de manière à créer une haute résolution de la minuterie dans Linux?
- Voir cette question: stackoverflow.com/questions/700392/...
Vous devez vous connecter pour publier un commentaire.
Découvrez
clock_gettime
, qui est une interface POSIX à haute résolution des chronomètres.Si, après avoir lu la page de manuel, vous êtes de gauche s'interrogent sur la différence entre
CLOCK_REALTIME
etCLOCK_MONOTONIC
, voir Différence entre CLOCK_REALTIME et CLOCK_MONOTONIC?Voir la page suivante pour un exemple complet: http://www.guyrutenberg.com/2007/09/22/profiling-code-using-clock_gettime/
CLOCK_REALTIME
etCLOCK_MONOTONIC
mais nous nous retrouvons avecCLOCK_PROCESS_CPUTIME_ID
dans l'exemple de code? Quelqu'un peut-il éclaircir ce point? Qu'est-ce aller?À résumer les informations présentées jusqu'à présent, ce sont les deux fonctions requises pour des applications typiques.
Voici un exemple de la façon de les utiliser dans le moment combien de temps il faut pour calculer la variance d'une liste d'entrée.
tv_sec
de latimespec
? Aussi, pourquoiCLOCK_PROCESS_CPUTIME_ID
plutôt queCLOCK_MONOTONIC
?grep constant_tsc /proc/cpuinfo
de comprendre comment cette horloge fonctionne. Si vous le CPU ne prend pas en charge constant_tsc, le temps de refléter les cycles d'horloge du CPU. Si l'indicateur est activé, l'horloge est ajustée pour tenir compte courant de la fréquence du PROCESSEUR. Je donne ce un -1 car time_elapsed_nanos est mal calculée. Ceci peut-être une meilleure approche.il est également CLOCK_REALTIME_HR, mais je ne suis pas sûr si cela fait une différence..
CLOCK_REALTIME_HR
est supporté. Question.Êtes-vous intéressé dans le mur du temps (combien de temps réellement écoulé) ou nombre de cycles (nombre de cycles)? Dans le premier cas, vous devez utiliser quelque chose comme
gettimeofday
.La résolution la plus élevée de la minuterie utilise le
RDTSC
x86 instructions de montage. Toutefois, ce dispositif tops d'horloge, de sorte que vous devez être sûr que le mode d'économie d'énergie est désactivé.La page du wiki pour TSC donne quelques exemples: http://en.wikipedia.org/wiki/Time_Stamp_Counter
rdtsc
corrélats 1:1 avec de l'horloge murale, pas de noyau de cycles d'horloge. Il n'a pas de pause lors de votre processus (ou de l'ensemble de la CPU) est le sommeil, et il fonctionne à fréquence constante, indépendamment de turbo / économie d'énergie. Utiliser les compteurs de performance pour mesurer âme cycles d'horloge. par exemple,perf stat awk 'BEGIN {for (i=0 ; i<10000000; i++){}}'
.Après la lecture de ce fil, j'ai commencé à tester le code pour clock_gettime contre c++11 du chrono et ils ne semblent pas correspondre.
Il y a un énorme fossé entre eux!
La std::chrono::secondes(1) semble être équivalent à ~30,000 de la clock_gettime
de sortie:
clock_gettime(2)
clock_gettime
est préférable, car il vous obtient nanosecondes.epoll mise en œuvre:
https://github.com/ielife/simple-timer-for-c-language
utiliser comme ceci: