为什么ARM有16个寄存器?

问题描述 投票:7回答:5

为什么ARM只有16个寄存器?这是理想的数字吗?

具有更多寄存器的寄存器的距离是否也会增加处理时间/功率?

arm cpu-registers cpu-architecture
5个回答
15
投票

随着通用寄存器的数量变小,您需要开始使用堆栈作为变量。使用堆栈需要更多指令,因此代码大小会增加。使用堆栈还会增加内存访问次数,从而影响性能和功耗。权衡的是,为了代表更多的寄存器,您需要在指令中使用更多的位,并且芯片上需要更多的空间用于寄存器文件,这会增加功耗要求。通过使用不同数量的寄存器编译同一组代码,您可以看到不同的寄存器计数如何影响代码大小和加载/存储指令的频率。这种练习的结果可以在本文表1中看到:

Extendable Instruction Set Computing

Register   Program   Load/Store  
Count      Size      Frequency  

27         100.00    27.90%  
16         101.62    30.22%  
8          114.76    44.45%  

(他们使用27作为基础,因为这是MIPS处理器上可用的GPR数量)

正如您所看到的,当您将寄存器数量降至16时,程序大小和加载/存储数量都只有微小的改进。真正的惩罚在您下降到8个寄存器之前不会启动。我怀疑ARM设计师认为当你寻找每瓦最佳性能时,16个寄存器是一种最佳点。


4
投票

要选择16个寄存器中的一个,你需要4位,因此这可能是操作码(机器命令)的最佳匹配,否则你将不得不引入更复杂的指令集,这将导致更大的编码器,这意味着额外的成本(执行)时间)。

Wikipedia表示它具有“固定指令宽度为32位以简化解码和流水线操作”,因此这是一个合理的权衡。


4
投票

32位ARM有16个寄存器,因为它只使用4位来编码寄存器,而不是因为16是理想的数字。同样,x86只有8个寄存器,因为在历史上它们使用3位来编码寄存器,以便某些指令适合一个字节。

这是一个有限的数字,所以x86和ARM在64位时分别将数字加倍到16和32个寄存器。旧的ARM指令编码没有足够的剩余位用于较大的寄存器编号,因此它们必须通过放弃几乎每条指令有条件地执行并使用4位条件进行新功能来进行权衡(这是过于简单化的,实际上它并不完全是这样,因为编码是新的,但是你需要为新寄存器再增加3位。


2
投票

早在80年代(IIRC)就发表了一篇学术论文,该论文研究了许多不同的工作量,比较了不同数量寄存器的预期性能优势。这正是RISC处理器从学术思想转变为主流硬件的时候,决定什么是最优的很重要。 CPU已经在速度上领先于内存,RISC通过限制寻址模式和单独的加载和存储指令使情况变得更糟。拥有更多寄存器意味着您可以“缓存”更多数据以便立即访问,从而减少访问主内存。

仅考虑2的幂,发现32个寄存器是最佳的,尽管16个并不是非常落后。


0
投票

ARM的独特之处在于每个寄存器都可以有一个条件执行代码,避免测试和分支。不要忘记,许多32个寄存器机器将R0固定为0,因此通过与R0进行比较来完成条件测试。我从经验中知道。 20年前,我不得不编写一个'模式7'(来自SNES术语)楼层。对于32x(或者更确切地说是2个),MIPS3000(Playstation)和3DO(ARM),CPU是SH2,代码的内部循环是19,15和11.如果3DO的运行速度与其他2,它的速度会快一倍。事实上,它只是有点慢。

© www.soinside.com 2019 - 2024. All rights reserved.