Intel Core & Enhanced Core微架构(5)

版权声明:转载必须保留原出处,没有书面许可不可用于商用目的, https://blog.csdn.net/qq_43401808/article/details/85705836

Branch Prediction Unit

在分支条件决断结果实际计算出来之前,分支预测机制就可以让处理器开始“投机式地”执行预测的分支指令。所有的分支指令都依赖于分支预测单元进行分支预测。分支预测单元实现了下列特性:

  • 16个条目的返回栈缓存区,可以让BPU准确的预测RET指令的返回地址
  • BPU查找(即分支预测)流水线前端排队机制(todo:说的啥?),BPU每次对32字节的指令进行分支预测,是取指单元每次读取的指令的长度的2倍。这个机制使得采纳分支可以无性能损失的被预测。

注意:尽管这个机制通常可以消除采纳分支导致的性能损失,软件层面上还是要认为采纳分支会比未采纳分支消耗更多的资源。

BPU可以对下列的分支类型做预测:

  • 直接调用CALL与跳转JUMP。这些分支目标被当作目标数组,不做采纳或非采纳预测。
  • 间接调用CALL与跳转JUMP。分支目标被预测为或者是单一固定目标,或者是多个可变目标(根据近期程序执行行为)。
  • 条件分支。分支目标被预测为采纳或者不采纳。

后续章节有针对BPU的优化技术。

Instruction Fetch Unit

一次指令读取是通过ITLB在指令缓存和指令预取缓冲区中做16字节对齐的查找,如果命中指令缓存,则读取16字节指令流(也称为一个指令行,或者读取行)到指令预译码器中。典型的程序平均每条指令略小于4个字节。由于绝大部分指令都可以被任一译码器处理,所以单次读取的16字节指令流通常可以在一个时钟周期内译码完毕。

非对齐的分支目标会减少有效指令字节数,减少的字节数是指令行中分支目标地址的偏移量,例如,如果分支目标从第14字节开始,则整个16字节的指令行中,前13个字节都是无用指令,会被废弃。采纳分支也会减少发送给译码器的指令字节数,因为由于分支指令发生跳转,紧跟在分支指令之后的指令不会被发送到译码器进行译码。在一个典型的整型计算程序中,大约平均每10条指令中会发生一次分支跳转,这就会导致大约每3次或4次指令读取中即产生一次“非完整”指令行(由非对齐的分支目标或分支指令跳转导致,这里“非完整”并不是说读取的指令行少于16字节,而是有效的指令字节数少于16字节)。这种情况有时候也可能会导致译码器空闲,被称为前端指令饥饿,或者译码器指令饥饿,即没有足够多的x86指令送给译码器进行处理。

由于流水线其他部分的停顿,前端的指令饥饿通常不是导致性能下降的主因。对于极端快速且使用更大(todo:指长度?)指令的代码(例如使用SSE2 整型指令的多媒体处理程序),使用对齐的分支目标可以避免前端指令饥饿,或许会有性能收益。

猜你喜欢

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