Linux 使用rdtsc计算秒数

Linux 使用rdtsc计算秒数,linux,gettimeofday,rdtsc,Linux,Gettimeofday,Rdtsc,下面是计算CPU时间的代码,但它不正确,因为当我使用gettimeofday时,它给了我正确的时间(毫秒)。我在一个处理器上运行进程,它的时钟运行在800MHz。我对rdtsc的了解如下: Rdtsc返回循环数 使用这些周期可以计算给定时钟频率(800 MHZ)的CPU时间 无符号长a、b; 无符号长cpuMask; cpuMask=2;//绑定到cpu 1 if(!sched_setaffinity(0,sizeof(cpuMask),&cpuMask)) fprintf(stderr,“在

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

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

    无符号长a、b;
    无符号长cpuMask;
    cpuMask=2;//绑定到cpu 1
    if(!sched_setaffinity(0,sizeof(cpuMask),&cpuMask))
    fprintf(stderr,“在一个内核上运行!\n”);
    设置优先级(优先级进程,0,20);
    结构时间值t1,t2;
    双延时;
    int i=0;
    //启动计时器
    gettimeofday(&t1,NULL);
    a=rdtsc();
    睡眠(20);
    
    //对于(;i,理论上,不能保证
    rdtsc
    与CPU周期有很强的关系,例如,1个周期可能等于3个rdtsc单位。实际上,rdtsc单位等于(1秒/CPU的最大频率)在英特尔CPU上,假设存在
    常量\u tsc
    功能。那么,第一个问题是:800MHz是最大频率还是当前频率

    无论如何,
    clock\u gettime(clock\u MONOTONIC\u RAW,…)
    是您最想使用的。我的理解是,它精确地映射到时间戳计数器,并在引导操作系统时使用系统时钟进行校准

    (是的,您的代码在我的i7-3635QM上完全按照预期工作)

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