小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

多核時代不宜再用 x86 的 RDTSC 指令測試指令周期和時間

 青松卓然 2012-08-27

多核時代不宜再用 x86 的 RDTSC 指令測試指令周期和時間

分類: 雜感 c++ 7249人閱讀 評論(11) 收藏 舉報

多核時代不宜再用 x86 的 RDTSC 指令測試指令周期和時間 

陳碩
Blog.csdn.net/Solstice

 

自從 Intel Pentium 加入 RDTSC 指令以來,這條指令是 micro-benchmarking 的利器,可以以極小的代價獲得高精度的 CPU 時鐘周期數(shù)(Time Stamp Counter),不少介紹優(yōu)化的文章[1]和書籍用它來比較兩段代碼的快慢。甚至有的代碼用 RDTSC 指令來計時,以替換 gettimeofday() 之類的系統(tǒng)調(diào)用。在多核時代,RDTSC 指令的準確度大大削弱了,原因有三: 

  1. 不能保證同一塊主板上每個核的 TSC 是同步的;
  2. CPU 的時鐘頻率可能變化,例如筆記本電腦的節(jié)能功能;
  3. 亂序執(zhí)行導致 RDTSC 測得的周期數(shù)不準,這個問題從 Pentium Pro 時代就存在。 

這些都影響了 RDTSC 的兩大用途,micro-benchmarking 和計時。 

RDTSC 一般的用法是,先后執(zhí)行兩次,記下兩個 64-bit 整數(shù) start 和 end,那么 end-start 代表了這期間 CPU 的時鐘周期數(shù)。 

在多核下,這兩次執(zhí)行可能會在兩個 CPU 上發(fā)生,而這兩個 CPU 的計數(shù)器的初值不一定相同(由于完成上電復位的準確時機不同),(有辦法同步,見[3]),那么就導致 micro-benchmarking 的結果包含了這個誤差,這個誤差可正可負,取決于先執(zhí)行的那塊 CPU 的時鐘計數(shù)器是超前還是落后。 

另外,對于計時這個用途,時間 = 周期數(shù) / 頻率,由于頻率可能會變(比如我的筆記本的 CPU 通常半速運行在 800MHz,繁忙的時候全速運行在 1.6GHz),那么測得的時間也就不準確了。有的新 CPU 的 RDTSC 計數(shù)頻率是恒定的,那么時鐘是準了,那又會導致 micro-benchmarking 的結果不準,見 [2]。還有一個可能是掉電之后恢復(比如休眠),那么 TSC 會清零。 總之,用 RDTSC 來計時是不靈的。 

亂序執(zhí)行這個問題比較簡單 [1],但意義深遠:在現(xiàn)代 CPU 的復雜架構下,測量幾條或幾十條指令的耗時是無意義的,因為觀測本身會干擾 CPU 的執(zhí)行(cache, 流水線, 多發(fā)射,亂序, 猜測),這聽上去有點像量子力學系統(tǒng)了。要么我們以更宏觀的指標來標示性能,把"花 xxx 個時鐘周期"替換"每秒處理 yyy 條消息"或"消息處理的延時為 zzz 毫秒";要么用專門的 profiler 來減小對觀測結果的影響(無論是 callgrind 這種虛擬 CPU,還是 OProfile 這種采樣器)。 

雖然 RDTSC 廢掉了,性能測試用的高精度計時還是有辦法的 [2],在 Windows 用 QueryPerformanceCounter 和 QueryPerformanceFrequency,Linux 下用 POSIX 的 clock_gettime 函數(shù),以 CLOCK_MONOTONIC 參數(shù)調(diào)用?;蛘甙次墨I [3] 的辦法,先同步 TSC, 再使用它。(我不知道現(xiàn)在最新的 Linux 官方內(nèi)核是不是內(nèi)置了這個同步算法。也不清楚校準后的兩個 CPU 的“鐘”會不會再次失步。) 

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

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

查看評論
9樓 year1987 2011-10-30 11:14發(fā)表 [回復]
亂序和不同步的時鐘使rdtsc不準,多線程時每個線程不會讀到同樣的時間
8樓 wangzhen11aaa 2011-10-07 14:40發(fā)表 [回復]
static unsigned long long calibrate_tsc(void)
{
unsigned long startlow, starthigh;
unsigned long endlow, endhigh;

rdtsc(startlow,starthigh);
sleep_latch();
rdtsc(endlow,endhigh);

/* 64-bit subtract - gcc just messes up with long longs */
__asm__("subl %2,%0\n\t"
"sbbl %3,%1" /*一個是sbbl是二進制減法,subl是BCD碼減法?難道儲存方式變了?
:"=a" (endlow), "=d" (endhigh)
:"g" (startlow), "g" (starthigh),
"0" (endlow), "1" (endhigh));

/* Error: ECPUTOOFAST */
if (endhigh)
goto bad_ctc;

endlow *= TICKS_PER_LATCH; /*是乘的這個數(shù)據(jù)吧,這個數(shù)的意義是什么*/
return endlow;

/*
* The CTC wasn't reliable: we got a hit on the very first read,
* or the CPU was so fast/slow that the quotient wouldn't fit in
* 32 bits..
*/
bad_ctc:
printf("bad_ctc\n");
return 0;
}
7樓 arice1983 2010-08-25 15:36發(fā)表 [回復]
是不是單核的環(huán)境下用RDTSC取的時間就一定是準的呢?

我現(xiàn)在遇到一個問題,就是我的程序在運行中,系統(tǒng)時間有可能會被服務器改掉,這個過程中計時就會有問題。

調(diào)查了許多,本來覺得用RDTSC可以解決,可是看了博主的文章,感覺RDTSC又有問題了,不知道有什么別的解決方法……[e08]
6樓 匿名用戶 2010-05-02 16:01發(fā)表 [回復]
恩,先SetThreadAffinityMask
5樓 匿名用戶 2010-01-20 09:41發(fā)表 [回復]
QueryPerformanceFrequency QueryPerformanceFrequency
直接用同樣是有問題的,要先指定CPU
Re: cxjddd 2010-02-24 16:37發(fā)表 [回復]
回復 匿名用戶:QueryPerformanceCounter() 錯誤的情況我們也碰見過,用 SetThreadAffinityMask() 解決。
4樓 匿名用戶 2010-01-20 09:18發(fā)表 [回復]
QueryPerformanceFrequency
在早期的主板上,還是用的RDTSC來實現(xiàn)的.我就很不幸使用QueryPerformanceFrequency得到過負數(shù),導致程序直接死循環(huán).找了我一個星期.因為當時就某個用戶的機器存在這樣的問題,其他機器都好。
3樓 deping_chen 2010-01-19 13:59發(fā)表 [回復]
誠如博主所言,我在使用中也發(fā)現(xiàn)了rdstc的不準確問題。而從前是準確的。
2樓 匿名用戶 2010-01-19 10:08發(fā)表 [回復]
但是這些替代方法都要切換到內(nèi)核態(tài),代價太大了。
不適合頻繁調(diào)用。
1樓 suanyuan 2010-01-16 04:09發(fā)表 [回復]
對於會變頻的 CPU QueryPerformanceFrequency 傳回的數(shù)值都一樣嗎?如果是一樣,那數(shù)值正確嗎?
Re: Solstice 2010-01-16 11:36發(fā)表 [回復]
回復 suanyuan:
那個 Frequency 不是 CPU 的主頻,而是主板上一個高精度時鐘的頻率,這個時鐘頻率的典型值是 10MHz 左右,比 CPU 主頻低得多。主板上這個時鐘是穩(wěn)定的(物理因素導致的漂移除外),不隨 CPU 主頻變化而變化。當然主板型號不同,頻率可能有所不同,我沒有全面測試。

    本站是提供個人知識管理的網(wǎng)絡存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權內(nèi)容,請點擊一鍵舉報。
    轉藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多