陳苗
?
一種改進的CPU主頻精確測量方法
陳苗
(淮南師范學院 數(shù)學與計算科學系,安徽 淮南 232001)
CPU時鐘周期;CPU主頻;延時測量
在多媒體視頻傳輸控制和分布式系統(tǒng)中,不同系統(tǒng)之間進行數(shù)據(jù)傳輸時常會出現(xiàn)系統(tǒng)延時,對系統(tǒng)延時進行測量可以實現(xiàn)系統(tǒng)統(tǒng)一標準時鐘同步,提高傳輸質(zhì)量. 文獻[1]將時間同步精度劃分為5個等級:P1 (±1 ms)、P2 (±0.1 ms)、P3 (±25 μs)、P4(±4 μs)和P5 (±1 μs). 現(xiàn)有的時鐘同步方法可以分為內(nèi)同步和外同步兩大類. 對于外時間同步,系統(tǒng)的時鐘服務(wù)器每次從外部獲得時間,然后將時間信息發(fā)送給子節(jié)點,各節(jié)點根據(jù)獲得的時間信息以及信息延遲的估計對每個節(jié)點的時間重新設(shè)置. 對于內(nèi)時間同步,系統(tǒng)根據(jù)從各節(jié)點獲取的時間信息計算一個系統(tǒng)時間,然后各節(jié)點根據(jù)計算出的系統(tǒng)信息以及節(jié)點間的傳輸延遲調(diào)整本節(jié)點時間. 時鐘同步的目標就是使分布式系統(tǒng)中各節(jié)點的時間同步誤差盡可能小. 但是同步操作或者獲得同步時間都需要耗費大量的資源,不可能頻繁進行操作,通常的做法是每隔一定時間進行時鐘同步,在兩次同步期間,用本地的時間來估計同步時間[1]:
在分布式系統(tǒng)中,為了減小系統(tǒng)的同步誤差,需要獲得高精度的本地時間. 通常獲得本地高精度時間的做法是用CPU的時鐘周期數(shù)除以CPU主頻. 所謂CPU的時鐘周期數(shù),是指CPU內(nèi)部數(shù)字脈沖信號震蕩的次數(shù),測量CPU時鐘周期數(shù)的匯編程序?qū)崿F(xiàn)如下:
rdtsc
mov dword ptr [ebx],eax
mov dword ptr [ebx+4],edx
首先利用rdtsc指令讀取當前CPU的時鐘周期數(shù),返回值的高32位和低32位分別在edx和eax中,然后把它們放入變量中. 如果在程序中兩次讀取當前CPU的時鐘周期數(shù)并求得其差,除以主頻即可得時間差.
根據(jù)定義,主頻就是單位時間(比如1秒內(nèi))的時鐘周期數(shù),本文提出一種改進的CPU主頻測量方法,并實驗驗證方法可行.
目前,時間間隔測量的實現(xiàn)方法可以分為3類:
第1類用Sleep系統(tǒng)函數(shù)實現(xiàn)[2]. Sleep函數(shù)能夠精確到1 ms,但這只是一個延時的最小值,因此真正的延時很有可能超過這個最小值很多,從而帶來誤差.
第2類用QueryPerformanceFrequency系統(tǒng)函數(shù)實現(xiàn)[3]. QueryPerformanceFrequency函數(shù)可用來獲得機器內(nèi)部定時器的時鐘頻率,但該函數(shù)的返回結(jié)果會受到硬件頻率,特別是總線頻率的影響. 在某些CPU上,該函數(shù)返回的可能是CPU主頻[3],但很多情況下返回的結(jié)果精確度不夠.
第3類用GetLocalTime函數(shù)或者GetTickCount函數(shù)實現(xiàn)[3]. 但是這種方法測量得到的延遲仍然不夠精確,原因是該函數(shù)是基于系統(tǒng)時間的,系統(tǒng)時間存儲單元每隔一段時間才由系統(tǒng)中斷進行更新,其更新頻率與操作系統(tǒng)有關(guān)系,在Windows 2000和Windows XP中,每秒鐘更新分別為100次和64次,頻率較高,但此類函數(shù)的分辨率有限,兩端點的時間如果不是取正好在存儲單元得到更新的時刻讀到的時間,就有可能獲得偏差,當然,隨著時間尺度的拉大,這個影響會變小. 讀取的系統(tǒng)時間與實際時間的關(guān)系如圖1所示.
本文擬對第3種測量方法中存在的偏差進行改進,以提高測量的精確度. 改進的原理簡述為:將開始時間和結(jié)束時間都取在TickCount發(fā)生變化的一刻,使測量的時間間隔和實際的時間間隔盡可能地吻合,如圖2所示. 但是如何盡可能準確及時讀取時間是其中的難點,下文將進一步討論.
圖1 傳統(tǒng)的時間間隔測量方法
圖2 改進的時間間隔測量方法
圖3 GetTickCount API的反匯編結(jié)果截圖
圖4 本文算法實現(xiàn)原理
為了高精度地測量主頻,須消除測量時間段的不準確性,因此需要盡可能在時間存儲單元剛剛刷新的那一刻開始計時,本文的做法是不斷讀取系統(tǒng)時間存儲單元,一旦發(fā)現(xiàn)內(nèi)容被更新,馬上開始計時. 為此,我們反匯編了GetTickCount的代碼,從圖3可以看到,TickCount的值是存放在7FFE0000這個內(nèi)存單元,因此,只要不斷讀取此內(nèi)存單元的值并作比較即可.
對于Windows 2000和Windows XP,7FFE0004內(nèi)存單元的值分別為0A03AFB7H (=168013751D)和0FA00000H (=262144000D),所以可以得出GetTickCount的分辨率分別為168013751/2^24 = 10.0144 ms和262144000/2^24 = 15.625 ms,每秒更新的次數(shù)分別為99.856和100次. 實現(xiàn)原理如圖4所示,主頻測量程序流程圖如圖5所示.
圖5 CPU主頻測量的程序流程圖
為了驗證實驗數(shù)據(jù)的可靠性,文本對數(shù)臺機器進行了測量,從圖6可以看到,圖中間隔性地出現(xiàn)了劇烈波動的數(shù)據(jù)點,分析原因為讀取系統(tǒng)時間存儲單元的時候進程發(fā)生了切換,如果能夠排除進程切換的影響,測得的CPU主頻就會更加準確.
圖6 濾波前CPU的時鐘周期測試數(shù)據(jù)
圖7 經(jīng)濾波消除進程切換影響后CPU的時鐘周期測試數(shù)據(jù)
各型號CPU測量結(jié)果比較如表1所示.
表1 各型號CPU的測量結(jié)果
[1]JOHNNESSEN S. Time synchronization in a local area network[J]. IEEE Control Systems Magazine, 2004, 24(2): 61-69.
[2] 吳麗娜,高敬陽. Windows 2000/XP下通用實時采集的設(shè)計與實現(xiàn)[J]. 計算機應(yīng)用,2005, 25(2): 61-69.
[3] 冀榮華,祁力鈞,傅澤田. 基于Visual C++的精確定時技術(shù)與應(yīng)用[J]. 農(nóng)機化研究. 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—),女,山東菏澤人,助教,碩士,主要研究方向為計算機輔助幾何設(shè)計、圖形學、算法設(shè)計.