我知道無符號長long存儲在eax/edx中,但我想知道如何找出執行單個rdtsc指令需要多少個時鐘週期?如何計算rdtsc指令執行需要多少個時鐘週期?
編輯:做這樣的工作嗎?
.globl RDTSC
RDTSC:
RDTSC
MOVL%eax中,%ecx中
MOVL%EDX,%EBX
RDTSC
subl%ecx中,%eax
subl%EBX,EDX%
RET
我知道無符號長long存儲在eax/edx中,但我想知道如何找出執行單個rdtsc指令需要多少個時鐘週期?如何計算rdtsc指令執行需要多少個時鐘週期?
編輯:做這樣的工作嗎?
.globl RDTSC
RDTSC:
RDTSC
MOVL%eax中,%ecx中
MOVL%EDX,%EBX
RDTSC
subl%ecx中,%eax
subl%EBX,EDX%
RET
您可以執行rdtsc
反覆,並期待在連續的返回值之間的差異。當然,你需要記住諸如上下文切換等事情,這將導致巨大的峯值。
請參閱rdtsc, too many cycles進行討論。
做這樣的工作嗎?編輯:對不起,我只是把它放在主帖 – user1769152
我會''sbbl%ebx,%edx'從第一'subl'拿起進位/借位(如果有的話)。 –
實際上這兩個命令永遠不會花費2^32或更多的週期來完成。只有使用eax才能輕鬆計算差異。這也避免了沒有進位/借位的減法錯誤。 –
雖然您應該多次運行並使用最短的值,但您的代碼看起來正確。
我認爲這個問題應該重申:在代碼序列期間使用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之間呢?這絕對是灰色的。
如果這對你來說是個問題,那麼你不能正確地對你的代碼進行基準測試。您需要運行足夠的迭代,以便'rdtsc()'的開銷可以忽略不計。 – Mysticial
'rdtsc'的開銷已經被測量。見http://instlatx64.atw.hu/ – harold