如果无序超标量处理器的每个周期的取指令数是恒定的?

时间:2015-08-29 03:35:26

标签: cpu pipeline multicore computer-architecture instructions

我想知道无序超标量处理器(假设是Intel i7处理器)每个周期的取指令数是否恒定,或者它可能会根据缓存未命中率或分支未命中数而改变给定代码/程序的预测?

如果不是常数,如何解释背后的原因呢?据我所知,在现代多核处理器中,解码器单元总是尝试解决依赖关系并尝试使用独立指令填充管道气泡。那么,对于任何给定的工作负载,获取指令的数量不应总是相同(大约)?

2 个答案:

答案 0 :(得分:5)

在给定周期中获取的指令数取决于多个因素。对于Intel的第四代Core处理器,当使用指令缓存而不是μop缓存时,每个周期都会获取一个对齐的16字节指令块。从这个块到最多六个指令可以被解析并放置在一个指令队列中(它可以容纳来自一个线程的最多20条指令)。如果可以融合两个指令(也可以是宏操作),则可以解码来自该队列的多达五个指令,第一个指令解码为不超过四个融合的μop,并且剩余的三个指令解码为单个融合的μop。产生的μops存储在56条μop解码队列中(它也充当循环缓冲区)。 (解码为超过4μs的指令使用特殊的微码引擎。)

由于x86具有可变长度指令(最多15个字节长),因此16字节块中的指令数可能会有所不同。此外,对于采用分支,分支的目标可能不会与16字节的块对齐,并且分支指令可能不会在块的最后一个字节上结束;这意味着将忽略具有未对齐的采用分支目标的块开头的字节,并且将忽略采用分支之后的块内的字节。

(在其他一些微体系结构中,一个被采用的分支可能导致一个循环,其中没有(有用的)指令被提取。如果分支目标缓冲区和指令缓存有两个循环延迟,那么在一个被采用的分支上,分支后的循环开始获取指令将无法获取以下指令的目标。)

如果存在指令高速缓存未命中,则在丢失的高速缓存行变为可用之前,不能从该线程获取指令。类似地,必须先处理TLB未命中,然后才能从指令高速缓存中进行进一步的提取。

μop缓存对每个周期获取的指令数有不同的约束。每个周期可以从μop缓存中读取4μs。这可以对应于一个指令或(具有宏操作融合)多于四个指令。由于μop缓存被虚拟寻址,TLB未命中将不会停止读取(尽管在μop缓存命中的情况下TLB未命中的情况不太可能。)

(每个周期4μs可以从μop解码队列移动到60项调度程序。)

由于分支错误预测,因为管道被刷新,所以在分支之后取出的指令都不会有助于获取有效指令的计数。虽然在检测到分支错误预测之前将获取指令(并且一些可能已执行),但它们不会对提交的指令数量有所贡献。

此外,指令的缓冲量有限。如果依赖于具有数据高速缓存的负载的μops错过了调度缓冲区可能会填满,这会导致指令在μop解码队列中累积(因为该队列将不再被耗尽),然后获取之后的指令队列将很快填充,因为它不能流入μop解码队列。

重排序缓冲区(ROB)对离开μop解码队列的指令施加了另一个限制;当ROB已满时,不能再将指令移入调度缓冲区。如果最旧的指令尚未完成,即使以下所有191条指令都已完成并准备提交,也会发生这种情况。

即使没有数据缓存未命中,操作之间的依赖关系也会导致填充缓冲区,从而导致取指令停止。

正如您可能猜到的那样,拥有第二个线程可以通过减少分支预测的影响(实际上只有一半的指令从管道中刷新)并提供更多的指令级并行性来促进更高的有效指令获取率(因为来自单独的线程将是独立的,它允许操作执行并最终提交,耗尽各种缓冲区。

由于存在如此大量的指令缓冲并且大多数软件不能始终如一地充分利用执行宽度,因此获取尽可能多的指令的压力较小,因为每个周期可能执行这些指令。高质量分支预测还意味着实际将使用更多提取的指令。 (在分支错误预测上,更宽的提取会更快地填满调度缓冲区,增加了独立操作可用的机会。由于多个线程增加了可用的指令级并行度,这也为更广泛的提取提供了动力,但它也减少了反对这种激励的提取档位的频率和成本。)

答案 1 :(得分:1)

为了说明这一点,请查看this文档,该文档显示了不同体系结构在“并行”中执行某种类型指令的能力。如您所知,将一种类型的延迟指令与其他指令相结合将导致CPU以可变方式适应混合。因为它们可能依赖于相同的寄存器,缓存未命中,分支错误预测(或其他不太明显的因素),并且交互变得更加复杂。