Pentium Architecture Overview

Intel在1993年发布的Pentium是一款先进的超标量处理器。相比起80486,Pentium的功能模块更加复杂:

  1. 一级高速缓存单元从486的合并式变成了Pentium中各自独立的数据高速缓存和指令高速缓存
  2. 两条指令流水线,分别被命名为“u”和“v”。这两条流水线大致功能相同,但是细节上有所区别,由于本文主要集中在性能方面,对流水线u和v详细的分析参见其他章节。
  3. 新增了Control ROM和Control Unit(todo:功能待查)
  4. 流水线化的浮点单元(todo:作用)

奔腾酷睿架构怎么样 奔腾cpu架构_流水线

奔腾酷睿架构怎么样 奔腾cpu架构_Pentium_02

 

Pentium Instruction Pipeline Details

Pentium处理器拥有两条通用的整型指令流水线,可以同时执行两条整型指令,以及一个流水线化的浮点单元。对软件透明的动态分支预测机制可以将由于分支指令导致的流水线僵死降低至最少。

Cache

片上高速缓存子系统由独立的一级数据高速缓存和指令缓存构成,分别是8K字节大小,缓存行大小是32字节,采用2路组相联结构,回写更新机制,和最近最少使用缓存行替换算法。外部数据总线接口是8字节宽。

奔腾酷睿架构怎么样 奔腾cpu架构_奔腾酷睿架构怎么样_03

数据高速缓存由8个bank在4字节边界上交错组成(见下图)。只要访问的bank不相同bank,数据缓存可以被两条流水线同时访问。The minimum delay for a cache miss is 3 clocks. (我觉得应该是最小的cache hit延迟是3个clock吧?cache miss了,延迟远超过3个clock哦!)

奔腾酷睿架构怎么样 奔腾cpu架构_性能优化_04

Integer Pipelines (x2)

Pentium处理器有2条并行的整型流水线,主流水线U是Inte486流水线的增强版,副流水线V与主流水线U类似,但是V可以执行的指令有限制,随后的章节会详细解释。

奔腾酷睿架构怎么样 奔腾cpu架构_指令集_05

 

Pentium处理器在每个时钟周期可以发射2条指令。在这2条指令执行时,后续的2条指令也会被检查,如果可以同时执行,他们会被发射到流水线U和V中;如果不能同时执行,则只有下一条指令被发射到流水线U中,V空闲。

指令在U和V中执行时具有保序性,他们的行为和顺序执行一样。当其中一个流水线僵死的时候,后续指令不允许通过两条流水线中的任何一个。例如,假设顺序指令A、B、C中的A和B分别正在U和V中执行时,如果B指令由于某种原因僵死在V中,即便是A指令已经执行完毕,则随后的C指令也不允许使用U执行,必须等待B指令在V中执行完毕后,C指令才可以继续发射执行。

在Pentium处理器的流水线中,译码第二阶段(D2,即地址生成阶段)可以执行多路加法,所以,与486不同,使用索引寄存器寻址也不会引发性能损失。

Instruction Prefetcher

指令预取单元有4个缓存区,每个区是32字节大小,共128字节。指令预取单元可以获取一条跨缓存行的指令且没有性能损失。由于指令和数据高速缓存是分开独立的,所以指令预取再也不会和数据存取冲突了(上一代80486还会有冲突)。

Branch Target Buffer

Pentium采用了动态分支预测机制,分支目标缓存区有有一个256个条目(entry,也称为入口)。如果预测成功,即便发生跳转,也不会产生性能损失。对于条件分支预测失败,在流水线U上会有3个时钟周期的性能损失,在V上是4个时钟周期。对于call指令或者无条件跳转指令预测失败,流水线U和V都是3个周期的性能损失。回忆一下,486没有分支预测机制,所有的分支跳转都是2个周期的性能损失。

Pipelined FPU

大多数常用的浮点指令都已经流水线化,因此流水线可以在每一个时钟周期接收一对新的操作数,于是一个好的代码生成器(指汇编程序员或者编译器)可以获得几乎每个周期一条指令的吞吐量(当然,这是基于以下的假设:程序具有合理数量的自然并行度)。FXCH指令可以和常用的浮点指令并发执行,由此,代码生成器对待浮点栈就好像是使用常规的寄存器组一样,没有性能下降。

Optimization Consideration

有了超标量架构,对代码生成器非常重要的就是想办法调度指令流完全充分地利用两条整型流水线。因为Pentium的整型流水线是由486的流水线增强而来的,所以Pentium指令调度的准则是486(的准则)的超集。