直接来自Intel,这里是关于最近处理器如何维护一个以恒定速率跳动的TSC(时间戳计数器)的解释,这个TSC在多核和多插槽主板上的包之间保持同步,甚至在处理器进入深度睡眠C状态时仍然可能继续跳动。具体解释请参见Vipin Kumar E K (Intel)的解释。
http://software.intel.com/en-us/articles/best-timing-function-for-measuring-ipp-api-timing/
这里有一篇英特尔的参考文献,讨论了如何在多个核心之间同步时间戳计数器(TSC),其中提到rdtscp指令可以原子地读取TSC和处理器ID,这对于追踪应用程序非常重要...假设您想要追踪可能从一个核心迁移到另一个核心的线程的执行情况,如果您使用两个单独的指令(非原子性)进行操作,则无法确定线程在读取时所在的核心。
http://software.intel.com/en-us/articles/intel-gpa-tip-cannot-sychronize-cpu-timestamps/
主板上的所有插槽/封装都接收两个外部公共信号:
- RESET
- 参考时钟
当您启动主板时,所有插槽同时看到RESET。所有处理器封装从外部晶体振荡器接收参考时钟信号,并且处理器内部时钟与称为锁相环(PLL)的电路保持同步(尽管通常具有高倍增器,例如25x)。最近的处理器将以处理器额定的最高频率(倍增器)时钟TSC(所谓的恒定TSC),而不管任何单个核心由于温度或功率管理节流而使用的倍增器(所谓的不变TSC)。像2008年发布的X5570这样的Nehalem处理器(以及更新的英特尔处理器)支持“Non-stop TSC”,即使在深度电源关闭C状态(C6)中节能时也会继续计时。有关不同电源关闭状态的更多信息,请参见此链接:
http://www.anandtech.com/show/2199
经进一步调查,我发现英特尔于2009年12月22日申请并在2011年6月23日公布的一项专利,标题为“控制多个核心和线程的时间戳计数器(TSC)偏移量”。
http://www.freepatentsonline.com/y2011/0154090.html
谷歌的专利申请页面(包含链接到美国专利商标局页面)。
http://www.google.com/patents/US20110154090
根据我的了解,在uncore中有一个TSC(围绕核心的包装逻辑,但不是任何核心的一部分),其值在每个外部总线时钟上由Vipin Kumar在上面链接中指定的机器特定寄存器字段中的值递增(MSR_PLATFORM_INFO[15:8])。外部总线时钟运行在133.33MHz。此外,每个核心都有自己的TSC寄存器,由所有核心共享的时钟域驱动,并且可能与任何一个核心的时钟不同 - 因此,在核心中运行RDTSC(或RDTSCP)指令读取核心TSC时必须有某种缓冲区。例如,MSR_PLATFORM_INFO[15:8]可以设置为25,对于每个总线时钟,uncore TSC递增25,有一个PLL将总线时钟乘以25并提供此时钟给每个核心以时钟其本地TSC寄存器,从而保持所有TSC寄存器同步。因此,要将术语映射到实际硬件。
- 常数TSC是通过使用外部总线时钟运行在133.33 MHz,该时钟乘以MSR_PLATFORM_INFO [15:8]中指定的常数乘数来实现的。
- 不变TSC是通过将每个核心上的TSC保持在单独的时钟域中来实现的。
- 非停TSC是通过具有未核心TSC来实现的,每次总线时钟增加MSR_PLATFORM_INFO [15:8]个滴答声,这样多核包可以进入深度电源关闭(C6状态)并可以关闭PLL……没有必要保持时钟在更高的倍频器。当一个核心从C6状态恢复时,它的内部TSC将被初始化为uncore TSC的值(未休眠的那个),如果软件写入了TSC的值,则会进行偏移调整,其详细信息在专利中解释。如果软件确实写入TSC,则该核心的TSC将与其他核心不同步,但具有恒定的偏移量(TSC时钟的频率都由常数乘数与总线参考时钟相结合)。
rdtsc()
内置函数。 - Crashworks