【问题标题】:Determining Opcode Cycle Count for a CPU确定 CPU 的操作码循环计数
【发布时间】:2010-02-24 04:44:18
【问题描述】:

我想知道如何获取各种机器的 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 和零散的文档之外无法访问任何东西。

【问题讨论】:

    标签: emulation opcode


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-30
        • 2023-03-22
        • 1970-01-01
        • 2023-02-10
        • 1970-01-01
        • 2017-02-13
        相关资源
        最近更新 更多