零寄存器如何提高性能?

时间:2014-07-09 05:41:44

标签: mips cpu-registers instruction-set

在MIPS ISA中,有一个零寄存器($r0),它总是给出零值。这允许处理器:

  1. 任何产生要丢弃的结果的指令都可以将其目标指向此寄存器
  2. 成为0
  3. 的来源

    据说source这提高了CPU的速度。它如何提高性能?为什么不是所有的ISA都采用这个零寄存器的原因是什么?

      

    $ r0 不是通用目的。无论你是什么,它都是硬连线   对这个寄存器来说,它的值总是为0.你可能想知道为什么   MIPS需要这样的寄存器。

         

    MIPS的设计者使用了基准测试(程序用于确定   CPU的性能,使他们确信拥有一个寄存器   硬连线到0会改善CPU的性能(速度)   反对没有它。不是每个人都同意硬连线注册   0是必不可少的,因此并非所有的ISA都具有零寄存器。

4 个答案:

答案 0 :(得分:5)

有一些潜在的方法可以提高性能;它不清楚哪些适用于那个特定的处理器,但我已经大致按照从大多数到最不可能的顺序列出它们。

  1. 避免虚假的管道停滞。如果没有明确的零寄存器,则需要取一个寄存器,将其归零并使用其值。这意味着零使用操作取决于归零操作,并且(取决于流水线转发系统的强大程度)可能在归零寄存器的先前值上。像x86这样的体系结构具有非常强大的危害分析工具,它具有非常小的寄存器文件并且基本上虚拟化它们的寄存器以防止引起问题。 RISC处理器通常也不是这样。
  2. 如果某些操作可以避免读取寄存器,则它们可能更易于管道化。如果使用显式零寄存器,则操作数将为零的事实在指令解码阶段是已知的,而不是稍后在寄存器提取阶段中。因此,可以跳过寄存器读取阶段。
  3. 同样,显式丢弃结果的能力避免了对寄存器写入阶段的需要。
  4. 当已知其操作数之一为零时,或者已知结果被丢弃时,某些操作可能会生成更简单的微码。
  5. 明确的零寄存器会给编译器的优化器带来一些压力,因为它不需要对寄存器分配一样小心(不需要识别一个不会引起注册的寄存器)在读或写时失速。

答案 1 :(得分:3)

对于您的每件商品,这是一个答案。

  1. 考虑强制要求输出寄存器的指令,您要丢弃此输出。通常,您必须确保有一个可用的空闲寄存器,如果没有,则将一些当前的寄存器压入堆栈,这是一项代价高昂的操作。显然,操作输出被丢弃的情况很多,处理这个问题的最简单方法是使用“未使用”的寄存器。
  2. 既然我们有这样一个未使用的寄存器,为什么不用呢?它发生了很多,你想零初始化或比较一些零。最重要的是首先将零写入该寄存器(这需要额外的指令在您的机器代码中为零的文字,其形式可能是0x00000000,相当长)然后使用它。因此,一条指令也被削减了,并且还有一些程序大小。
  3. 这些优化可能看起来有点微不足道,可能会提出这样一个问题:“这实际上有多大改善?”这里的答案是上面描述的操作显然在MIPS处理器上使用了很多。

答案 2 :(得分:1)

零寄存器的概念并不新鲜。我第一次在CDC 6600大型机上遇到过它,可以追溯到1960年代中后期。在某些方面,它是最早的RISC处理器之一,并且是5年来世界上最快的计算机。在该架构中,“B0”寄存器硬连线始终为零。 http://en.wikipedia.org/wiki/CDC_6600

这种寄存器的好处主要在于简化了指令集。当简单和常规指令集的解码和编排可以在没有微码的情况下实现时,它可以提高性能。此外,对于像今天大多数LSI芯片一样的6600,信号传输长度为“线”的时间成为执行速度的关键因素,并且保持指令集简单(并避免微码)允许更少的晶体管,并导致更短的电路路径。

答案 3 :(得分:1)

零寄存器允许在设计新寄存器时保存一些操作码 指令集体系结构(ISA)。

例如,main RISC-V spec具有32条伪指令 取决于零寄存器(参见表26.2和26.3)。伪指令是 汇编程序映射到另一个实数的指令 指令(例如,将等于零的分支映射到 如果相等则分支)。为了进行比较:RISV-V主要规格列表164 实际指令操作码(即计数RV(32 | 64)[IMAFD]基数/扩展名,又称RV64G)。这意味着如果没有零寄存器,则RISC-V RV64G将为这些指令占用更多的32个操作码(即增加20%)。对于具体的RISC-V CPU 实现中,该实伪指令比率可能会向任一方向移动 取决于选择的扩展名。

较少的操作码可简化指令解码器。

更复杂的解码器需要更多时间来解码指令 或占用更多的门(不能用于更有用的CPU单元) 或两者兼有。

现有的,增量开发的ISA必须处理 向后兼容。因此,如果您的原始ISA设计 不包含零寄存器,您不能稍后再添加 修订而不会破坏兼容性。另外,如果您现有的 ISA已经需要非常复杂的解码器,然后添加零 注册没有回报。

除了现代RISC-V ISA(自2010年以来首次 2019年批准),ARMv8 AArch64(2011年发布的64位ISA), 与以前的ARM 32位ISA相比,该寄存器还具有零寄存器。由于这个和其他变化 AArch64 ISA与以前的ARM 32位有很多共同点 ISA而不是x86和x86-64 ISA。

与AArch64相比,x86-64 没有零寄存器。尽管x86-64比 以前的32位x86 ISA,其ISA只是增量更改。 因此,它具有所有现有的x86操作码以及64位功能 变体,因此解码器已经非常复杂。