这是计算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上运行完全符合预期)。