我知道无符号长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