如何计算rdtsc指令执行所需的时钟周期数?

时间:2012-11-07 01:54:41

标签: assembly intel cpu-registers rdtsc

我知道无符号长long存储在eax / edx中,但我想知道如何找出执行单个rdtsc指令需要多少个时钟周期?

编辑:这样的事情有用吗?

.globl rdtsc

RDTSC:

RDTSC

movl%eax,%ecx

movl%edx,%ebx

RDTSC

subl%ecx,%eax

subl%ebx,%edx

保留

2 个答案:

答案 0 :(得分:1)

您可以重复执行rdtsc,并查看连续返回值之间的差异。当然,你需要记住诸如上下文切换等事情,这将导致大量的峰值。

请参阅rdtsc, too many cycles进行讨论。

答案 1 :(得分: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 overhead”的实际运行时间。

如果减去了rdtsc开销,则需要考虑流水线操作以及重叠处理是否已完成。对我来说,我认为如果定时序列运行的时间少于30个周期,则可能需要考虑未完成的流水线问题。如果序列需要超过100个循环,则可能会出现问题,但可能会被忽略。

那么30到100之间呢?这绝对是灰色的。