FabScalar: Composing Synthesizable RTL Designs of Arbitrary Cores within a Canonical Superscalar Template
Permission to make digital or hard copies of all or part of this work for
personal or classroom use is granted without fee provided that copies are
not made or distributed for profit or commercial advantage and that
copies bear this notice and the full citation on the first page. To copy
otherwise, or republish, to post on servers or to redistribute to lists,
requires prior specific permission and/or a fee.
ISCA’11, June 4–8, 2011, San Jose, California, USA.
Copyright 2011 ACM 978-1-4503-0472-6/11/06…$10.00.
摘要
越来越多的工作为单指令集异构多核范例提供了强有力的支持。单指令集架构异构多核提供了多种不同设计的超标量内核类型,可以简化不同程序和程序阶段的执行。单指令集架构异构多核提供了多种不同设计的超标量内核类型,可以简化不同程序和程序阶段的执行。之前没有研究解决这种范式的“致命弱点”:设计和验证工作会随着不同核心类型的数量而成倍增加。
这项工作以规范的形式构建了超标量处理器,因此可以快速设计许多在三个主要超标量维度上不同的内核:超标量宽度、流水线深度和提取指令级并行性(ILP)的结构大小。根据这个想法,我们开发了一个名为FabScalar的工具集,用于在一个规范的超标量模板中自动合成任意内核的可合成寄存器传输级(RTL)设计。模板定义了规范的管道阶段和它们之间的接口。规范流水线阶段库(CPSL)提供了每个规范流水线阶段的许多实现,它们在超标量宽度和子流水线深度上有所不同。RTL生成工具使用模板和CPSL自动生成所需配置的整体核心。验证实验从三个方面进行,以评估FabScalar生成的RTL设计的质量:功能和性能(每周期指令数IPC)验证、时序验证(周期时间)以及对标准专用集成电路流程适用性的确认。有了FabScalar,一个拥有许多不同超标量内核类型的芯片是可以想象的。
1.介绍
越来越多的工作为单指令集异构多核范例提供了强有力的支持。单指令集架构异构多核通过利用应用程序之间和内部的多样性,提供多种不同设计的超标量内核类型,以简化顺序[8][11][16][17]、并行[5][15][18][25]和多程序[9][10]工作负载的执行。核心类型可能在超标量取/发宽度、流水线深度、指令调度(有序或无序)、暴露指令级并行(ILP)所涉及的单元大小(发出队列、加载和存储队列、物理寄存器文件、重排序缓冲区等)方面有所不同,功能单元组合,以及预测器和缓存的大小。
该领域的前期工作为微体系结构多样的超标量内核带来了显著的性能和功耗优势。之前没有研究解决这种范式的“致命弱点”:设计和验证工作会随着不同核心类型的数量而成倍增加。这个因素限制了可以实际实现的微体系结构多样性的数量。
在本文中,我们提出以规范的形式构建超标量体系结构,这样就可以快速设计许多在三个主要超标量维度上不同的内核:超标量宽度、流水线深度和提取ILP的结构大小(频率取决于这三个维度)。规范形式处于逻辑流水线阶段:获取、解码、重命名、调度、发布等。我们称之为“规范超标量处理器”,它的逻辑流水线阶段被称为“规范流水线阶段”。在这个框架内,所有的超标量处理器都具有相同的规范结构,即每个处理器都有一套完整的规范流水线级和相同的接口。它们的不同之处在于它们规范管道阶段的底层实现。规范管道阶段库(CPSL)为每个规范管道阶段填充了多个设计。一个特定的超标量处理器可以通过从CPSL中为每个标准流水线级选择一个设计,然后将一组完整的标准流水线级拼接在一起而构成。由于规范流水线阶段之间的不变接口和规范流水线阶段内微体系结构多样性的限制,这种合成是自动化的。最后,微体系结构的多样性集中在定义超标量体系结构和区分单个超标量处理器的关键维度上。即,给定标准流水线级的不同设计沿着三个主要维度变化:
(1)超标量复杂性:规范流水线级的超标量复杂性是其超标量宽度(流水线“路”的数量)和其相关联的ILP提取结构(指令级并行)(例如,发布队列、物理寄存器文件、预测器等)的大小的乘积。增加超标量的复杂性可能有助于在程序中提取更多的ILP,但通常会增加规范流水线阶段的逻辑延迟。增加逻辑延迟对整体性能的影响最终取决于下一个区分因素。
(2)子流水线:规范流水线级名义上持续一个周期,但是可以更深地子流水线化以实现更高的时钟频率。
(3)阶段特定的设计选择:通常有多种选择来处理某些微体系结构问题,例如推测选择、恢复选择等等。这些替代方案呈现出一系列的成本和收益,此外,成本和收益通常取决于程序中特定的指令级行为。
我们的方法已经在一个名为FabScalar的新工具集中实现。FabScalar由规范超标量处理器的定义、包含每个规范流水线级的许多可合成寄存器传输级(RTL)设计的CPSL、以及通过参考CPSL自动合成任意超标量内核的RTL设计的工具组成。
此外,FabScalar工具集还有其他几个值得注意的特性。由于高移植RAMs和CAMs在超标量处理器中很普遍,并且对面积、功耗和周期时间有很大影响,我们开发了FabMem,一种自动生成多移植RAMs和CAMs物理设计(布局)的工具。虽然内存编译器不是新的,但据我们所知,没有一个商业上可用的内存编译器可以生成超过几个端口(否则我们会很乐意使用它);例如,一个4发射超标量体系结构需要一个12端口的寄存器文件。FabScalar还提供了一个联合仿真环境,在这个环境中,用C++编写的功能模拟器与超标量处理器的verilog仿真同时运行。这两者是独立的,功能模拟器通过比较指令从处理器中退出时的结果来帮助检查和调试verilog模拟。联合模拟环境还通过不需要全系统模拟来简化运行标准基准测试。最后,FabScalar提供了一个精确到周期的C++模拟器,它可以精确地对CPSL的所有内核进行建模。周期精度是通过使用相同的标准超标量处理器定义和标准流水线级之间的相同接口来实现的。周期精确模拟器对于RTL设计的更快探索和性能调试是有用的。验证实验从三个方面进行,以评估FabScalar生成的RTL设计的质量:功能和性能(每周期指令数)验证、时序验证(周期时间)以及对标准专用集成电路流程适用性的确认。对于功能和IPC验证,生成了十几个不同的内核,它们都成功运行了1亿个指令仿真点的SPEC整数基准。IPC在SPEC的预期范围内,内核之间的IPC差异与其微体系结构差异很好地对应,IPC密切跟踪FabScalar的周期精确C++模拟器产生的IPC。对于时序验证,我们比较了三个商用RISC超标量处理器的周期时间和具有相似配置的FabScalar生成内核的周期时间。(延迟被转换为与技术无关的FO4延迟。)这三款商用处理器代表了一系列高度定制设计的全合成内核,其结果证实了FabScalar RTL具有良好的质量。为了证明FabScalar生成的RTL对标准专用集成电路流的适用性,我们合成并放置并路由了一个样本内核。
FabScalar没有解决除自动综合和布局布线之外的物理设计工作。尽管如此,经过验证的可合成RTL是物理设计过程的重要起点。物理设计从完全综合发展到逐步调整的定制设计。举例来说,FabMem用RAMs和CAMs的物理设计取代了原本合成为触发器的结构。嵌入式空间的一些超标量内核是完全合成的,比如MIPS 74K [7]。甚至最近还有一个外包处理器调谐的例子:Intrinsity对ARM Cortex-A8进行了有针对性的定制电路设计,以提高其频率[1]。
明确地说,由于我们正在解决设计努力的问题,最终,我们打算将FabScalar用于由微体系结构不同的超级标量组成的芯片的设计、验证和制造。虽然目前仍处于学术阶段,但这是我们的目标轨迹。
也就是说,FabScalar对于一般的计算机体系结构研究也很有用。随着计算机体系结构研究日益受到技术相关问题(摩尔定律标度、功率、温度、可靠性、可变性)的推动,开源可合成verilog和任意超标量处理器的物理设计具有潜在价值。FabScalar的另一个有前途的应用是基于FPGA的超标量处理器仿真加速。沿着这些思路,我们将一个FabScalar生成的4路超标量处理器合成到一个Virtex-5 FPGA上,利用块内存来模拟内核的大量内存和内存。(我们在第5.3节中介绍了FPGA结果)。
本文的主要贡献如下:
- 以规范形式构建超标量处理器的想法是为了解决由单核异构多核带来的设计问题。这也是第一篇提出解决这个问题的论文。
- FabScalar工具集简化了超标量处理器的设计和验证。自动生成不同宽度和深度的超标量处理器的可合成RTL模型的能力是前所未有的,因为这些维度不是简单的参数化问题。
- 从三个方面对生成的RTL的质量进行验证:功能验证和IPC验证、周期时间验证以及对标准专用集成电路流程的适用性。我们还确认了将RTL映射到高密度FPGA(有助于加速验证和架构探索)的可行性,并与verilog模拟的周期数相匹配。
- 我们提出并分析了G21,这是一种由21种内核类型组成的通用异构多核设计。核心类型的选择不是基于应用的先验知识,而是基于提供广泛的微体系结构配置。考虑到整个设计空间,G21在59个SPICE仿真点上实现了接近最快的执行,尽管G21没有根据这些基准进行定制。这也意味着G21抓住了整个设计空间的多样性,因此是一个基于工作负载选择更少内核类型的更高效的平台。
本文的其余部分组织如下。第2节讨论相关工作。第3节描述了贯穿全文的方法。第4节描述了标量处理器,包括标准超标量处理器、CPSL和微处理器。第5节介绍了验证实验。在第6节中,我们应用FabScalar来探索G21,并从这个练习中提供关键的见解。第7节讨论了可扩展性、设计和验证工作。第8节总结了论文并讨论了未来的工作。
2.相关工作
伊利诺伊州的verilog模型(IVM) [27]为半参数化的4发射超标量处理器提供了Verilog。当前IVM的缺点是其不可合成或合成性差(低频)的verilog模块。更重要的是,IVM的超标量宽度和流水线深度不够灵活。这些方面不容易参数化,需要FabScalar的方法:一个RTL生成器,使用规范超标量模板和CPSL来组成一个所需宽度和深度的核心。最后,FabScalar开箱即用地运行SPEC基准,并通过标准的专用集成电路流程在IPC、周期时间和可综合性方面进行了验证。
斯特罗泽克和布鲁克斯开发了一个嵌入式系统非常简单内核的高级综合框架[24]。惠普实验室的片内程序输出(PICO)框架[6]与此密切相关,因为它为嵌入式应用定制了VLIW内核和不可编程加速器。Tensilica的Xtensa可配置处理器自动完成设计师定制指令、功能单元甚至VLIW数据路径的任务[28]。FabScalar的独特之处在于它生成了复杂的超标量处理器,这在新颖的可组合CPSL中显而易见。帕拉查拉、朱皮和史密斯[19]开发了估算关键超标量流水线阶段(重命名、发射和旁路)传播延迟的模型。李等人描述了一个多核系统的综合功率、面积和时序建模框架。时序模型将帕拉沙拉的方法扩展到多种微架构风格。FabScalar将延迟建模扩展到其他关键流水线阶段,如取指令、任意核心逻辑和整个核心;它考虑子管道及其不平衡;它产生了内核的RTL实现。FabScalar的RTL输出强调了与计算机架构工具的一个重要区别:FabScalar的目标是简化芯片的设计、验证和制造,即它旨在作为设计异构多核芯片的开发工具,而不仅仅是研究的评估工具。
3.方法学
表1显示了用于功能验证、综合和布局布线的EDA工具。为了合成,我们使用了FreePDK 45nm标准单元库[23]。
由于专用的高移植RAMs和CAMs对超标量处理器来说是如此普遍和重要,我们开发了一个工具(FabMem [32])来生成它们的物理布局并提取时序、功率和面积。虽然内存编译器不是新的,但我们不知道有哪种商业编译器可以生成具有多个端口的RAMs。对于模拟,RAMs和CAMs用行为模块表示。对于综合和放置布线,它们分别被来自FabMem的单元和LEF宏所取代。第4.2节描述了制造工具。
自定义RAM和CAM宏用于重命名映射表、架构映射表、活动列表、空闲列表、获取队列(分离解码和重命名阶段)、发出队列唤醒CAM和有效负载RAM、物理寄存器文件、加载队列CAM和RAM以及存储队列CAM和RAM。(CAM内容可寻址内存)
一级(L1)指令和数据缓存、分支目标缓冲区(BTB)和条件分支预测器也抽象为宏,定时信息从CACTI 5.1 [26]获得。CACTI使用从ITRS获得的设备和电线参数(分别参见CACTI 5.1报告[26]中的表4和表6)。FreePDK使用的、用于我们定制电路设计的BSIM4预测技术模型与众不同,更加保守。为了使缓存延迟符合我们的合成和定制逻辑,我们使用BSIM4模型重新计算了CACTI的设备和线路参数。表2显示了45纳米的原始和调整后的CACTI器件参数。导线参数表很大,由于空间限制而被省略。
每个规范流水线阶段在CPSL都有许多底层实现,它们在超标量宽度和子流水线深度上有所不同。对于CPSL的每一个设计,我们都在连续更严格的时间限制下执行多次合成运行,直到无法满足该限制。这样,我们就收敛到了最小传播延迟。
4. FABSCALAR
本节描述了FabScalar工具集,包括标准超标量处理器和CPSL(4.1节)和FabMem(4.2节)。第1节描述了FabScalar的verilog/C++联合仿真环境和周期精确的可配置C++模型的好处。然而,由于篇幅有限,我们不作进一步阐述。
4.1标准超标量处理器和CPSL
由FabScalar定义的标准超标量处理器如图1所示。它由九个规范的流水线阶段组成:获取、解码、重命名、调度、发布、寄存器读取、执行、写回和退出。
CPSL指令集架构是PISA [3],是MIPS指令集架构(减去加载和分支延迟槽)的近似衍生。使用简单的精简指令集架构有三个理由:(1)实际上,我们的主要经验是使用MIPS。(2)当代处理器经常动态地将二进制级指令集体系结构转换成实现指令集体系结构,有时称为微操作。微操作类似RISC原语。人们可以将所选择的CPSL ISA视为一个规范的实施ISA。二进制翻译技术为支持不同的二进制级别和实现ISAs提供了另一条途径[4]。(3)更简单的ISA实现导致更小的内核。
CPSL为每个标准流水线级包含许多可合成的RTL设计,它们的超标量宽度和子流水线深度不同。表3总结了当前CPSL可用的微体系结构多样性。第一列标识规范管道阶段。第二列显示宽度和深度的范围。所有前端阶段(通过调度获取)和退出阶段从1向到8向超标量不等。所有后端级(通过写回发出)的最小宽度目前为4,因为至少需要四个不同的功能单元:简单算术逻辑单元、复杂算术逻辑单元、加载/存储端口和分支单元各一个。较窄的发射宽度可以通过将多个FU类型聚合到一个管道方式来适应,这是我们留给未来工作的。所有后端级的最大宽度是8路超标量。表3的第二列还显示了子管道的深度范围。子流水线由每个规范流水线阶段设计中的自然逻辑边界和合成的时序结果(包括由FabMem生成的RAM和CAM宏)指导。Dispatch在CPSL只有1层实施,而Retire只有2层实施。所有其他阶段都有一个深度范围。Fetch最深,从2-deep到5-deep不等。这是Fetch单元在两个阶段具有实质逻辑的结果,Fetch-1 and Fetch-2。Fetch-1对应于访问所有结构(2路交错指令高速缓存、分支目标缓冲器、分支预测器),并且它还实现复杂的Next-PC逻辑。Fetch-2对应于指令高速缓存之后的所有逻辑,用于从两个高速缓存块中提取Fetch块并将其对准解码级,包括分支预解码逻辑。因此,Fetch至少为2深:提取-1和提取-2各为1深。设计了一个2-deep版本的Fetch-1,其特点是块前预测[20],这是一种稍微复杂的方法,用于有效地流水线化分支预测逻辑。据我们所知,这可能是它的第一个RTL实现[30]。Decode和Rename阶段由指令缓冲区(提取队列)分隔,这有助于为Rename和Dispatch阶段组装完整的超标量宽度的指令。由于将指令引导和写入缓冲区的逻辑复杂性,包括将双字指令分解成两个微操作,Decode阶段可以深至3层。Rename阶段从1深到3深不等,更深的版本增加了Rename阶段中多个动态组之间依赖关系的危险逻辑量。CPSL为Issue阶段提供了五种子流水线设计[31]:
- “1周期issue/ 1周期loop”(1/1):整个Issue阶段的1个周期(即,无子流水线操作),包括唤醒、选择和读取有效负载内存。1个关键唤醒+选择循环周期。
- “2周期issue/ 1周期loop”(2/1):整个Issue阶段有2个周期,但关键唤醒+选择循环只有1个周期。逻辑分区是:(a)唤醒+选择和(b) 有效负载内存。优化使所选指令的目标标记在读取有效负载内存之前可用,使其与唤醒选择循环去耦。
- “2周期issue/ 2周期loop”(2/2):整个Issue阶段2个周期,关键唤醒+选择循环2个周期。逻辑分区是:(a)唤醒和(b)选择+payloadRAM。
- “3周期issue/ 3周期loop”(3/3):整个Issue阶段3个周期,关键唤醒+选择循环3个周期。逻辑分区是:(a)唤醒,(b)选择,© payloadRAM。
- “3周期issue/ 2周期loop”(3/2):与3/3相同,但关键唤醒+选择循环只有2个周期(与2/1一样,payloadRAM与唤醒-选择循环去耦)。
寄存器读取阶段的范围从1深到4深。基于FabMem的经验,我们对物理寄存器文件的字线进行流水线处理,即每个周期返回一个寄存器的子字。由于字线的流水线操作,写回需要相同的周期数(每个周期写一个子字)。一个很好的特性是,旁路总线的规范接口随着子流水线的程度而不变:一个值被旁路到规范流水线阶段Execute和Register Read,而不管它们的底层实现如何,并且旁路的值被适当地引导到寄存器读取中的一个或多个子级。
表3中的第三列显示了在RTL实施的特定阶段结构。在RTL,所有阶段特定结构的尺寸都是参数化的:由于尺寸可以采用任意值,因此表3第三列中没有为结构指定范围。
表3的最后一列考虑了微体系结构多样性的另一个维度,我们将其广义地称为“微体系结构方法”。这个维度是特定于每个规范管道阶段的设计选择的混合体。在CPSL,在可合成RTL的水平上涵盖所有这些技术超出了本文的范围。尽管如此,我们认为在表3中列举值得注意的例子是有意义的,以强调未来发展CPSL的潜力,并强调微体系结构多样性可以针对特定指令级行为的特殊性。例如,根据预测错误分支的频率、它们的分布以及它们的后向切片的关键程度,某些程序阶段将倾向于一个分支预测错误恢复策略而不是另一个。作为另一个例子,对于工作负载空间的子集无用的技术可以从核心中排除,以简化其频率以及静态和动态功率。当前CPSL所代表的具体设计选择在表3的最后一列以粗体突出显示。
4.2 FabMem:多端口RAM 和CAM 编译器
我们定制设计了RAM和CAM 位单元,具有广泛的端口配置,支持标量到8路超标量流水线。位单元设计、地址解码器块、字线驱动器、预充电电路、写电路、列多路复用器、读出放大器以及输入和输出驱动器形成了用于组成RAMs和CAMs的单元库。图2显示了16R8W RAM位单元的布局。
图3显示了FabMem工具流程[32]。第一个脚本将内存的逻辑深度(D)和宽度(W)以及所需的读取端口(Rp)和写入端口(Wp)数量作为输入。该脚本引用单元库来生成内存关键路径的SPICE网表。它为三种不同程度的列复用(1、2和4)生成三个不同的网表,以找到良好的底层物理几何。它还生成应用性能压力测试的顶层模拟文件。这些测试导致最坏情况的耦合电容情形(例如,位线在相反方向上转换)和负载电容情形(例如,通过在所有端口上同时读取位单元来对其进行重负载)。SPICE模拟结果已制成表格,用户可根据这一初步探索确定最佳的列复用(DC)。
一个SKILL脚本需要输入D,W,Rp,Wp,现在是DC。SKILL是一种自动生成布局的脚本语言。Cadence Virtuoso运行SKILL脚本,它生成一个完整的内存布局,引用单元库。同时,用户运行第三个脚本,该脚本也将D、W、Rp、Wp和DC作为输入,并生成内存的完整源网表。同时,Calibre DRC对整个布局进行设计规则检查。同时,Calibre DRC对整个布局进行设计规则检查。在确认这一点之后,Calibre PEX在全布局上运行,以便提取寄生效应,该寄生效应与网表相结合,用于执行全布局SPICE仿真。完整布局模拟的结果可以与之前执行的更快的仅关键路径模拟的结果进行比较,以验证后者或确定时序和功率估计。此外,完整的布局可以用作硬宏。例如,图2显示了一个128项32位16R8W寄存器文件宏。
图4比较了CACTI 5.1产生的访问时间(针对BSIM4预测技术进行了调整。型号)和RAM工具,不同的大小和端口配置(1R1W、4R4W和8R8W)。CACTI 5.1要求最小块大小为8B,因此使用该宽度。在较小的RAM大小(CACTI对128B不产生有效结果)或大量端口的情况下,这两者往往会有更大的差异,这是促使我们开发该工具的两个原因。也就是说,1R1W和4R4W在4KB时产生类似的结果。
5. 结果:验证
在本节中,我们评估由FabScalar生成的RTL设计的质量。在本节中介绍的验证实验之前,我们对CPSL进行了广泛的单元级测试,并测试了基线4路超标量核心。后者支持完善规范管道阶段之间的接口和交互。随后,本节中所有核心的组装和调试工作在一个月的时间内高效地进行,而且,在此期间遇到的大多数bug都是在实现组合工具本身的过程中出现的(脚本化的verilog实例化和阶段拼接)。
验证从三个方面执行:
1 功能验证和IPC验证:生成了十几个不同的内核,覆盖了宽度、大小和深度的范围。在核心上执行6个SPEC2000整数基准测试中的1亿个指令simpoint[21],并且instructions per-cycle (IPC)结果在预期范围内并遵循预期趋势。其他6个整数基准测试没有被测试,因为它们的simpoint偶尔有浮点指令,当CPSL stage设计被扩展到处理浮点指令时,它们将在以后的工作中被测试。
2 验证时间:我们也评估质量的RTL和FabMem的周期时间。为了验证周期时间,我们将几个商业通用嵌入式内核与配置类似的FabScalar生成的内核进行比较。验证周期时间是具有挑战性和不完美的,有以下几个原因:
- 不同的技术节点、技术库和铸造流程。我们通过将周期时间转换为该技术的FO4反相器延迟数来处理这个问题,从而产生一种技术独立的比较(尽管底层技术对设计选择和电路优化选择的微妙影响是不可逆转的)。
- 不同程度的定制设计,包括电路优化程度、动态逻辑和基于锁存器的设计以适应逻辑分区的不平衡。我们只是用FabMem生成的多端口rams和cams部分地解决了这个问题。我们还比较了一个商业完全合成的嵌入式核心在频谱的一端。关于基于锁存器的设计,除了比较周期时间之外,我们还检查从获取到执行的流水线的原始总逻辑延迟。
- 不同的ISA和独特的微体系结构特性。例如,当前的CPSL没有带有多个调度器(见表3,最后一列)或复制寄存器文件的Issue 阶段设计。多个较小的调度器通过减少竞争给定执行流水线方式的指令数量来减少选择逻辑延迟,代价是多个发布队列之间的一些负载不平衡。更重要的是,当有多个相同类型的FU时,为每个FU提供一个专用的发布队列可以避免级联选择树,从而节省大量延迟。复制的寄存器文件减少了每个寄存器文件副本中的读取端口数量,从而缩短了它们的访问时间。虽然这些技术在CPSL尚未出现,但它们的效果可以通过应用更小/更简单的发布队列和具有更少读取端口的寄存器文件来进行时序验证。
3 物理设计的适用性:我们通过一个标准的专用集成电路流程来证明所产生的RTL对于完全合成和布局布线的适用性。
5.1功能和IPC验证
FabScalar工具用于为表4中描述的12个内核生成RTL设计。在讨论核心之前,关于表格的几点需要澄清。首先,表中省略了一些阶段深度:在CPSL只实现了一个深度的阶段(Dispatch和Retire 总是分别为1-深度和2-深度),或者在十二个内核之间没有变化的阶段(Decode固定在1-深度)。其次,分支顺序缓冲区(BOB)是Fetch阶段的先进先出缓冲区,保存所有预测但尚未退出的分支的控制信息。它有助于在分支退出时以非推测方式更新分支历史表,以及检查某些预测器状态(如全局分支历史寄存器)。第三,引用的fetch-to-execute流水线深度反映了最小分支预测失误惩罚,并且包括分支单元中的1个执行周期(Writeback和Retire深度不包括在这个数字中)。在CPSL代表的两个分支恢复实施中——阴影图与类似句柄的异常(表3)——所有12个内核都采用后者更低的复杂性和更低的性能方法。
核心1至核心6主要用于探索平台宽度和结构尺寸。除了核心6,这些核心的深度是相同的。Core-6是一个特别窄的内核:前端2路超标量。核心2在前端(4)和后端(6)具有不同的宽度。Core-5是一个特别宽的内核:8路超标量读取和执行,使用大量资源。核心6至10旨在探索阶段深度和fetch-to-execute管线深度。核心7和8类似于核心1,除了核心7较浅(fetch-to-execute = 9)和核心8较深(fetch-to-execute = 14)。它们的Issue和Register Read 深度不同。核心9和10的独特之处在于,它们的Fetch 的Fetch-1 子阶段使用块前分支预测被流水线化为两个周期。这产生了三个周期的总Fetch深度。内核9和10的Issue和Register Read深度不同。Core-10是十二个核心中最深的(fetch-to-execute = 15),尽管它不是CPSL最深的,因为Rename和Fetch(Fetch-2逻辑)可以进一步深化。
内核11和12分别与内核1和2相同,只是它们使用gshare [13]而不是双峰分支预测器。由于gshare预测器每个周期只能方便地提供一个分支预测,因此CPSL采用gshare的提取级设计在略微降低提取带宽和提高提取精度之间进行了权衡。
执行6个基准的1亿个指令仿真点的结果如图5所示。显示了RTL(“Verilog”)和周期精确的C++模拟器(“C++”)的结果。块提前预测还没有在C++中实现,所以它的数据点在内核9/10中丢失了。首先要注意的是,内核成功地执行了基准测试。第二,IPCs在SPEC整数基准测试的标准范围内,特别是考虑到这些内核使用的从负载错误计算(冲突存储之前的负载问题)和分支错误预测中恢复的保守方法。第三,RTL和C++紧密相连。后一个结果增加了对设计的RTL模型的信心:如果观察到性能异常,它们更可能是设计固有的,而不是设计的RTL模型。
内核之间的IPC差异往往与其微体系结构的差异相对应。例如,在核心1到核心5中,我们预计核心5具有最高的IPC,因为它是最具侵略性的核心,深度是相同的,并且在仅IPC的比较中没有应用负面的周期时间结果。核心8和10是最深的管道,因此它们的IPCs比其他配置低。由于增加一些参数和减少其他参数,内核的一些成对比较可能会走向任何一个方向,从而导致潜在的非单调内核。例如,除bzip之外,Core-6在所有基准测试中都具有与Core-2相同或更高的IPC。Core-6很窄(双向提取),但它相对于其他配置的优势是它的1周期唤醒选择环路。然而,在bzip的情况下,显然有足够的ILP超过更长的唤醒选择循环。
如果存在异常,例如,与具有相同管道深度的更简单的核心相比,更具攻击性的核心具有更低的IPC,则它们有时是由更大窗口大小导致的更频繁的加载错误计算或分支错误预测引起的。额外的恢复会削弱性能,当恢复是从活动列表的头部完全挤压。
5.2 时间验证
对于时序验证,我们比较了FabScalar生成的内核与三种不同的商用处理器的周期时间和fetch-to-execute 的延迟:90纳米POWER5 [22]、180纳米Alpha 21364 [14]和65纳米MIPS32 74K [7][29]。这三个都实现了RISC ISAs,它们代表了从高度定制设计到完全合成(MIPS32 74K)的极端情况。表5显示了三种处理器的主要微体系结构参数。
对于基础技术,所有延迟都转换为FO4反相器延迟的数量。我们从公布的数据[7][14][22][29]中获得了每个商用处理器流水线阶段中FO4延迟的数量。
表5中阴影部分显示了商用内核和类似配置的FabScalar生成内核之间的延迟比较。显示了五个数字:
1.商业核心的周期时间。
2.相同管道深度的类似配置的FabScalar内核的周期时间。
3.FabScalar内核的更深版本的周期时间,其fetch-to-execute 的流水线深度显示在括号中。这显示了需要多少额外的子流水线来补偿FabScalar内核的较小程度的定制设计。
4.FabScalar内核的原始fetch-to-execute延迟。这是Fetch和Execute之间所有阶段的传播延迟之和。
5.最后一个数字是上面的#4除以商业内核的fetch-to-execute 的流水线深度。如果流水线寄存器平均分配原始fetch-to-execute的延迟(流水线级之间没有不平衡),这对应于FabScalar内核的假设周期时间。对于相同的流水线深度,这个周期时间是基于锁存器的精心设计所能达到的最佳值。
FabScale-Power5的周期时间与Power 5相对接近:分别为29 FO4和23 FO4。稍微深一点的流水线操作(15深而不是12深)会产生更近的25 FO4周期时间。24 FO4的相同周期时间也可以通过理想的基于锁存器的设计来获得。所有这些比较,尤其是后者(原始fetch-to-execute延迟),证实了从传播延迟的角度来看,FabScalar生成的RTL和FabMem生成的RAMs/CAMs具有合理的质量。
FabScalar-21364和21364: 37 FO4与25 FO4相比,差异更大。有趣的是,21364的循环时间接近Power5,尽管21364只有它的一半深。这部分是由于旧的21364的超标量复杂性较低,但它也表明了总延迟优化的显著程度(Alpha 处理器获得了“速度恶魔”的声誉)。事实上,更深的FabScalar21364需要接近两倍的流水线深度才能达到21364周期时间,尽管配置相似。
MIPS 74K是完全合成的设计。这意味着通常用定制RAMs和CAMs实现的结构被合成为触发器(高速缓存除外)。因此,公平比较而言,FabScalar-74K的延迟也仅基于合成:不使用FabMem。这两个完全合成内核的周期时间几乎相同:FabScalar-74K为32 FO4,而74K为33 FO4。两个内核都是完全合成的,使用几乎相同的ISA,并且具有相同的周期时间,这进一步支持了从传播延迟的角度来看RTL具有合理质量的断言。
5.3标准专用集成电路流程的适用性
为了证明FabScalar生成的RTL可以通过标准的专用集成电路流,我们合成并放置了一个4路超标量处理器。物理设计如图6(a)所示。这个特殊的内核使用阴影贴图从错误预测中快速恢复。物理设计如图6(a)所示。这个特殊的内核使用阴影贴图从错误预测中快速恢复。
我们还在BEE3系统中合成了相同的内核,减去阴影映射,到Virtex-5 FPGA,如图6(b)所示。表6显示了现场可编程门阵列实验的结果。
FPGA产生与verilog模拟相同的结果:退役指令数、周期数和IPC(表的前三行)。现场可编程门阵列大大减少了模拟时间(加速2000-5000倍)。现场可编程门阵列速度为50兆赫,尽管由于现场可编程门阵列管理的虚拟周期,有效速度(模拟周期÷模拟时间)为7兆赫至15兆赫,但仍然很大。
6.结果:对工作负载无关的异构多核的分析
在本节中,我们将探讨一种异构多核设计,其目标是最大限度地提高单线程性能。先前的工作通过在一个巨大的设计空间中,详尽地模拟所有内核上的应用程序[16][17]或所有内核组合上的多程序工作负载[10],实现了类似的目标。除了这种方法的计算复杂性之外,还有一些关于针对特定工作负载训练的设计的性能鲁棒性的问题。
这些明显的缺点促使我们采取非常不同的方法。选择内核是为了在没有应用先验知识的情况下提供广泛的微体系结构配置。我们有意不针对特定工作负载定制内核或内核组合(除了作为最佳标准),因为我们希望异构多核设计能够最大限度地提高单线程性能,以满足任意指令级行为。我们第一次简单地应用这个想法产生了一个具有21种核心类型的异构多核,我们称之为G21:“G”代表通用异构多核,指的是它不受特定工作负载影响的广泛多样性。
本节安排如下。第6.1节描述了设计空间和性能指标。第6.2节描述了G21的设计过程。第6.3节描述了基准。第6.4节介绍了G21及其衍生产品的结果和分析。
6.1设计空间
使用FabScalar的CPSL,我们创建了一个包含近38,000个不同内核的设计空间,其周期从0.5纳秒到1.2纳秒,增量为0.1纳秒。对于给定宽度和深度的规范流水线阶段,其阶段特定的结构在周期时间约束内最大化(因此修剪了未充分利用松弛的设计)。IPC是用FabScalar的周期精确C++模拟器测得的(比verilog模拟快,我们还可以在练习中加入浮点基准)。性能是以每秒数十亿条指令(BIPS)来衡量的,是IPC和频率的乘积。
6.2 G21:提议的工作负载无关的异构多核
提议的工作负载无关设计提供了2到8的超标量宽度。对于每个宽度,选择与宽度相称的周期时间范围,即较窄的核心比较宽的核心具有更快的周期时间范围。表7显示了为每个宽度选择的三个周期时间。三个循环时间适用于宽度和最大深度的小型、中型和大型结构尺寸。这产生了总共21种核心类型,七种宽度各有三种尺寸/频率。
6.3基准
我们使用SPEC的整数和浮点基准测试。仿真点工具[21]用于分别从每个整数或浮点基准中选择多达四个或五个1000万指令仿真点。实验总共有59个仿真点,从此我们称之为“基准”。
6.4 G21的结果和分析
我们假设理想的导向:对于给定的多核设计,基准测试报告的性能是设计中所有内核中可达到的最高性能。我们考虑以下多核设计:
- Best-1:这个设计只有1个核心类型。平均而言,它是整个设计空间中最好的内核,即Best-1实现了任何一个内核的最高BIPS频谱均值(在所有基准之上)。
- G21:这是提议的具有21种核心类型的通用异构多核(第6.2节)。
在随后的所有图表中,给定设计的性能被标准化为考虑整个设计空间(BIPS /Peak_BIPS)的基准可达到的峰值性能。
图7显示了G21的性能。G21非常强劲。G21平均在峰值性能的3%以内。更重要的是,考虑到整个设计空间,没有一个单独的基准能达到低于其峰值性能的88%。这种水平的性能稳健性并不是因为基准测试之间缺乏多样性:图7中也显示了Best-1的性能,虽然对于单个内核类型来说令人印象深刻,但对于许多基准测试来说却显示了严重的次优性。平均来说,它比峰值性能低10%。Best-1的真正问题有两个方面:Best-1设计所针对的单个基准比其峰值性能低30%。由于对这种工作负载进行了大量的训练,因此有可能观察到其他应用程序更严重的次优情况。
G21没有经过这些基准测试的训练,但在没有严重异常值的情况下获得了接近峰值的性能,这一事实突出了与工作负载无关的设计的优点:计算复杂度低,并且在一定程度上缓解了对性能鲁棒性的担忧。G21没有经过这些基准测试的训练,但在没有严重异常值的情况下获得了接近峰值的性能,这一事实突出了与工作负载无关的设计的优点:计算复杂度低,并且在一定程度上缓解了对性能鲁棒性的担忧。
我们还推断,从单线程性能的角度来看,G21提供的微体系结构多样性高度代表了整个设计空间。换句话说,如果我们确实想通过利用工作负载知识提取更少数量的内核,可以使用G21来代替整个设计空间。我们考虑以下多核设计:
- G21的最佳选择:该设计从G21的核心类型中选择了N种核心类型(我们有N种选择)。平均来说,这些内核构成了G21的最佳N内核组合(BIPS的调和平均数)。
- G21中的稳健型:这种设计从G21的核心类型中选择了N种核心类型(我们有N种)。与G21上的峰值性能相比,选择N个内核是为了最大限度地降低任何一个基准的最大性能降级。
表8显示了这两种合并策略的结果,因为N是变化的。每个设计的BIPS被标准化为G21上的峰值BIPS。图中还显示了任何一个基准的最大退化(与其在G21上的峰值性能相比)。对于N = 2–5,在最大化平均性能和最小化对任何一个基准的影响之间有一个折衷。Best-4和Robust-4都比Best-3多使用一个内核,但目的不同。Best-4保持了与Best-3相同的最差情况下的单个基准降级,但提高了平均性能。相比之下,Robust-4实现了与Best-3相同的平均性能,但将最坏情况下的单个基准降级限制在11%,而Best-3的降级为15.4%。显然,Robust-4选择一个比“平均”更“离群”的额外核心来服务最“离群”的基准,而Best-4选择一个比“离群”更“平均”的额外核心来服务更多的基准。在这两种方法中,离群基准往往在某一点(N>5)主导额外内核的选择。
7.讨论
7.1扩展性
虽然很难对可扩展性进行概括,但我们给出了两个具体的例子。这些例子与前面介绍的FabScalar生成的内核中的两个主要IPC瓶颈有关:加载错误计算和分支错误预测。
在前面介绍的核心中,装载的完成不会被之前未发布的存储所延迟。如果后来发现推测性完成的加载依赖于其中一个存储,那么恢复代价是严重的:处理器等待直到加载到达活动列表的头部,压缩加载及其后的所有指令,并从加载重新开始。其中一位作者花了两天时间,用一个简单的依赖预测器(预测一个负载如果在过去会发生冲突)和逻辑来增强CPSL,以暂停完成负载队列中的可疑负载,直到所有先前的存储都已发布。已经有一种机制来完成曾经被停止的加载(对于缓存缺失的加载):加载被重新注入到加载存储管道(在下一个自由周期中),此时它被安全地完成。这些变化局限于Dispatch 阶段(依赖预测器)和加载队列(用于跟踪未发布存储的存储队列条目的位向量)。全局影响很小:从Retire阶段到Dispatch阶段有一个额外的信号(计算错误的负载的个人计算机训练依赖预测器),负载携带一个额外的位(无论是否推测完成)。bzip和vortex这两个基准的分支预测错误率非常低,因此,它们的性能对加载错误很敏感。因此,增加依赖预测因子将bzip的IPC从0.89增加到1.39,vortex的IPC从0.76增加到1.14(对于10M简单点)。
在第二个例子中,其中一位作者改变了Fitch-1阶段,将条件分支预测器(采用/不采用预测)与下一个PC逻辑(BTB、RAS和下一个PC多路复用器)完全分离,实现了任意深度的大型/复杂分支预测器的流水线操作(具有快速周期时间的高精度)[30]。这种变化比前面的例子需要更长的时间来实现,因为它更复杂,需要创造性的设计。然而,变化仅限于Fitch-1阶段。
7.2设计和验证工作
FabScalar并没有完全消除设计工作,也没有让设计师出局。相反,它通过生成整体内核的RTL设计来提高设计师的生产力,整体内核是设计调整、验证和物理设计的起点。
一个悬而未决的问题是FabScalar是否减少了验证工作以及减少了多少。在未来的工作中,我们希望将验证简化为(1)正式证明规范超标量模板是正确的,以及(2)独立地“证明”规范流水线阶段的特定实现。除了正式的方法之外,作为开源网关软件,验证覆盖范围可能会随着时间的推移通过用户社区而增加。
8.总结和未来工作
我们提出了FabScalar,这是一个新颖的工具集,用于在标准超标量模板内自动合成任意内核的可合成寄存器传输级(RTL)设计。每个规范流水线级都有许多变体,它们的复杂性(超标量宽度和级特定结构大小)和子流水线深度不同,规范流水线级可以组合成一个整体内核。因此,FabScalar有助于缓解目前阻碍微体系结构多样化内核激增的实际问题。
我们从三个方面进行了详细的验证实验,以评估FabScalar生成的RTL设计的质量:功能和性能验证(IPC)、时序验证(周期时间)以及对标准专用集成电路流程适用性的确认。这些实验证实了FabScalar生成的RTL设计具有良好的质量。
我们计划发布FabScalar工具集,供其他研究人员和开发人员使用和扩展,作为开源网关软件。我们打算增加浮点指令支持、媒体指令支持和TLBs实施MIPS ISA,以便能够利用最新的gcc工具链;放宽后端限制(任何FU类型的倍数,每个执行流水线中FU的任意组合,等等。);并探索微体系结构的替代方案,如表3中所列。选择一组不同的内核来最大限度地提高任意应用程序的单线程性能,这个问题需要更全面的处理,还应该考虑功耗。一个密切相关的问题是在运行时将程序和程序阶段与内核相匹配。在FabScalar框架中应用形式验证方法和工具是值得追求的。我们目前正在致力于将FabScalar生成的内核自动映射到FPGAs上,以加速验证、超标量处理器模拟和设计空间探索。