2

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

  • Rdtsc 返回周期数
  • 使用这些周期数,可以计算给定时钟速率(800 MHZ)的 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,"%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);
    
4

1 回答 1

1

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

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

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

于 2016-04-16T16:18:36.980 回答