我知道无符号的long存储在eax/edx中,但我想知道如何才能知道执行一条rdtsc指令需要多少个时钟周期?
编辑:像这样的东西可以工作吗?
.globl rdtsc
rdtsc:
rdtsc
移动%eax,%ecx
移动%edx,%ebx
rdtsc
子目录%ecx,%eax
子集%ebx,%edx
ret
发布于 2012-11-07 09:57:49
您可以重复执行rdtsc,并查看连续返回值之间的差异。当然,你需要记住像上下文切换之类的东西,这会导致大量的峰值。
有关讨论,请参阅rdtsc, too many cycles。
发布于 2012-12-09 03:11:22
您的代码看起来是正确的,但是您应该多次运行它,并使用出现的最短的值。
我认为应该重申这个问题:在代码序列期间使用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之间呢?绝对是灰色的。
https://stackoverflow.com/questions/13262203
复制相似问题