通用寄存器数目的多少是由ISA决定的,指令编码时会单独给寄存器字段进行编码,比如5bits就可以索引2^5=32个通用寄存器,一条指令的长度是有限的,指令类型,源操作数字段、目的操作数字段,可能的状态位字段(比如谓词寄存器等)以及立即数字段都需要一些bits来编码,所以相互之间存在竞争关系,如果寄存器太多,一条指令上能携带的操作数种类和数量就会受限,这里需要一个精巧的权衡。

x86一开始并没有使用太多的通用寄存器,原因之一(注意,只是之一)是当时的编译器无力进行寄存器分配,让编译器自动决定程序中众多变量哪些应该装入寄存器哪些应该换出、哪些变量应该映射到同一个寄存器上,并不是一件易事,JVM采用堆栈结构的原因之一就是不信任编译器的寄存器分配能力,转而使用堆栈结构,躲开寄存器分配的难题。

到80年代早期,IBM的G. J. Chaitin公开了他们的图染色寄存器分配算法之后,编译器的分配能力获得长足进步,形成了现在这样的编译器主导的寄存器分配格局,这个寄存器分配算法是IBM内部进行的一个RISC早期试验项目的一部分,但是我并没有看到有公开资料表明他们当时已经意识到RISC的寄存器数目将带来的性能暗示,而在图着色算法走向公开、成熟之前,RISC的理念就已经定型了,所以我也不认为RISC构建过程中有非常注重寄存器数目的考量,寄存器数目只是RISC发展中一个有意无意的副产品。当时RISC的主力推手之一,我们这个领域的泰山北斗David Patterson与DEC VAX团队的两位架构师Douglas W. Clark and William D. Strecker在《体系结构通讯》(CAN)上刊文论战时也并未以寄存器数目优势来说事。(推荐拙作一篇,RISC诞生与发展的缩影

而到了90年代初期,在RISC论战中败下阵来的Douglas W. Clark又在体系结构领域的顶级会议ASPLOS刊文分析RISC和CISC的优劣(Performance from architecture: comparing a RISC and a CISC with similar hardware organization),这一回他笔锋一转大唱RISC赞歌,从他的行文来看,寄存器数目优势对性能的帮助似乎已经成为当年的学术共识。。。。。

到了今天,又是另一番光景。通用寄存器数目的多少不再对性能有太大影响,原因是微结构的发展将ISA层面的影响逐步抹平,比如寄存器重命名,memory disambiguation这些技术都能帮助x86部分缓解、掩盖寄存器数目不足的问题。所以RISC寄存器多也不能获取多大优势,x86也并不会因此落后,关键还是要看微结构、以及更底层的电路器件工艺实现。

寄存器数目与晶体管数目没有什么关联。

补充:我遇到一些没有理清概念的人认为寄存器重命名可以完全补足甚至颠覆ISA可见寄存器数目不足的问题,这是不对的。寄存器重命名只能缓解这个问题。重命名可用的物理寄存器再多,地位也与ISA可见的寄存器是不同的。

最大的区别是ISA可见的寄存器有助于削减register spilling时的load store,而物理寄存器对此没有任何帮助,是的,没有任何帮助。可供重命名的物理寄存器数目增多以后,register spilling带来的load store仍可能居高不下,这个篓子得靠memory disambiguation来弥补,更准确地说是reg-mem-reg的数据前递(bypass)

— 完 —

本文作者:知乎用户(登录查看详情)

【知乎日报】
你都看到这啦,快来点我嘛 Σ(▼□▼メ)

此问题还有 1 个回答,查看全部。
延伸阅读:
ARM架构和MIPS架构以及X86架构的区别是什么?
X86和ARM架构的处理器能效差异为什么会这么大?

分享到