3

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

https://web.archive.org/web/20150217051448/http://www.obelisk.demon.co.uk/6502/reference.html

如果您检查 MAME 源代码,尤其是在 src\emu\cpu 下,您会发现大多数 CPU 模型都以类似的方式跟踪循环计数。我的问题是从哪里获取这些信息,或者如果它不可用则对其进行逆向工程?我从未见过任何“官方”ASM 程序员指南包含循环计数信息。我最初的猜测是,一个小程序被扔进了真实硬件的 bootrom,如果它包含一个等效于 RDTSC 的操作码,就可以这样做:

RDTSC

//opcode of choosing

RDTSC

但是,如果没有这样的支持,你会怎么做?我知道对于较旧的硬件,MAME 团队除了 rom 和零散的文档外无法访问任何东西。

4

2 回答 2

3

在 Pentium 之前,很容易找到 Intel 和 AMD 处理器(以及大多数竞争对手)的周期数。然而,从 Pentium Pro 和 AMD K5 开始,CPU 进入了动态执行模型,其中指令可以乱序执行。在这种情况下,执行一条指令所花费的时间很大程度上取决于它使用的数据,以及它是否(例如)依赖于前一条指令的数据(在这种情况下,它必须等待该指令完成才能执行执行)。

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

因此,在现代 CPU 上,孤立地谈论给定指令的周期几乎毫无意义。有意义的结果需要一系列指令,因此您不仅要查看该指令,还要查看它之前和之后的内容。在一个指令流中成为严重瓶颈的指令在另一个流中可能基本上是空闲的(例如,如果您将一个乘法与许多加法混合在一起,则乘法可能几乎是免费的——但如果它被许多其他乘法包围,它可能相对昂贵)。

于 2010-02-24T05:01:26.257 回答
1

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

一些 pdf 手册很好地涵盖了这一点。

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

于 2010-02-24T05:30:05.093 回答