pre*_*ion 2 cpu pipeline multicore computer-architecture instructions
我想知道无序超标量处理器(假设是Intel i7处理器)的每个周期的取指令数是否恒定,或者它可能会根据高速缓存未命中率或分支未命中预测的数量而改变.给出代码/程序?
如果不是常数,如何解释其背后的原因呢?据我所知,在现代多核处理器中,解码器单元总是尝试解决依赖关系并尝试使用独立指令填充管道气泡.那么,对于任何给定的工作负载,获取指令的数量不应总是相同(大约)?
在给定周期上获取的指令数取决于多个因素.对于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条指令已完成并准备提交,也会发生这种情况.
即使没有数据高速缓存未命中,操作之间的依赖性也可能导致缓冲区填满,从而导致取指令停止.
正如您可能猜到的那样,拥有第二个线程可以通过减少分支预测的影响(实际上只有一半的指令从流水线中刷新)并提供更多的指令级并行性来促进更高的有效指令获取率(因为来自不同线程的指令将会是独立的,它允许操作执行并最终提交,排出各种缓冲区.
由于存在如此大量的指令缓冲并且大多数软件不能始终如一地充分利用执行宽度,因此获取尽可能多的指令的压力较小,因为每个周期可能执行这些指令.高质量分支预测还意味着实际将使用更多提取的指令.(在分支错误预测上,更宽的提取会更快地填满调度缓冲区,增加了独立操作可用的机会.由于多个线程增加了可用的指令级并行度,这也为更广泛的提取提供了动力,但它也减少了反对这种激励的取消摊位的频率和成本.)
| 归档时间: |
|
| 查看次数: |
271 次 |
| 最近记录: |