2012-11-07 44 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之间呢?这绝对是灰色的。

相关问题