Negative clock-cycle-Messungen mit back-to-back rdtsc?

Schreibe ich ein C-code für die Messung der Anzahl von Taktzyklen benötigt, ist der Erwerb einer semaphore. Ich bin mit rdtsc und vor der Messung auf die semaphore, ich nenne rdtsc zwei mal hintereinander zu Messen, der overhead. Ich wiederhole, das viele Male, in einer for-Schleife, und dann benutze ich den Mittelwert als rdtsc overhead.

Ist dies zu korrigieren, verwenden Sie den Mittelwert, erste von allen?

Dennoch, das große problem hier ist, dass manchmal bekomme ich negative Werte für den Aufwand (nicht unbedingt der Durchschnitt,aber-zumindest teilweise-innerhalb der for-Schleife).

Dies wirkt sich auch auf die aufeinander folgende Berechnung der Anzahl der cpu-Zyklen benötigt für die sem_wait() operation, die manchmal stellt sich auch heraus, negativ zu sein. Wenn das, was ich geschrieben habe, ist nicht klar, hier gibt ' s ein Teil von dem code, den ich auf Arbeit bin.

Warum bin ich immer so negative Werte?


(Anmerkung der Redaktion: siehe Get CPU-Zyklus zählen? für eine korrekte und portable Weg, um die volle 64-bit-Zeitstempel. Ein "=A" asm-Einschränkung wird nur das low-oder high 32 bits, die bei der Kompilierung für x86-64, je nachdem, ob register allocation passiert zu Holen RAX oder RDX für die uint64_t Ausgabe. Es wird nicht pick edx:eax.)

(editor 2. Hinweis: Hoppla, das ist die Antwort, warum wir immer negative Ergebnisse. Noch lohnt sich verlassen eine Notiz hier als eine Warnung, nicht zu kopieren, diese rdtsc Umsetzung.)


#include <semaphore.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <inttypes.h>

static inline uint64_t get_cycles()
{
  uint64_t t;
           //editor's note: "=A" is unsafe for this in x86-64
  __asm volatile ("rdtsc" : "=A"(t));
  return t;
}

int num_measures = 10;

int main ()
{
   int i, value, res1, res2;
   uint64_t c1, c2;
   int tsccost, tot, a;

   tot=0;    

   for(i=0; i<num_measures; i++)
   {    
      c1 = get_cycles();
      c2 = get_cycles();

      tsccost=(int)(c2-c1);


      if(tsccost<0)
      {
         printf("####  ERROR!!!   ");
         printf("rdtsc took %d clock cycles\n", tsccost);
         return 1;
      }   
      tot = tot+tsccost;
   }

   tsccost=tot/num_measures;
   printf("rdtsc takes on average: %d clock cycles\n", tsccost);      

   return EXIT_SUCCESS;
}

InformationsquelleAutor der Frage Discipulus | 2013-11-12

Schreibe einen Kommentar