2012-11-07 47 views
0

我知道無符號長long存儲在eax/edx中,但我想知道如何找出執行單個rdtsc指令需要多少個時鐘週期?如何計算rdtsc指令執行需要多少個時鐘週期?

編輯:做這樣的工作嗎?

.globl RDTSC

RDTSC:

RDTSC

MOVL%eax中,%ecx中

MOVL%EDX,%EBX

RDTSC

subl%ecx中,%eax

subl%EBX,EDX%

RET

+0

如果這對你來說是個問題,那麼你不能正確地對你的代碼進行基準測試。您需要運行足夠的迭代,以便'rdtsc()'的開銷可以忽略不計。 – Mysticial

+0

'rdtsc'的開銷已經被測量。見http://instlatx64.atw.hu/ – harold

回答

1

您可以執行rdtsc反覆,並期待在連續的返回值之間的差異。當然,你需要記住諸如上下文切換等事情,這將導致巨大的峯值。

請參閱rdtsc, too many cycles進行討論。

+0

做這樣的工作嗎?編輯:對不起,我只是把它放在主帖 – user1769152

+0

我會''sbbl%ebx,%edx'從第一'subl'拿起進位/借位(如果有的話)。 –

+0

實際上這兩個命令永遠不會花費2^32或更多的週期來完成。只有使用eax才能輕鬆計算差異。這也避免了沒有進位/借位的減法錯誤。 –

1

雖然您應該多次運行並使用最短的值,但您的代碼看起來正確。

我認爲這個問題應該重申:在代碼序列期間使用rdtsc來計算流逝的時鐘週期的開銷是多少。所以計數代碼基本上是(32位爲例):

rdtsc 
mov dword ptr [mem64],eax 
mov dword ptr [mem64+4],edx 

; the code sequence to clock would go here when you're clocking it 

rdtsc 
sub eax,dword ptr [mem64] 
sbb edx,dword ptr [mem64+4] ; I always mix up sbb and sub so this may be incorrect 

,結果是「RDTSC開銷」的實際經過時間的定時的碼序列時。

當您減去rdtsc開銷時,您需要考慮流水線並且重疊處理是否已完成。對我來說,我假設如果定時序列運行的時間少於30個週期,則可能會有未完成的流水線問題需要考慮。如果序列需要超過100個循環,則可能會出現問題,但可能會被忽略。

那麼30到100之間呢?這絕對是灰色的。

相關問題