零寄存器如何提高性能?

day*_*oli 3 mips instruction-set cpu-registers

在MIPS ISA中,有一个零寄存器($r0),其值始终为零。这使处理器能够:

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

正是在这种所述,这提高了CPU的速度。它如何提高性能?为什么不是所有的ISA都采用该零寄存器的原因是什么?

$ r0不是通用的。它硬连线为0。无论您对该寄存器执行什么操作,它的值始终为0。您可能想知道为什么MIPS中需要这样的寄存器。

MIPS的设计人员使用了基准测试(用于确定CPU性能的程序),这使他们确信,将寄存器硬连线到0可以提高CPU的性能(速度),而不是没有。并非所有人都认为必须将寄存器硬连接为0是必要的,因此并非所有ISA的寄存器都为零。

San*_*ses 6

对于您的每件物品,这里都有一个答案。

  1. 考虑强制使用寄存器进行输出的指令,您希望在其中丢弃此输出。通常,您必须确保有可用的空闲寄存器,如果没有,则将一些当前寄存器压入堆栈,这是一项代价高昂的操作。显然,经常会发生操作的输出被丢弃的情况,解决这个问题的最简单方法是使用一个“未使用”的寄存器。
  2. 既然我们有这样一个未使用的寄存器,为什么不使用它呢?很多情况下,您想要将某些内容零初始化或将某些内容与零进行比较。漫长的道路是首先将零写入该寄存器(这需要额外的指令机器代码中零的文字,可能0x00000000是相当长的形式),然后使用它。因此,一条指令被削减了,程序大小也减少了一点。

这些优化可能看起来有点微不足道,并且可能会引发一个问题“这实际上对任何事情有多大改善?” 这里的答案是上述操作显然在您的 MIPS 处理器上使用了很多。

  • 丢弃指令的输出在 x86 上很有用,因为指令具有设置条件代码等副作用。MIPS 指令只有一个输出,因为这是一种 RISC 架构,很少需要丢弃指令的输出。 (2认同)

Sne*_*tel 5

有几种潜在的方法可以提高性能;目前尚不清楚哪种处理器适用于该特定处理器,但我已按从大到小的顺序大致列出了它们。

  1. 它避免了虚假的管道停顿。如果没有显式的零寄存器,则必须取出一个寄存器,将其归零,然后使用其值。这意味着使用零的操作取决于清零操作,并且(取决于流水线转发系统的功能)可能取决于清零寄存器的先前值。像x86这样的体系结构具有非常小的危害分析工具,这些体系结构的寄存器文件非常小,并且基本上对其寄存器进行虚拟化处理,以防止出现问题。RISC处理器通常并非如此。
  2. 如果某些操作可以避免读取寄存器,则它们可能更具流水线性。如果使用显式零寄存器,则操作数将为零的事实在指令解码阶段才知道,而不是在寄存器获取阶段以后才知道。因此,可以跳过寄存器读取阶段。
  3. 类似地,显式丢弃结果的能力避免了寄存器写阶段的需要。
  4. 当某些运算的操作数之一已知为零或已知结果被丢弃时,某些运算可能会生成更简单的微码。
  5. 显式的零寄存器给编译器的优化器带来了一定的压力,因为它不需要对寄存器的分配进行仔细的检查(不需要识别不会导致读写中断的寄存器)。