使用rdtsc计算秒数



这是计算CPU时间的代码,但它不正确,因为当我使用gettimeofday时,它会以毫秒为单位给出正确的时间。我在一个处理器上运行进程,其时钟运行在800MHz。我对rdtsc的了解如下:

  • Rdtsc返回循环数
  • 使用这些循环数,可以计算出给定时钟速率(800MHZ)的CPU时间

    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,"%dn",i);
    gettimeofday(&t2, NULL);
    b = rdtsc();
    printf("a:%llun", a);
    printf("b:%llun", b);
    double val = ((b-a)/800000);        
    fprintf(stderr,"Time 1st through rdtsc in msec:%fnnSubtraction:%llunn", 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:%fnn", elapsedTime);
    

理论上,不能保证rdtsc与CPU周期有很强的关系,例如1个周期可能等于3个rdtsc单元。在实践中,假定存在constant_tsc功能,则在英特尔cpu上,rdtsc单位等于(1秒/max_frequency_of_cpu)。所以,第一个问题是:800MHz是最大频率还是当前的频率?

无论如何,clock_gettime(CLOCK_MONOTONIC_RAW, ...)是您最可能想要使用的。我的理解是,它被精确地映射到时间戳计数器,并在OS启动时使用系统时钟进行校准。

(是的,您的代码在我的i7-3635QM上运行完全符合预期)。

相关内容

  • 没有找到相关文章

最新更新