时间戳计时器

本文介绍了时间戳计时器(TSC)在x86处理器中的工作原理,它是从Pentium处理器开始的一个64位计数器。文章通过分析CSAPP Lab_Performance中的CPE计数实现,展示了如何使用汇编指令rdtsc和rdtscp测量程序执行时间。同时,讨论了GCC中对64位数值的支持以及__rdtsc intrinsic的使用,提供了一种更现代的实现方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

时间戳计时器

之前在做CSAPP:Lab_Performance的时候,查看代码遇到这个问题。查阅资料之后,整理、记录一下。

时间戳计时器 Time Stamp Counter(TSC)是自Pentium之后所有的x86处理器都有的一个64位寄存器。它对自上次重设之后的cycles的数量计数。指令RDSTC将TSC返回到串联寄存器组EDX:EAX中(即低32位保存在EAX中,高32位保存在EDX中)。在x86-64机器中,RDSTC还会将RAXRDX高32位清空。它的操作码是0F 31。(以上定义,引用自(WIKIPEDIA)[https://en.wikipedia.org/wiki/Time_Stamp_Counter])

最近在查看CSAPP 对应的performance-lab的实现的时候,看到了clock.c中对于CPE计数的实现。它使用了汇编代码使用rdstc指令,来获取时间戳计时器的内容,然后对前后两次求差得到程序运行的CPE,另外由于该程序编写的年代比较久远,当时可能gcc对于64位数值还不支持,因此它使用了两个32位无符号整数ncyc_lo, ncyc_hi来分别存储rdstc指令返回的低32位和高32位,然后将结果保存在double类型result变量中。

另外,我在stack overflow中查看到还有另外一个版本使用的是rdstcp指令,在这里记录一下(stack overflow)[https://stackoverflow.com/questions/36666993/measuring-program-execution-time-with-cycle-counters],rdstcp其他特性和rdstc指令是一致的,除了会将ECX寄存器设置为0以外,所以那个版本的实现可能会导致一些意想不到的错误。

/* perf-lab clock.c*/
#if IS_x86
/* $begin x86cyclecounter */
/* Initialize the cycle counter */
static unsigned cyc_hi = 0;
static unsigned cyc_lo = 0;


/* Set *hi and *lo to the high and low order bits  of the cycle counter.  
   Implementation requires assembly code to use the rdtsc instruction. */
void access_counter(unsigned *hi, unsigned</
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值