Pentium 4处理器流水线(5)

The Front End

Intel NetBurst微架构前端有两个主要部件组成:

  • 取指/译码单元
  • 执行跟踪高速缓存(简称跟踪缓存Trace Cache,或TC)

前端的基本工作如下:

  • 预取有可能执行到的IA32指令
  • 读取还没有预取的指令(例如,分支预测失败后的取指操作)
  • 译码指令(翻译成微指令)
  • 为复杂指令和特殊用途代码产生微码(todo: microop与microcode是不是同一个意思?)
  • 将微指令发送到跟踪缓存中
  • 使用先进的算法进行分支预测。

Intel NetBurst的微架构前端在设计时就考虑了高速流水线化的处理器常遇到的一些问题,下面这两个问题是导致流水线迟滞的主要因素:

  • 从分支目标地指出取指并译码耗费的时间
  • 分支目标地址位于缓存行中部,耗费了译码器的带宽。

执行跟踪高速缓存通过缓存译码后的IA32指令(即微指令)来解决上述问题。IA32指令由一个(指令)翻译引擎进行取指与译码操作。翻译引擎将译码后的微指令组合成微指令序列块,被称为“跟踪”,然后存储在跟踪高速缓存中。该缓存按照程序指令流路径存储这些微指令,代码中分支的结果被集成到同一个缓存行(指Trace Cache)中。这将增加来自于TC的指令流,而且更好的利用整体缓存存储空间,因为缓存不再需要存储未采纳分支且不会执行的指令。每个时钟周期,跟踪缓存可以发送3条微指令到执行核。

执行跟踪缓存和翻译引擎有一个协作的分支预测部件,可以根据指令的线性地址预测分支目标。预测的分支目标会被尽快的读取。如果分支目标已经缓存在跟踪缓存中,可以直接发送到执行核;否则就只能从各级存储器依次请求读取。翻译引擎的分支预测信息可以用了辅助形成最可能执行的路径的“跟踪”。

The Out-of-order Core

执行核的乱序执行微指令的能力是实现指令并行性的关键因素。这是特性使得当某条指令由于等待执行资源无法开始执行时,代码中后续的指令如果具备执行条件,则可以通过指令重排序机制开始执行。处理器利用若干个缓冲区实现流畅地微指令流。这意味当处理器指令流水线的某部分出于某种原因产生迟滞时,通过其他的可以并行执行的操作(例如在核中),或者通过执行先前已经缓存在某个缓冲区(例如,在前端)中的微指令,都可以覆盖这个延迟。

本节中提及的迟滞必须在上下文中理解。执行核被设计为便于并行执行,每个时钟周期内,它可以分发最多达6条微指令。注意,每个周期6条微指令其实已经超过了跟踪缓存和退役单元退役微指令的带宽了。执行核中更高的带宽允许超过3条微指令的峰值爆发,以及通过更灵活地发射微指令到不同的执行端口,从而获得更高的指令发射速度。

大多数的执行单元可以在每个时钟周期开始执行一条新的微指令,这样每条流水线在同一时间可以容纳多条微指令。一些算术逻辑指令(在ALU单元中处理)可以在每个周期内执行2条,许多浮点指令可以在每两个周期开始1条。小结一下就是,只要微指令的操作数和执行资源可用,就可以乱序地开始执行

Retirement

退役部件的主要功能是从执行核接收微指令的执行结果,以及根据执行结果,按照原始程序设计顺序,正确地更新处理器架构状态。为了得到语义正确的执行结果,IA32指令在退役之前必须将执行结果按照原始程序设计顺序进行提交。当指令退役时,有可能引发处理器异常(例如,更新内存但是遇到缺页)。因此,异常不能预测式(即乱序)地发生,它们必须按照正确的顺序发生,这样在异常处理之后,机器才可以正确地重启指令(例如,继续更新内存)。

当一条微指令完成并将结果写入到目标之后,它就退役了。在每个时钟周期内,最多可以有3条微指令退役。重排序缓冲区(ROB,即以前的指令池)在处理器中用于缓存已完成微指令,按顺序更新处理器架构状态(如前所述),管理异常处理的排序。

退役部件的另一个主要功能是对分支指令进行跟踪,将分支目标信息发送到分支目标缓冲区中,用于更新分支目标的历史信息。图1-3演示了Intel NetBurst微架构中最常执行的路径:一个与多级缓存和系统总线交互的执行环。

接下来的章节会详细的讲解前端和执行核的操作细节。关于Intel NetBurst微架构的细节信息为理解相关的优化技术以及使用指令执行延迟数据提供了必要的背景知识。

猜你喜欢

转载自blog.csdn.net/qq_43401808/article/details/85451983