为什么ARM有16个寄存器?

为什么ARM有16个寄存器?,arm,cpu-registers,cpu-architecture,Arm,Cpu Registers,Cpu Architecture,为什么ARM只有16个寄存器?这是理想的数字吗 寄存器与更多寄存器的距离是否也会增加处理时间/功率?要从16个寄存器中选择一个,您需要4位,因此这可能是操作码(机器命令)的最佳匹配,否则您必须引入更复杂的指令集,这将导致更大的编码器,这意味着额外的成本(执行时间) 说它有“32位的固定指令宽度,以简化解码和流水线” 因此,这是一个合理的权衡。早在80年代(IIRC)就发表了一篇学术论文,研究了许多不同的工作负载,比较了不同数量寄存器的预期性能优势。当时RISC处理器正从学术理念过渡到主流硬件,决

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


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

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

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

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


考虑到只有2的幂次,结果发现32个寄存器是最佳的,尽管16个并没有远远落后

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

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


正如您所看到的,当您将寄存器计数降低到16时,程序大小和所需的加载/存储数量都只有少量的改进。真正的惩罚只有在你降到8个寄存器时才会生效。我怀疑ARM设计人员在寻找每瓦特最佳性能时认为16个寄存器是一个最佳点。

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


这是一个非常有限的数字,所以x86和ARM在使用64位寄存器时都会将数字分别增加一倍,达到16和32个寄存器。旧的ARM指令编码没有足够的剩余位来容纳更大的寄存器号,因此它们必须进行权衡,放弃有条件地执行几乎所有指令的能力,并为新功能使用4位条件(这是一个过于简单化的说法,事实上并非如此,因为编码是新的,但新寄存器还需要3位).

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

你是说寄存器越多越好?;)我想详细介绍一下堆栈和寄存器。如果寄存器的数量不够,那么我们需要使用堆栈,但如果我们开始使用堆栈,则需要内存读/写,即获取/存储以执行操作。这将导致更多的执行周期,并将作为开销。因此,堆栈之间需要权衡和寄存器。如果你在MIPS中只计算真正的GPRs,那么在ARM32中只有13个寄存器(R0-R12,减去SP、LR和PC),x86有7个寄存器(省略帧指针时减去SP).x86_64有15个,而ARM64有31个如果16是一个理想的数字,那么为什么ARM64应该增加它呢?选择这个数字是基于很多原因和原因的benchmarks@Lưu Vĩnh Phúc-第一个ARM处理器创建于20世纪80年代中期,晶体管数量约为30000个。当时,增加了寄存器文件的大小,以支持32个GPRs会显著增加成本和功率需求,而不会对代码密度产生相应的好处。在设计ARM64时,已经有超过10亿个晶体管的芯片,这使得增加寄存器文件大小的影响不再是问题。是的,我们希望指令能适应32位,但例如,如果你有一个ISA,它可以有两个源寄存器和一个目标寄存器,你可以用15位指定这三个寄存器,然后你还有17个剩余的寄存器用于其他东西,比如操作码等等。循环中有19、15、11个指令吗?这些指令有多少个寄存器不同的CPU有?如果你澄清这一点,那么这可能仅仅是一个答案,而不是一个应该作为评论的轶事。此外,ARM谓词执行是每个指令,而不是每个寄存器。寄存器的数量是不相关的(不同于其他答案指出的它们都消耗32位指令字中的位的事实)这是指令集中编码的2、3、4或5位的情况,ins的混合和味道是什么
Register   Program   Load/Store  
Count      Size      Frequency  

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