gpt4 book ai didi

cpu - 对于乱序的超标量处理器,每个周期获取的指令数是否恒定?

转载 作者:行者123 更新时间:2023-12-04 02:19:37 25 4
gpt4 key购买 nike

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

如果不是常数,如何解释其背后的原因?如我所知,在现代多核处理器中,解码器单元始终尝试解决依赖关系,并尝试用独立的指令填充流水线气泡。因此,对于任何给定的工作负载,提取的指令数应该不总是相同(大约)吗?

最佳答案

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

由于x86具有可变长度的指令(最多15个字节长),因此16字节块中的指令数量可以变化。另外,在采用分支的情况下,分支的目标可能无法与16字节的块对齐,并且分支指令可能不会在块的最后一个字节处结束。这意味着将忽略具有未对齐的采用分支目标的块开头的字节,并且将忽略采用分支之后的块中的字节。

(在其他一些微体系结构中,采用分支可能会导致一个周期,在该周期中不会提取(有用的)指令。如果分支目标缓冲区和指令高速缓存具有两个周期等待时间,则在采用分支上,分支指令开始执行后的周期会变为被提取将没有目标可用于提取以下指令。)

如果存在指令高速缓存未命中,则无法从该线程中获取指令,直到丢失的高速缓存行可用为止。同样,必须先处理TLB未命中,然后才能从指令高速缓存中进行进一步的提取。

µop缓存对每个周期获取的指令数量有不同的限制。每个周期可以从µop缓存中读取四个µop。这可以对应于一条指令或(具有宏运算融合功能)多于四条指令。由于实际上已对µop高速缓存进行了寻址,因此TLB未命中不会使读取停顿(尽管在µop高速缓存命中的情况下TLB未命中的可能性很小)。

(每个周期中有四个µop可以从µop解码队列移至60个条目的调度程序。)

由于分支预测错误,由于刷新了流水线,因此分支之后获取的所有指令都不会影响获取的有效指令的数量。虽然将在检测到分支预测错误之前提取指令(并可能执行一些指令),但它们不会对提交的指令数量有所贡献。

另外,指令的缓冲量有限。如果依赖于具有数据高速缓存的负载的µop错过了调度缓冲区,则可以将其填满,这将导致指令堆积在µop Decode Queue中(因为该队列将不再被清空),然后紧接在提取之后的指令队列将迅速填充,因为它无法排入µop解码队列。

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

即使没有数据高速缓存未命中,操作之间的依存关系也可能导致缓冲区填满,从而导致指令提取停顿。

您可能会猜到,拥有第二个线程可以通过减少分支预测的影响(实际上只有一半的指令从流水线中清除)并提供更多的指令级并行性(因为来自不同线程的指令将减少分支预测的影响)来提高更高的有效指令提取率。是独立的),这允许操作执行并最终提交,从而耗尽各种缓冲区。

由于存在如此大量的指令缓冲,并且大多数软件不能始终如一地充分利用执行宽度,因此取回每个周期可能执行的尽可能多的指令的压力较小。高质量的分支预测还意味着实际上将使用更多提取的指令。 (在分支预测错误的情况下,较宽的访存将更快地填满调度缓冲区,从而增加独立操作可用的机会。由于多个线程增加了可用的指令级并行度,因此也为更广泛的访存提供了动力,但是降低了抵制该奖励的获取停顿的频率和成本。)

关于cpu - 对于乱序的超标量处理器,每个周期获取的指令数是否恒定?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32282452/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com