2016-04-16 7 views
1

Вот код для вычисления времени процессора, но это неверно, потому что когда я использую gettimeofday, он дает мне правильное время в мс. Я запускаю свой процесс на одном процессоре, а его часы работают на частоте 800 МГц. Мои знания о RDTSC выглядит следующим образом:Секундомер с использованием rdtsc

  • RDTSC возвращает число циклов
  • Используя эти # циклов можно вычислить время центрального процессора с учетом тактовой частоты (800 МГц)

    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); 
    

ответ

1

В теории нет гарантии, что rdtsc будет иметь сильное отношение к циклам ЦП, например 1 может составлять 3 единицы rdtsc. На практике единица rdtsc равна (1 секунда/max_frequency_of_cpu) на процессорах Intel, если присутствует функция constant_tsc. Итак, первый вопрос: есть 800 МГц max частота или это текущий частота?

В любом случае, clock_gettime(CLOCK_MONOTONIC_RAW, ...) - это то, что, скорее всего, вы хотите использовать. Я понимаю, что он точно привязан к счетчику timestamp и откалиброван с системными часами при загрузке ОС.

(И да, ваш код работает точно так, как ожидалось, на моем i7-3635QM).

 Смежные вопросы

  • Нет связанных вопросов^_^