Linux 使用rdtsc计算秒数
下面是计算CPU时间的代码,但它不正确,因为当我使用gettimeofday时,它给了我正确的时间(毫秒)。我在一个处理器上运行进程,它的时钟运行在800MHz。我对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,“在
- 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,理论上,不能保证
与CPU周期有很强的关系,例如,1个周期可能等于3个rdtsc单位。实际上,rdtsc单位等于(1秒/CPU的最大频率)在英特尔CPU上,假设存在rdtsc
功能。那么,第一个问题是:800MHz是最大频率还是当前频率 无论如何,常量\u tsc
是您最想使用的。我的理解是,它精确地映射到时间戳计数器,并在引导操作系统时使用系统时钟进行校准 (是的,您的代码在我的i7-3635QM上完全按照预期工作)clock\u gettime(clock\u MONOTONIC\u RAW,…)
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);