使用 rdtsc 计算秒数

Posted

技术标签:

【中文标题】使用 rdtsc 计算秒数【英文标题】:Seconds calculation using rdtsc 【发布时间】:2016-04-16 11:13:35 【问题描述】:

这是计算 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);

【问题讨论】:

【参考方案1】:

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

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

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

【讨论】:

以上是关于使用 rdtsc 计算秒数的主要内容,如果未能解决你的问题,请参考以下文章

动态监控 rdtsc 的性能

Linux上采用rdtsc指令对C/C++程序进行性能测试

Linux上采用rdtsc指令对C/C++程序进行性能测试

使用 Oracle SQL 仅计算原始秒数

如何计算秒数然后在条件中使用它们?

VisualStudio 2010 Express 上的 RDTSC - C++ 不支持默认整数