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