多核时代不宜再用 x86 的 RDTSC 指令测试指令周期和时间 Options

转载 2012年03月19日 11:07:11
多核时代不宜再用 x86 的 RDTSC 指令测试指令周期和时间

陈硕
Blog.csdn.net/Solstice

自从 Intel Pentium 加入 RDTSC 指令以来,这条指令是 micro-benchmarking 的利器,可以以极小的代价获得高精度的 CPU 时钟周期数(Time Stamp Counter),不少介绍优化的文章[1]和书籍用它来比较两段代码的快慢。甚至有的代码用 RDTSC 指令来计时,以替换 gettimeofday() 之类的系统调用。在多核时代,RDTSC 指令的准确度大大削弱了,原因有三:

  1.. 不能保证同一块主板上每个核的 TSC 是同步的;
  2.. CPU 的时钟频率可能变化,例如笔记本电脑的节能功能;
  3.. 乱序执行导致 RDTSC 测得的周期数不准,这个问题从 Pentium Pro 时代就存在。
这些都影响了 RDTSC 的两大用途,micro-benchmarking 和计时。

RDTSC 一般的用法是,先后执行两次,记下两个 64-bit 整数 start 和 end,那么 end-start 代表了这期间 CPU 的时钟周期数。

在多核下,这两次执行可能会在两个 CPU 上发生,而这两个 CPU 的计数器的初值不一定相同(由于完成上电复位的准确时机不同),(有办法同步,见[3]),那么就导致 micro-benchmarking 的结果包含了这个误差,这个误差可正可负,取决于先执行的那块 CPU 的时钟计数器是超前还是落后。

另外,对于计时这个用途,时间 = 周期数 / 频率,由于频率可能会变(比如我的笔记本的 CPU 通常半速运行在 800MHz,繁忙的时候全速运行在 1.6GHz),那么测得的时间也就不准确了。有的新 CPU 的 RDTSC 计数频率是恒定的,那么时钟是准了,那又会导致 micro-benchmarking 的结果不准,见 [2]。还有一个可能是掉电之后恢复(比如休眠),那么 TSC 会清零。 总之,用 RDTSC 来计时是不灵的。

乱序执行这个问题比较简单 [1],但意义深远:在现代 CPU 的复杂架构下,测量几条或几十条指令的耗时是无意义的,因为观测本身会干扰 CPU 的执行(cache, 流水线, 多发射,乱序, 猜测),这听上去有点像量子力学系统了。要么我们以更宏观的指标来标示性能,把"花 xxx 个时钟周期"替换"每秒处理 yyy 条消息"或"消息处理的延时为 zzz 毫秒";要么用专门的 profiler 来减小对观测结果的影响(无论是 callgrind 这种虚拟 CPU,还是 OProfile 这种采样器)。

虽然 RDTSC 废掉了,性能测试用的高精度计时还是有办法的 [2],在 Windows 用 QueryPerformanceCounter 和 QueryPerformanceFrequency,Linux 下用 POSIX 的 clock_gettime 函数,以 CLOCK_MONOTONIC 参数调用。或者按文献 [3] 的办法,先同步 TSC,再使用它。(我不知道现在最新的 Linux 官方内核是不是内置了这个同步算法。也不清楚校准后的两个 CPU 的“钟”会不会再次失步。)

[1] http://www.ccsl.carleton.ca/~jamuir/rdtscpm1.pdf
[2] http://en.wikipedia.org/wiki/Time_Stamp_Counter

[3] x86: unify/rewrite SMP TSC sync code http://lwn.net/Articles/211051/



计算机组成原理:时钟周期、机器周期和指令周期

时钟周期:一个时钟脉冲所需要的时间。在计算机组成原理中又叫T周期或节拍脉冲。是CPU和其他单片机的基本时间单位。它可以表示为时钟晶振频率(1秒钟的时钟脉冲数)的倒数(也就是1s/时钟脉冲数,比如1/1...
  • billbonaparte1
  • billbonaparte1
  • 2016年05月02日 17:16
  • 4236

时钟周期,机器周期,指令周期的区别

时钟周期          时钟周期也称为振荡周期,定义为时钟脉冲的倒数(时钟周期就是单片机外接晶振的倒数,例如12M的晶振,它的时钟周期就是1/12us),是计算机中的最基本的、最小的时间单位。  ...
  • lishuhuakai
  • lishuhuakai
  • 2013年05月19日 00:44
  • 28971

处理器一条指令需要几个时钟周期?

思考个小问题,处理器执行一条指令需要几个时钟周期。 对于软件工程师来说,印象流我们可能会觉得执行一条指令一个时钟周期嘛,一条指令算是一个最小的原子操作,不可能再细分了吧。 如果看看诸如《see m...
  • skyflying2012
  • skyflying2012
  • 2016年03月30日 19:47
  • 7611

多核时代不宜再用 x86 的 RDTSC 指令测试指令周期和时间

多核时代不宜再用 x86 的 RDTSC 指令测试指令周期和时间   陈硕 Blog.csdn.net/Solstice   自从 Intel Pentium 加入 RDTS...
  • wh8_2011
  • wh8_2011
  • 2016年10月29日 17:13
  • 493

多核时代不宜再用x86的RDTSC指令测试指令周期和时间

自从 Intel Pentium 加入 RDTSC 指令以来,这条指令是 micro-benchmarking 的利器,可以以极小的代价获得高精度的 CPU 时钟周期数(Time Stamp Coun...
  • u011388550
  • u011388550
  • 2014年05月03日 17:13
  • 410

8051、ARM和DSP指令周期的测试与分析

  • 2008年06月24日 14:56
  • 207KB
  • 下载

8051_ARM和DSP指令周期的测试与分析

  • 2011年01月07日 15:31
  • 976KB
  • 下载

8051、ARM和DSP指令周期的测试与分析

本文对三种最具代表性的微控制器(AT89S51单片机、7TDMI核的LPC2114型单片机和TMS320F2812)的指令周期进行了分析和。为了能观察到指令周期,将三种控制器的GPIO口设置为数字输出...
  • David_xtd
  • David_xtd
  • 2013年06月05日 17:45
  • 2930

单片机指令周期入门教程

  • 2009年04月18日 07:51
  • 112KB
  • 下载

在ZSTACK中使用延时函数注意(附机器时钟指令周期)

关于Z-stack的延时,稍微总结几点使用中可能需要注意的地方: 1 同样的代码,裸机实验和在Z-stack中延时的时间可能是不一样的。 2 请注意CC2530是加强型的51单片机 3  在Z-st...
  • geek_monkey
  • geek_monkey
  • 2016年08月10日 14:54
  • 2929
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:多核时代不宜再用 x86 的 RDTSC 指令测试指令周期和时间 Options
举报原因:
原因补充:

(最多只允许输入30个字)