Computer Architectrure: Quantitative Approch 第三章第十二节

Putting It All Together: The Intel Core i7 6700 and ARM Cortex-A53

在本节中,我们将探讨两个多重问题处理器的设计:ARM Cortex-A53内核(用作数款平板电脑和手机的基础)和Intel Core i7 6700(高端,动态计划的,推测性的) 适用于高端台式机和服务器应用程序的处理器。 我们从更简单的处理器开始。

The ARM Cortex-A53

A53是具有动态问题检测功能的双事件静态调度超标量,它允许处理器每个时钟发出两个指令。 图3.34显示了流水线的基本结构。 对于非分支整数指令,有8个阶段:F1,F2,D1,D2,D3 / ISS,EX1,EX2和WB,如标题所述。 流水线是有序的,因此一条指令只有在其结果可用且执行了后续指令时才可以启动执行。 因此,如果接下来的两条指令是相关的,则它们都可以继续执行适当的执行管道,但是当它们到达该管道的开头时,它们将被序列化。 当基于记分板的发布逻辑指示第一条指令的结果可用时,第二条指令可以发布。

Computer Architectrure: Quantitative Approch 第三章第十二节
取指令的四个周期包括一个地址生成单元,该地址生成单元通过递增最后一个PC或从四个预测变量之一生成下一个PC:

  1. 单项分支目标高速缓存,其中包含两个指令高速缓存的提取(假设预测正确,分支之后的下两个指令)。 如果目标高速缓存命中,它将在第一个提取周期中对其进行检查。 然后从目标缓存中提供接下来的两条指令。 在命中和正确的预测的情况下,无延迟执行分支。
  2. 3072个条目的混合预测变量,用于所有未在分支目标高速缓存中命中的指令,并在F3期间运行。 此预测变量处理的分支会产生2个周期的延迟。
  3. 在F4期间运行的256项间接分支预测器; 当正确预测时,此预测器预测的分支会导致三个周期的延迟。
  4. 8个深度的返回堆栈,在F4期间运行,并产生三个周期的延迟。

Computer Architectrure: Quantitative Approch 第三章第十二节
Computer Architectrure: Quantitative Approch 第三章第十二节

在ALU管道0中做出分支决策,从而导致8个周期的分支错误预测损失。 Figure3.35显示了SPECint2006的错误预测率。 浪费的工作量取决于错误预测率和遵循错误预测分支时所维持的发布率。 如Figure3.36所示,浪费的工作通常遵循错误预测率,尽管它可能更大或更小。

Performance of the A53 Pipeline

A53流水线的性能由于具有双重问题结构,A53的理想CPI为0.5。 流水线停顿可能来自以下三个方面:

  1. 功能冲突,因为选择的两个相邻发布指令同时使用相同的功能流水线而发生。 由于A53是静态调度的,因此编译器应尽量避免此类冲突。 当这些指令顺序出现时,它们将在执行管道的开始处被序列化,此时只有第一条指令将开始执行。
  2. 数据冲突,在管道中较早发现,可能会使两个指令(如果第一个不能发出指令,第二个指令总是被阻塞)或一对指令中的第二个指令停顿。 同样,编译器应在可能的情况下尝试防止此类停顿。
  3. 控制冲突,仅在分支预测错误时才会出现。

TLB未命中和缓存未命中也都会导致停顿。 在指令方面,TLB或高速缓存未命中会导致填充指令队列时出现延迟,这很可能导致流水线的下游停顿。 当然,这取决于是L1未命中(如果未命中时指令队列已满,则可能在很大程度上被隐藏),还是L2未命中(这会花费更长的时间)。 在数据方面,缓存或TLB未命中将导致流水线停顿,因为导致未命中的加载或存储无法沿流水线继续进行。 因此,所有其他后续指令将被暂停。 Figure3.37显示了CPI和各种来源的估计贡献。

Computer Architectrure: Quantitative Approch 第三章第十二节
A53使用浅管线和合理的分支预测器,从而导致较小的管线损耗,同时允许处理器以较低的功耗实现较高的时钟速率。 与i7相比,A53的四核处理器功耗大约为1/200!

The Intel Core i7

i7使用具有深度流水线的积极的无序投机微体系结构,其目标是通过结合多个问题和高时钟速率来实现高指令吞吐量。 首款i7处理器于2008年问世。 i7 6700是第六代。 i7的基本结构相似,但是连续几代通过更改缓存策略(例如,预取的主动性),增加内存带宽,扩展运行中的指令数量,增强分支预测并改善图形支持来提高性能。 早期的i7微体系结构使用预留站和重新排序缓冲区来解决其混乱的推测性流水线。 后来的微架构(包括i7 6700)使用寄存器重命名,保留站充当功能单元队列,而重排序缓冲区仅跟踪控制信息。

Figure3.38显示了i7流水线的整体结构。 我们将按照图中标记的步骤,从提取指令开始,然后继续执行指令,以检查流水线。
Computer Architectrure: Quantitative Approch 第三章第十二节

  • 指令提取——处理器使用复杂的多级分支预测来实现速度和预测精度之间的平衡。 还有一个返回地址堆栈,以加快函数返回速度。 错误的预测会导致大约17个周期的损耗。 指令获取单元使用预测的地址从指令高速缓存中获取16个字节。
  • 16个字节被放置在预解码指令缓冲区中——在此步骤中,执行称为宏操作融合的过程。 宏操作融合采用指令比较之类的指令组合,然后是分支,然后将它们融合为单个操作,该操作可以作为一条指令发出和分派。 由于我们必须知道第一个结果的唯一用途是第二条指令(即比较和分支),因此只能融合某些特殊情况。 在对Intel Core架构(缓冲区要少得多)的研究中,Bird等人 (2007年)发现宏融合对整数程序的性能有重大影响,导致平均程序性能提高8%-10%,少数程序显示出负面结果。 对FP影响不大; 实际上,大约一半的SPECFP基准测试显示了宏操作融合带来的负面结果。预解码阶段还将16个字节分解为单独的x86指令。该预解码是和其他的不一样,因为x86指令的长度可以从1到17个字节,并且预解码器必须先查看多个字节,然后才能知道指令长度。 单独的x86指令(包括一些融合指令)被放入指令队列中。
  • Micro-op解码——单独的x86指令被转换为micro-ops。 Micro-op是类似于RISC-V的简单指令,可以由流水线直接执行。 这种将x86指令集转换为更容易流水线化的简单操作的方法是1997年在Pentium Pro中引入的,此后一直使用。 其中三个解码器处理直接转换为一个微指令的x86指令。 对于具有更复杂语义的x86指令,有一个微代码引擎用于产生micro-op序列; 它每个周期最多可以产生四个微操作,并一直持续到生成必要的微操作序列为止。 按照x86指令的顺序将微指令放置在64条目的微指令缓冲区中。
  • 微操作缓冲区执行循环流检测和微融合——如果有一小段指令(少于 64 条指令)组成一个循环,循环流检测器将找到循环并直接从缓冲区发出微操作,无需激活指令提取和指令解码阶段。 Microfusion 将 ALU 操作等指令对和一个从属存储结合起来,并将它们发布到单个保留站(它们仍然可以独立发布),从而增加了缓冲区的使用。微操作融合为整数程序产生较小的增益,而为 FP 产生较大的增益,但结果差异很大。具有宏观和微观融合的整数和 FP 程序的不同结果,可能源于识别和融合的模式以及整数与 FP 程序中的出现频率。在具有大量重新排序缓冲区条目的 i7 中,这两种技术的好处可能更小。
  • 执行基本指令发布——在寄存器表中查找寄存器位置、重命名寄存器、分配重新排序缓冲区条目,并在将微操作发送到保留站之前从寄存器或重新排序缓冲区中获取任何结果。 每个时钟周期最多可以处理四个微操作; 它们被分配了下一个可用的重新排序缓冲区条目。
  • i7 使用一个由六个功能单元共享的集中式预留站。 每个时钟周期最多可以向功能单元分配六个微操作。
  • 微操作由各个功能单元执行,然后将结果发送回任何等待的保留站以及非活跃寄存器单元,一旦知道指令不再是推测性的,它们将在那里更新寄存器状态。 重新排序缓冲区中与指令对应的条目被标记为完成。
  • 当重新排序缓冲区头部的一条或多条指令已被标记为完成时,将执行非活跃寄存器单元中的未决写入,并从重新排序缓冲区中删除这些指令。
  • 除了分支预测器的变化之外,第一代i7(920,Nehalem微架构)和第六代(i7 6700,Skylake微架构)之间的主要变化在于各种缓冲区的大小,重命名寄存器和资源 以便允许更多出色的指令。 Figure3.39总结了这些差异。

Computer Architectrure: Quantitative Approch 第三章第十二节

Performance of the i7

在前面的部分中,我们检查了 i7 分支预测器的性能以及 SMT 的性能。 在本节中,我们将了解单线程流水线性能。 由于存在激进的推测以及非阻塞缓存,因此很难准确归因理想化性能与实际性能之间的差距。 6700 上的大量队列和缓冲区显着降低了由于缺少保留站、重命名寄存器或重新排序缓冲区而导致的停顿概率。 事实上,即使在缓冲区明显更少的早期 i7 920 上,也只有大约 3% 的加载被延迟,因为没有可用的预留站.

因此,大多数损失来自分支预测错误或缓存未命中。 分支错误预测的成本是 17 个周期,而 L1 未命中的成本大约是 10 个周期。 L2 未命中的成本是 L1 未命中的三倍多,而 L3 未命中的成本约为 L1 未命中成本的 13 倍(130-135 个周期)。 尽管处理器会尝试在 L2 和 L3 未命中期间寻找替代指令来执行,但很可能某些缓冲区会在未命中完成之前填满,从而导致处理器停止发出指令。

Computer Architectrure: Quantitative Approch 第三章第十二节

图 3.40 显示了 19 个 SPECCPUint2006 基准测试的总体 CPI 与早期 i7 920 的 CPI 相比。i7 6700 的平均 CPI 为 0.71,而 i7 920 的平均 CPI 为 1.06,几乎高出 1.5 倍。 这种差异源于改进的分支预测和需求未命中率的降低(参见第 135 页的图 2.26)

Computer Architectrure: Quantitative Approch 第三章第十二节

要了解 6700 如何实现 CPI 的显着改进,让我们看看实现最大改进的基准测试。 图 3.41 显示了 920 上的 CPI 比至少比 6700 高 1.5 倍的五个基准。有趣的是,其他三个基准显示分支预测精度有显着提高(1.5 或更高); 然而,这三个基准测试(HMMER、LIBQUANTUM 和 SJENG)在 i7 6700 上显示出相同或略高的 L1 需求未命中率。这些未命中的出现可能是因为主动预取正在替换实际使用的缓存块。 这种类型的行为提醒设计人员在复杂的推测性多问题处理器中最大限度地提高性能所面临的挑战:仅通过调整微体系结构的一个部分很少能实现显着的性能!

上一篇:Java类是如何默认继承Object的


下一篇:软件工程第三次作业