【问题标题】:Why is the register length static in any CPU为什么任何CPU中的寄存器长度都是静态的
【发布时间】:2017-05-03 01:40:05
【问题描述】:

为什么 CPU 运行的寄存器长度(以位为单位)不能动态/手动/任意调整?如果这样调整,会不会让电脑变慢?

假设您有一个 8 位整数。如果可以将 CPU 寄存器长度调整为 8 位,CPU 只需遍历前 8 位,而不是将 8 位整数扩展到 64 位,然后再遍历所有 64 位。

【问题讨论】:

  • 无论如何,硬件通常在所有位上并行运行。 64 位异或并不比 8 位异或慢。对于较大的操作数大小,某些 CPU 上只有少数操作较慢。 (x86 具有可变的操作数大小,即使寄存器宽度是固定的。请参阅agner.org/optimize 以获取指令表,并特别查看 MUL 和 DIV(取决于操作数大小)与几乎所有其他内容(常量)的延迟/吞吐量。 )

标签: performance comparison cpu-architecture cpu-registers


【解决方案1】:

起初我以为你在问是否有可能拥有一个没有明确寄存器大小的 CPU。这是没有意义的,因为寄存器的数量和大小是硬件的物理属性,无法更改。

但是,某些架构允许程序员处理寄存器的较小部分或配对寄存器。
例如,x86 可以同时使用add al, 9(仅使用 64 位 rax 的 8 位)和 div rbx(配对 rdx:rax 以形成 128 位寄存器)。 这个方案没有那么分散的原因是它带来了很多权衡。

更多的寄存器意味着需要更多的位来寻址它们,简单地说:更长的指令。
更长的指令意味着更少的代码密度、更复杂的解码器和更低的性能。

此外,大多数基本操作,如逻辑操作、加法和减法,已经实现为在单个周期内对完整寄存器进行操作。
最后,一个执行单元一次只能处理一条指令,我们不能在一个 64 位 ALU 中同时发出 8 个 8 位加法。 因此,无论是延迟还是吞吐量,都不会有任何改善。

访问部分寄存器有助于程序员扇出可用寄存器的数量,例如,如果算法使用 16 位数据,程序员可以使用单个物理 64 位寄存器来存储四个项目和独立操作它们(但不能并行)。
具有可变长度指令的 ISA 也可以从使用部分寄存器中受益,因为这通常意味着较小的立即数,例如,将寄存器设置为特定值的指令通常具有与正在加载的寄存器大小匹配的立即数操作数(尽管 RISC通常对其进行符号扩展或零扩展)。

【讨论】:

    【解决方案2】:

    像 ARM 之类的架构(可能还有其他架构)支持half precision floats。这个想法是按照您的推测和@Margaret 解释。使用半精度浮点数,您可以将两个浮点值打包到一个寄存器中,从而以降低精度为代价引入更少的带宽。

    参考:

    [1]ARM

    [2]GCC

    【讨论】:

      猜你喜欢
      • 2011-03-31
      • 1970-01-01
      • 1970-01-01
      • 2012-09-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-20
      • 2020-08-25
      相关资源
      最近更新 更多