一种改进的CPU主频精确测量方法
2012-07-16陈苗
陈苗
一种改进的CPU主频精确测量方法
陈苗
(淮南师范学院 数学与计算科学系,安徽 淮南 232001)
CPU时钟周期;CPU主频;延时测量
在多媒体视频传输控制和分布式系统中,不同系统之间进行数据传输时常会出现系统延时,对系统延时进行测量可以实现系统统一标准时钟同步,提高传输质量. 文献[1]将时间同步精度划分为5个等级:P1 (±1 ms)、P2 (±0.1 ms)、P3 (±25 μs)、P4(±4 μs)和P5 (±1 μs). 现有的时钟同步方法可以分为内同步和外同步两大类. 对于外时间同步,系统的时钟服务器每次从外部获得时间,然后将时间信息发送给子节点,各节点根据获得的时间信息以及信息延迟的估计对每个节点的时间重新设置. 对于内时间同步,系统根据从各节点获取的时间信息计算一个系统时间,然后各节点根据计算出的系统信息以及节点间的传输延迟调整本节点时间. 时钟同步的目标就是使分布式系统中各节点的时间同步误差尽可能小. 但是同步操作或者获得同步时间都需要耗费大量的资源,不可能频繁进行操作,通常的做法是每隔一定时间进行时钟同步,在两次同步期间,用本地的时间来估计同步时间[1]:
在分布式系统中,为了减小系统的同步误差,需要获得高精度的本地时间. 通常获得本地高精度时间的做法是用CPU的时钟周期数除以CPU主频. 所谓CPU的时钟周期数,是指CPU内部数字脉冲信号震荡的次数,测量CPU时钟周期数的汇编程序实现如下:
rdtsc
mov dword ptr [ebx],eax
mov dword ptr [ebx+4],edx
首先利用rdtsc指令读取当前CPU的时钟周期数,返回值的高32位和低32位分别在edx和eax中,然后把它们放入变量中. 如果在程序中两次读取当前CPU的时钟周期数并求得其差,除以主频即可得时间差.
根据定义,主频就是单位时间(比如1秒内)的时钟周期数,本文提出一种改进的CPU主频测量方法,并实验验证方法可行.
1 时间间隔测量的现有实现方法
目前,时间间隔测量的实现方法可以分为3类:
第1类用Sleep系统函数实现[2]. Sleep函数能够精确到1 ms,但这只是一个延时的最小值,因此真正的延时很有可能超过这个最小值很多,从而带来误差.
第2类用QueryPerformanceFrequency系统函数实现[3]. QueryPerformanceFrequency函数可用来获得机器内部定时器的时钟频率,但该函数的返回结果会受到硬件频率,特别是总线频率的影响. 在某些CPU上,该函数返回的可能是CPU主频[3],但很多情况下返回的结果精确度不够.
第3类用GetLocalTime函数或者GetTickCount函数实现[3]. 但是这种方法测量得到的延迟仍然不够精确,原因是该函数是基于系统时间的,系统时间存储单元每隔一段时间才由系统中断进行更新,其更新频率与操作系统有关系,在Windows 2000和Windows XP中,每秒钟更新分别为100次和64次,频率较高,但此类函数的分辨率有限,两端点的时间如果不是取正好在存储单元得到更新的时刻读到的时间,就有可能获得偏差,当然,随着时间尺度的拉大,这个影响会变小. 读取的系统时间与实际时间的关系如图1所示.
2 改进的高精度主频测量算法
本文拟对第3种测量方法中存在的偏差进行改进,以提高测量的精确度. 改进的原理简述为:将开始时间和结束时间都取在TickCount发生变化的一刻,使测量的时间间隔和实际的时间间隔尽可能地吻合,如图2所示. 但是如何尽可能准确及时读取时间是其中的难点,下文将进一步讨论.
图1 传统的时间间隔测量方法
图2 改进的时间间隔测量方法
图3 GetTickCount API的反汇编结果截图
图4 本文算法实现原理
2.1 延时的测量
为了高精度地测量主频,须消除测量时间段的不准确性,因此需要尽可能在时间存储单元刚刚刷新的那一刻开始计时,本文的做法是不断读取系统时间存储单元,一旦发现内容被更新,马上开始计时. 为此,我们反汇编了GetTickCount的代码,从图3可以看到,TickCount的值是存放在7FFE0000这个内存单元,因此,只要不断读取此内存单元的值并作比较即可.
对于Windows 2000和Windows XP,7FFE0004内存单元的值分别为0A03AFB7H (=168013751D)和0FA00000H (=262144000D),所以可以得出GetTickCount的分辨率分别为168013751/2^24 = 10.0144 ms和262144000/2^24 = 15.625 ms,每秒更新的次数分别为99.856和100次. 实现原理如图4所示,主频测量程序流程图如图5所示.
图5 CPU主频测量的程序流程图
为了验证实验数据的可靠性,文本对数台机器进行了测量,从图6可以看到,图中间隔性地出现了剧烈波动的数据点,分析原因为读取系统时间存储单元的时候进程发生了切换,如果能够排除进程切换的影响,测得的CPU主频就会更加准确.
图6 滤波前CPU的时钟周期测试数据
2.2 进程切换影响的消除
图7 经滤波消除进程切换影响后CPU的时钟周期测试数据
3 实验结果和结论
各型号CPU测量结果比较如表1所示.
表1 各型号CPU的测量结果
[1]JOHNNESSEN S. Time synchronization in a local area network[J]. IEEE Control Systems Magazine, 2004, 24(2): 61-69.
[2] 吴丽娜,高敬阳. Windows 2000/XP下通用实时采集的设计与实现[J]. 计算机应用,2005, 25(2): 61-69.
[3] 冀荣华,祁力钧,傅泽田. 基于Visual C++的精确定时技术与应用[J]. 农机化研究. 2007(5): 191-193.
An Improved Accurate Measurement for CPU Frequencies
CHENMiao
(Department of Mathematics and Computational Science, Huainan Normal University, Huainan 232001, China)
CPU cycles; CPU frequency; delay measurement
1006-7302(2012)03-0062-05
TP301.6
A
2012-05-02
安徽高校省级自然科学研究项目资助(KJ2011Z346,KJ2011Z357)
陈苗(1981—),女,山东菏泽人,助教,硕士,主要研究方向为计算机辅助几何设计、图形学、算法设计.