我知道无符号长long存储在eax / edx中,但我想知道如何找出执行单个rdtsc指令需要多少个时钟周期?
编辑:这样的事情有用吗?
.globl rdtsc
RDTSC:
RDTSC
movl%eax,%ecx
movl%edx,%ebx
RDTSC
subl%ecx,%eax
subl%ebx,%edx
保留
答案 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之间呢?这绝对是灰色的。