为什么寄存器长度在任何 CPU 中都是静态的
Why is the register length static in any CPU
为什么 CPU 操作的寄存器长度(以位为单位)不能 dynamically/manually/arbitrarily 调整?如果这样调整会不会让电脑变慢?
假设您有一个 8 位整数。如果您可以将 CPU 寄存器长度调整为 8 位,则 CPU 只需通过前 8 位,而不是将 8 位整数扩展为 64 位,然后通过所有 64 位.
起初我以为您是在问是否有可能 CPU 没有确定的寄存器大小。这没有任何意义,因为寄存器的数量和大小是硬件的物理 属性,无法更改。
然而,某些架构允许程序员处理寄存器的较小部分或配对寄存器。
例如,x86 会同时使用 add al, 9
(仅使用 64 位 rax
的 8 位)和 div rbx
(将 rdx:rax
配对以形成 128 位寄存器) .
这个方案没有那么分散的原因是它有很多权衡取舍。
更多的寄存器意味着需要更多的位来寻址它们,简单地说:更长的指令。
更长的指令意味着更低的代码密度、更复杂的解码器和更低的性能。
此外,大多数基本运算,如逻辑运算、加法和减法,已经实现为在单个周期内对整个寄存器进行运算。
最后,一个执行单元一次只能处理一条指令,我们不能在一个 64 位 ALU 中同时发出 8 个 8 位加法。
所以不会有任何改善,延迟和吞吐量也不会有所改善。
访问部分寄存器对于程序员扇出可用寄存器的数量很有用,例如,如果算法使用 16 位数据,程序员可以使用单个物理 64 位寄存器来存储四个项目并独立地对它们进行操作(但不是并行)。
具有可变长度指令的 ISA 也可以从使用部分寄存器中获益,因为这通常意味着更小的立即值,例如,将寄存器设置为特定值的指令通常有一个与正在加载的寄存器大小相匹配的立即操作数(尽管 RISC通常对其进行符号扩展或零扩展)。
像 ARM 这样的架构(大概还有其他架构)支持 half precision floats。这个想法是做你在猜测和@Margaret 解释的事情。使用半精度浮点数,您可以将两个浮点值打包到一个寄存器中,从而以降低精度为代价引入更少的带宽。
参考:
[1] 手臂
[2] 海湾合作委员会
为什么 CPU 操作的寄存器长度(以位为单位)不能 dynamically/manually/arbitrarily 调整?如果这样调整会不会让电脑变慢?
假设您有一个 8 位整数。如果您可以将 CPU 寄存器长度调整为 8 位,则 CPU 只需通过前 8 位,而不是将 8 位整数扩展为 64 位,然后通过所有 64 位.
起初我以为您是在问是否有可能 CPU 没有确定的寄存器大小。这没有任何意义,因为寄存器的数量和大小是硬件的物理 属性,无法更改。
然而,某些架构允许程序员处理寄存器的较小部分或配对寄存器。
例如,x86 会同时使用 add al, 9
(仅使用 64 位 rax
的 8 位)和 div rbx
(将 rdx:rax
配对以形成 128 位寄存器) .
这个方案没有那么分散的原因是它有很多权衡取舍。
更多的寄存器意味着需要更多的位来寻址它们,简单地说:更长的指令。
更长的指令意味着更低的代码密度、更复杂的解码器和更低的性能。
此外,大多数基本运算,如逻辑运算、加法和减法,已经实现为在单个周期内对整个寄存器进行运算。
最后,一个执行单元一次只能处理一条指令,我们不能在一个 64 位 ALU 中同时发出 8 个 8 位加法。
所以不会有任何改善,延迟和吞吐量也不会有所改善。
访问部分寄存器对于程序员扇出可用寄存器的数量很有用,例如,如果算法使用 16 位数据,程序员可以使用单个物理 64 位寄存器来存储四个项目并独立地对它们进行操作(但不是并行)。
具有可变长度指令的 ISA 也可以从使用部分寄存器中获益,因为这通常意味着更小的立即值,例如,将寄存器设置为特定值的指令通常有一个与正在加载的寄存器大小相匹配的立即操作数(尽管 RISC通常对其进行符号扩展或零扩展)。
像 ARM 这样的架构(大概还有其他架构)支持 half precision floats。这个想法是做你在猜测和@Margaret 解释的事情。使用半精度浮点数,您可以将两个浮点值打包到一个寄存器中,从而以降低精度为代价引入更少的带宽。
参考:
[1] 手臂
[2] 海湾合作委员会