2016-04-16 7 views
1

Hier ist der Code zur Berechnung der CPU-Zeit, aber es ist nicht korrekt, denn wenn ich gettimeofday verwenden gibt es mir die richtige Zeit in ms. Ich führe meinen Prozess auf einem Prozessor und seine Uhr läuft mit 800 MHz. Mein Wissen über RDTSC ist wie folgt:Sekunden Berechnung mit Rdtsc

  • RDTSC gibt die Anzahl der Zyklen
  • diese Anzahl der Zyklen kann man die CPU-Zeit gegeben die Taktrate (800 MHz)

    unsigned long long a,b; 
    unsigned long cpuMask; 
    cpuMask = 2; // bind to cpu 1 
    if(!sched_setaffinity(0, sizeof(cpuMask), &cpuMask)) 
    fprintf(stderr,"Running on one core!\n"); 
    setpriority(PRIO_PROCESS, 0, 20); 
    struct timeval t1, t2; 
    double elapsedTime; 
    int i=0; 
    // start timer 
    gettimeofday(&t1, NULL);  
    a = rdtsc(); 
    sleep(20);  
    //for(;i<1000000;i++); 
         //fprintf(stderr,"%d\n",i); 
    gettimeofday(&t2, NULL); 
    b = rdtsc(); 
    printf("a:%llu\n", a); 
    printf("b:%llu\n", b); 
    double val = ((b-a)/800000);   
    fprintf(stderr,"Time 1st through rdtsc in msec:%f\n\nSubtraction:%llu\n\n", val,b-a); 
    elapsedTime = (t2.tv_sec - t1.tv_sec) * 1000.0;  // sec to ms 
    elapsedTime += (t2.tv_usec - t1.tv_usec)/1000.0; // us to ms 
    fprintf(stderr,"Time through gettimeofday in ms:%f\n\n", elapsedTime); 
    
berechnen

Antwort

1

Theoretisch gibt es keine Garantie, dass rdtsc eine starke Beziehung zu CPU-Zyklen haben würde, z 1 Zyklus kann 3 Rdtsc-Einheiten entsprechen. In der Praxis entspricht die rdtsc-Einheit (1 Sekunde/max_frequency_of_cpu) auf Intel-CPUs unter der Annahme, dass constant_tsc Feature vorhanden ist. Also, erste Frage ist: ist 800 MHz max Frequenz oder ist es aktuelle Frequenz?

Wie auch immer, clock_gettime(CLOCK_MONOTONIC_RAW, ...) ist wahrscheinlich, was Sie verwenden möchten. Mein Verständnis ist, dass es genau zum Zeitstempelzähler gemappt wird und mit Systemuhr kalibriert wird, wenn OS gestartet wird.

(Und ja, Ihr Code funktioniert genau wie erwartet auf meinem i7-3635QM).