这个对 StackOverflow 上关于 ARM 的银行寄存器上下文中银行意味着什么的问题的回答表明,当应用于寄存器时,银行的含义存在一些混淆。
银行业务对寄存器意味着什么?
这个对 StackOverflow 上关于 ARM 的银行寄存器上下文中银行意味着什么的问题的回答表明,当应用于寄存器时,银行的含义存在一些混淆。
银行业务对寄存器意味着什么?
当应用于寄存器时,银行一词有两种不同的含义。
StackOverflow 问题所涉及的意义类似于 function 中的(内存)库切换(由某些 8 位和 16 位处理器使用)中的使用。寄存器集合的名称映射到不同的物理寄存器集合。ARMv7 为其 16 个 GPR 中的 7 个提供了一个额外的 bank,为堆栈指针寄存器和链接寄存器提供了另外 5 个 bank(ARM 使用链接寄存器来保存用于从中断返回的 PC)。Itanium 为其 31 个静态 GPR 中的 16 个提供了一个额外的存储库。(MIPS 提供了整套 31 个 GPR,称它们为“影子寄存器集”。)
与内存库切换不同,这种类型的寄存器库的主要目的(通常)不是扩展可寻址存储,而是通过避免需要保存寄存器值、加载中断处理程序使用的值和恢复原始值来提供更快的中断处理寄存器值并简化中断处理。
(使用应用程序的堆栈来保存寄存器状态可能会溢出为该堆栈分配的内存,从而生成一个异常,然后必须以某种方式处理状态保存。更糟糕的是,如果内存页面立即超过堆栈的限制,则可以由中断处理程序的特权升级,但不是由应用程序,那么应用程序实际上正在写入它没有写入权限的页面。一些 ABI 通过将一个或多个寄存器定义为跨中断易失性来避免这个问题。这允许中断处理程序加载用于保存状态的指针而不破坏应用程序状态,但与存储寄存器不同的是,此类软件定义的中断易失性寄存器不能被应用程序软件信任为不变。)
(已经提出使用这样的寄存器组作为固定窗口来扩展可用寄存器的数量,例如,“Increasing the Number of Effective Registers in a Low-Power Processor Using a Windowed Register File”,Rajiv A. Ravindran 等人, 2003. 人们可能还注意到寄存器堆栈的相似之处,用于避免寄存器保存和恢复函数调用的开销,如在 Itanium 和 SPARC [使用术语“寄存器窗口”],尽管这些机制通常移动寄存器名称而不是交换它们出去。)
在硬件方面,可以通过重命名指令解码中的寄存器来实现分组寄存器。对于 ARM 相对复杂的银行系统,这可能是首选机制。对于像 Itanium 使用的简单的银行系统,它具有一个具有两个寄存器数量的电源的额外银行,将重命名合并到寄存器文件本身的索引中可能是切实可行的。(当然,这与用于支持乱序执行的某些重命名形式不兼容。)
通过认识到不同的存储体不会同时被访问,使用这种机制的巧妙优化可以通过使用“3D 寄存器”来减少高度移植的寄存器文件的(线限制)区域开销。(这种技术是在 SPARC 的寄存器窗口的上下文中提出的——“超标量处理器的三维寄存器文件”,Tremblay 等人,1995 年——英特尔在 SoEMT 中使用了一种变体——“多线程,奇偶校验保护双核安腾系列处理器上的 128 字寄存器文件”,Fetzer 等人,2005 年。)
术语banking 用于寄存器的第二种含义是指将一组寄存器分成组(bank),每个组可以并行访问。使用四个存储库可将支持的最大访问次数增加四倍,从而允许每个存储库在给定的有效访问计数下支持更少的访问端口(减少面积和能源使用)。但是,如果给定周期内的访问没有均匀地分布在存储库中,则无法达到最大访问次数。即使相对于所需的访问计数有大量的存储库,存储库冲突在最坏的情况下也会将实际访问计数限制为单个存储库提供的端口数。
已经有很多关于银行注册文件的学术论文(谷歌学术搜索),并且已经提出了几种通用技术来减少银行冲突的影响。最明显的技术是缓冲指令(就像乱序执行所做的那样),提供一些对存储库冲突的统计平均。还可以在指令准备好执行之前读取寄存器操作数(例如,如果另一个操作数尚未准备好或结构风险延迟执行)。向银行分配寄存器可以利用有关预期用途的信息来降低冲突的可能性。(软件可以通过以预期方式优先使用寄存器来提供帮助。)使用虚拟物理寄存器名称,可以延迟物理寄存器名称(以及银行)的分配,直到值存储在寄存器中;
这种类型的银行业务有时被称为伪多端口,因为它提供了大量访问端口的假象。这种技术通常用于高速缓存,因为物理结构通常由于其他原因被划分为单独的内存阵列。
(这种存储的一种替代方法是复制寄存器文件。使用寄存器文件的两个副本允许每个副本需要一半的读取端口,尽管需要相同数量的写入端口。此技术用于 POWER2 和 Alpha 21264并且通常用于高性能处理器。)
将这两种类型的银行业务区分为时间银行业务可能会有所帮助,其中银行选择跨时间分布(如 ARM 用于快速中断的银行寄存器)和空间银行业务,其中银行访问可以在时间上并发但在空间上分布。
时间存储通常暴露给软件,用于减少中断的开销(和复杂性)。(从概念上讲,Switch-on-Event-MultiThreaded 处理器中的线程切换与中断处理非常相似,并且可以使用类似的机制来减少开销。)
空间存储在 ISA 中的应用频率较低(尽管安腾需要加载和存储浮点寄存器对以使用偶数和奇数寄存器编号——鉴于使用寄存器轮换,这不能保证——允许简单的两个存储库设计提供额外的寄存器文件访问要求),用于降低每个周期提供大量寄存器访问的成本。