2010-02-24 78 views
3

我想知道从哪里开始获取各种机器的CPU操作码周期数。什么我谈论可以在这个链接看到的一个例子:确定CPU的操作码周期数

http://www.obelisk.demon.co.uk/6502/reference.html

如果检查MAME源代码,尤其是在src \鸸鹋\ CPU,你会看到,大部分的CPU模型以类似的方式跟踪周期数。我的问题是,如何获取这些信息,或者在没有可用的情况下对其进行逆向工程?我从来没有见过任何'官方'ASM程序员指南包含循环计数信息。我最初的猜测是,一个小程序扔到了真正的硬件的bootrom的,如果它包含一个操作码相当于RDTSC,像这样做:

RDTSC 

//opcode of choosing 

RDTSC 

但你会怎么做,如果这种支持是不是可用?我知道对于较旧的硬件,MAME团队除了ROM和分散的文档之外不能访问任何内容。

回答

3

纵观奔腾,英特尔和AMD处理器(以及大多数竞争对手)都很容易找到循环次数。然而,从Pentium Pro和AMD K5开始,CPU进入了一种动态执行模式,在这种模式下,指令可以不按顺序执行。在这种情况下,执行指令所需的时间在很大程度上取决于它使用的数据,以及它是否取决于前一条指令的数据(在这种情况下,它必须等待指令完成才能执行执行)。

还有一些限制,比如每个周期可以解码多少条指令(例如,至少一条,只要它们“简单”就多加两条),每个周期可以退出多少条指令(通常约三条或四)。

因此,在现代CPU上,单独讨论给定指令的周期几乎是毫无意义的。有意义的结果需要一系列指令,所以你不仅要看这条指令,而且要看它前后的内容。一条指令流中的严重瓶颈指令在另一条指令流中可能基本上是免费的(例如,如果您有一个乘法器混入了大量的加法器,乘法器可能几乎是免费的 - 但是如果它被许多其他乘法器,它可能相对昂贵)。

1

接受的RDTSC计数应该有一个序列化指令,以确保所有先前的指令在计数之前已经退出。这增加了计数的开销,但您可以简单地“计数”零指令并从测量的指令中减去该值。

一些pdf手册涵盖了这一点。

http://www.agner.org/optimize/#manuals