改进的奔腾处理器分支预测和硬件数据预取
准确来说,奔腾M的分支预测单元应该类似于带Prescott内核的奔腾4处理器。它增加了两个部分:一是识别循环,二是预测间接分支。正因为如此,奔腾M中的分支预测明显不同于普雷斯科特之前的奔腾4,比他们更先进。当然,基于分支历史表进一步改进传统的静态分支预测方法是非常困难的。但是通过在以下几个方面对分支预测单元进行改进,英特尔工程师对奔腾M的预测精度提高了20%,这当然是和奔腾III相比。
第一个改进是增加了周期识别逻辑。在传统的静态分支预测方法中,分支预测的循环结束条件总是错误的。当然,我们可以通过扩展缓冲区容量来存储更多的分支信息,然后分析其中的数据来解决问题。但是逐个分析数据会造成很长的延迟。所以Pentium M使用一种稍微不同的方法来分离代码中的循环识别逻辑和循环结论信息。这可以大大提高结束循环的条件预测精度。
二是改进间接分支预测。所谓间接分支,就是一个分支的分支地址,在程序编译时是未知的,由程序执行时相关寄存器的状态决定。传统的静态分支预测使用分支历史表和分支地址表两个表,有这两个表但缺少间接分支地址表,这样预测结果的准确率不超过75%。所以开发者在奔腾M中增加了一个新的间接分支表,专门用来存储这类间接分支地址。
经过以上两项改进后,由于预测精度大大提高,流水线全速运行的次数比以前多了,执行单元等待空闲的次数也少了。正因为如此,奔腾M在相同频率下的整体性能比奔腾III高7%左右。而且,随着分支预测单元的改进,奔腾M还更新了硬件数据预取逻辑,将数据从内存取到缓存。奔腾M采用了类似于prescott core奔腾4处理器的硬件数据预取算法,比奔腾III更高效。
奔腾M和奔腾III、奔腾4一样,都是RISC处理器。这意味着执行单元在处理内部简化命令时远比处理复杂的x86指令更有效。换句话说,执行RISC指令比执行通常由三个或更多操作数组成的x86体系结构更快更平滑。因此,x86命令在通过解码器后,通常被分解成两个甚至三个微操作数。
例如,在存储器中存储数据的命令或在存储器中处理数据的命令分别被解码成两条指令。在第一种情况下,它由两条指令组成:计算地址和将数据存入缓冲区;在第二种情况下,它由两条指令组成:从内存读取数据和操作数据。现在所有的处理器都有乱序执行微操作数的能力,所以一条x86指令可以分成多个微操作数,送到执行流水线进行处理。
如果这些微操作互不相关,那么单独执行自然没有问题。但是,如果一条指令的执行需要另一条指令的执行结果,流水线就会等待,等待执行单元发送处理结果,然后就可以继续处理了。这种等待现象在NetBurst架构中并不明显,因为它的执行单元很多,但是对于奔腾M这样的处理器来说,性能影响还是相当明显的,等待的处理器持续浪费能量,这是移动处理器无法接受的。这也是奔腾M处理器要加入微操作融合技术的原因,可以尽量避免执行单元闲置的情况。
这项技术的工作很简单,就是把x86指令按照相关性分成一些部分,然后所有的微操作都被解码器聚集在一起,再按照之前确定的相关性划分微操作,这样就形成了x86指令的子集。具有相关性的微操作被划分在一起,由同一个执行单元执行,而不同执行单元执行的微操作是相互独立的。因此,不需要等待一个执行单元的执行结果。微操作融合虽然需要更多的工作,但是对性能提升有好处。通过测试,使用该技术可以将整数数据的处理速度提高5%,浮点数据的处理速度提高9%。