精华区 [关闭][返回]

当前位置:网易精华区>>讨论区精华>>电脑技术>>● 计算机硬件>>☆ C P U ☆>>☆ Intel ☆>>高能奔腾处理器探幽(转寄) (转载)

主题:高能奔腾处理器探幽(转寄) (转载)
发信人: ding()
整理人: zdzd127(2001-03-30 18:19:24), 站内信件
【 以下文字转载自 ding 的信箱 】
【 原文由
 [email protected] 所发表 】
发信人: hway (花果山), 信区: Hardware
标  题: 高能奔腾处理器探幽
发信站: 龙门客栈 (Mon Sep 29 18:22:09 1997), 转信

标题:高能奔腾处理器探幽

    摘  要  该文深入到Pentium Pro微处理器内部,对Pentium Pro
微处理器的体系结构进行了详细的剖析,通过介绍该微处理器预测程
序流程、分析程序的数据流程图以选择最佳顺序执行指令,进而具备
能以优先的顺序推测执行指令的机理,指明了在相同制造工艺下Penti
um Pro比Pentium所能极大地提高效能的原因所在。
    关键词  微处理器  体系结构  指令流  动态执行
    Pentium Pro是最新的时尚,它正在逐渐蚕食Pentium的市场,成为
电脑发烧友新的追逐目标。但Pentium Pro与Pentium采用的是相同的
生产工艺,它为什么能比Pentium大胜一筹呢?请看Pentium Pro的内部
旅行。

    一、引言
    Pentium Pro(也称P6或高能奔腾处理器。)处理器设计的主要目
标之一,就是在利用与Pentium相同的半导体生产工艺的条件下,使性
能提高一倍。采用与实际上正在大批量生产的处理器相同的生产工艺
可以保证Pentium Pro处理器的可生产性,但同时这也意味着,Intel将
不得不精心地设计改进的微体系结构,以便从各个方面来获得性能增
益。本文叙述了如何把多项体系结构技术--这些技术有些是经过大型
机验证的,有些是由学术界提出来的,还有一些是Intel对其原有的技
术加以改进的--相互交融、修改、增强、调整和实现,并用以设计Pen
tium Pro微处理器的方法。这一将各种体系结构特点进行融合的产物
,被Intel称之为动态执行(Dynamic Excution),它使第一块Pentium P
ro处理器硅片的性能就超过了原来的设计目标,这无疑是继Pentium处
理器采用超标量体系结构之后的又一个重大进展。

    二、建造于高性能的平台之上
    Pentium处理器以其流水线和超标量的微体系结构树立了一个令
人瞩目的性能标准。Pentium处理器的流水线技术设置了五级站点,从
这块硅片上获取了较高的吞吐率。而Pentium
 Pro处理器则采用了多达12级站点的超流水线技术(superpipelined)
,增加站点数量以减少每级站点的工作量。与Pentium处理相比,Penti
um Pro处理器每级站点上的处理时间减少了33%。这意味着从半导体
制造工艺(例如晶体管的速度)的角度看,133MHz的Pentium Pro处理器
与100MHz的Pentium处理器是没有差别的。
    Pentium处理器的超标量微体系结构,在每个时钟周期内能执行两
条指令,如果不采用新的技术方案,是很难超越的。Pentium Pro处理
器所采用的新方案,消除了在传统的"取指"和"执行"周期之间存在的
指令线性排序的限制,并采用指令池技术打开了一个较宽的指令窗口
。这一方案保证了Pentium Pro的"执行"周期对程序的指令流具有更
大的可见度,从而可以采用更佳的调度算法。新方案要求Pentium Pro
的"取指/解码"周期依据对程序流的预测而具有更高程度的智能性。
最佳化的调度算法要求用去耦合的"分派/执行(dispatch/excute)"和
"撤离(retire)"周期取代基本的"执行"周期。这样可以允许指令以任
意顺序开始执行,但总是以程序原来的顺序完成。如下图所示,Pentiu
m Pro处理器是由三个独立的引擎并配以指令池组成的。
图1 Pentium Pro由三个相互独立的引擎所组成,它们之间借助于指令
池进行通信

    三、所解决的基本问题
    在进行关于Pentium Pro处理器是如何达到其令人瞩目的性能这
一专题旅行开始之前,很有必要搞清楚为什么要采纳三个独立引擎这
一方案。今天的微处理器实现技术中必须接受的一个基本事实是,绝
大多数CPU内核并没有被充分利用起来。考虑下面所示的代码片段。
    r1mem[r0]
    //*指令1*//
    r2r1+r2
    //*指令2*//
    r5r5+1
    //*指令3*//
    r6r6-r3
    //*指令4*//
    这个例子中的第一条指令是装载r1,它在运行时会引起高速缓存(
cache)访问脱靶。传统的CPU内核必须等待其总线接口单元把这一数
据(指mem[r0])从主存中读出来,并将其送给CPU内核,然后CPU内核才
能执行第二条指令。CPU在等待数据时处于停顿状态,因此,其使用是
不充分的。
    在过去的十多年里,CPU的速度增加了10倍,而主存设备的访问速
度仅增加了60%。这就造成了主存相对于CPU内核速度的延迟增大了。
而这一问题正是Pentium Pro处理器打算要解决的基本问题。把解决
这一问题的负担放在芯片组(chipset)上也许是一种可选方案,但是,
在大批量生产体制的条件下,采用需要高速、专门化的支持部件的高
性能CPU也并非良策。
    很自然地,解决这一问题的强制性方案是增加L2 cache的容量,以
减少脱靶率。尽管效果很好,但这也是一种代价较高的方案,特别是现
在的L2 cache SRAM部件的速度要求都很高。与上述方案不同,Pentiu
m Pro处理器是从系统的整体实现的角度出发进行设计的,其目标是利
用较低廉的存储器子系统来设计较高性能的系统。

    四、Pentium Pro处理器的创新方案
    为了避免存储器延迟问题,Pentium Pro处理器对其指令池中的后
续指令进行"前观(look-ahead),并做有用的工作,而不是停顿等待。
在上面的例子中,指令2是不可执行的,因为它依赖于指令1的执行结果
;但指令3和指令4都是可执行的。Pentium Pro处理器以推测的方式执
行指令3和指令4。由于要维持原来程序的指令顺序,推测执行(specul
ative excution)的结果不能交付给固定的机器状态(例如程序员可见
的寄存器),而是要把它放入指令池中,等待按序撤离(inorder retire
ment)。CPU内核执行指令是依赖于其准备情况的而不是程序原来的指
令顺序(它是真正的数据流引擎)。这一方案所带来的副作用是,指令
的执行一般是不守序的。
    指令1引起的cache脱靶将花销好几个内部时钟。Pentium Pro处
理器内核将继续前观其它可推测执行的指令。一般情况下,内核将观
察程序计数器指示前面的20到30条指令。在20到30条指令这一指令窗
口中平均会碰到五个转移指令。如果分派/执行单元要做有用的工作
而不是空等待,取指/解码单元必须正确地预测到这些转移。Intel体
系结构(IA)处理器所配置的寄存器比较稀少,容易造成许多对寄存器
的错误依赖。因此,分派执行单元对IA寄存器进行改名,以保证其它的
前向推测过程得以顺利进行。撤离单元管理物理IA寄存器组。只有在
撤离单元以程序原来的指令顺序从指令池中移出已执行完了的指令时
,才把结果交付给固定的机器状态。这里的机器状态是指程序员可见
的寄存器、标志和存储器的值。
    动态执行技术可以归纳如下:通过预测程序流程,分析程序的数据
流图,以选择最佳顺序执行指令,进而具备能以优先的顺序推测执行指
令的能力,从而实现最佳地调整指令的执行的功能。Pentium Pro处理
器根据进来的指令流的规定,动态地调整其工作,以实现整个执行时间
的最小化。

    五、旅行站点概览
    我们已经预先考察了Pentium Pro处理器是如何采取创新的方案
来克服系统的关键限制的方法。现在让我们走进Pentium Pro处理器
的内部更细致地研究一下它是怎样实现动态执行的。下面的图2细化
了上面的基本框图,又包括了cache和存储器
图2 三个核心引擎通过两个8K/8Kcache与存储器子系统相连接口--这
两个部件也是我们将参观的站点。我们将沿着Pentium Pro处理器的
流水线去理解每一个单元的功能。
    服指/解码单元(fetch/decode):一个守序的操作单元,它从指
令cache中取得用户程序指令流作为输入,并把它们翻译成一系列代表
上述指令流的数据流的微操作。程序的预取是它自行推测执行完成的

    服派执行单元:一个非守序的操作单元,它接收指令数据流,根
据数据依赖性和资源可用性调度执行这些微操作,并临时地保存这些
推测执行的结果。
    服离单元:一个知道怎样和何时把临时性的、推测执行的结果
交付给固定的处理器状态的守序操作单元。
    服线接口单元:一个部分地按序操作的单元,它负责将三个内部
单元与外部现实世界相连接。总线接口单元直接地跟最多可支持四个
并发的cache访问的L2 cache相互通信。此外,它还控制着一条遵循ME
SI监测协议的连向系统存储器的事务总线。

    1.旅行线上第一站:取指/解码单元
    图3给出了取指/解码单元的详图,其中:
图3 取指/解码单元的内部结构
    让我们在指令cache(ICache)处开始我们的旅程吧。ICache位于
取指/解码单元的附近,用于存放指令,以便当CPU需要时能够迅速地查
找到它们。Next-IP单元根据分支目标缓冲器(Branch Target Buffer
,BTB)的输入,陷阱/中断状态和来自整数据执行段的转移误预测指示,
提供ICache索引。BTB是一块小容量的相关存储器,它监视ICache索引
并根据转移的历史记载预测下一次将要访问的ICache索引。Pentium 
Pro处理器所采用的BTB可容纳512项,采用Yeh扩展算法,预测准确率可
以达到90%以上。现在假定没有异常情况发生,BTB的预测结果都是正
确的(Pentium Pro处理器集成了一些可以保证能够快速地从误预测中
恢复的特性,但其中大多数恢复特性都发生得很迟)。
    ICache取出与Next-IP中的ICache索引相对应的高速缓存行(cach
e line)及其下一行,送出经过对齐的16个字节给解码器。每次读取两
行是因为IA指令流是字节对齐的,而且代码分支常常转移到每一个高
速缓存行的中间或结尾处。流水线上的这一部分要花销3个时钟周期,
其中包括对预取的字节进行循环,进行调整以适应解码器ID需要的操
作。IA指令的开头和结尾处还要进行标记。
    三个并行的解码器接收带有标记字节的指令流,不断地寻找其中
的IA指令,并对其进行解码,不断地寻找其中翻译成三个一组的微操作
(每个微操作含有两个逻辑源,一个逻辑目的)。大多数IA指令都被直
接地翻译成单个微操作,有些指令被翻译成1到4个微操作。复杂的指
令需要有微代码(图3中标注MIS的方框;微代码仅仅是由经过预先编程
的常规微操作组成的集合)支持。还有一些叫做前缀字节的指令,修改
紧随其后的指令,留给解码器一大堆工作。微操作排队后,被送到寄存
器别名表(RAT)单元,在这里,逻辑的IA寄存器引用被翻译成Pentium P
ro处理器的物理寄存器引用,之后再送到分配器(Allocator)站点,分
配器给微操作加上状态信息,然后把它送入指令池中。指令池是采用
称之为重排序缓冲区(ROB)的内容可寻址存储器(Content Addressabl
eMemory)阵列实现的。内容可寻址存储器(CAM)是相关存储器(Associ
ative Memory)的同义词。它是指不能使用显示索引而是借助于其中
所含的数据进行访问的一张表。
    现在我们已经走到了守序流水线的尽头了。

    2.旅行线上第2站:分派/执行单元
    分派单元按照微操作的状态从指令池中选取它们。如果其状态指
示微操作所需的操作数都齐备了,分派单元再去查看该微操作所需的
执行资源(excution resource)是否空闲可用,如果这两项都准备好了
,它就把这条微操作移出来,发往所考查的执行资源,并在那里执行。
微操作的结果稍后返回到指令池中。储备站(Reservation Station)
有5个端口,多个执行资源的访问方式如下面的图4所示。
    Pentium Pro处理器高峰时每个时钟可以调度5个微操作,一个微
操作对应于一个资源端口。典型的维持处理能力是每个时钟调度3个
微操作。这种调度方式是精典的非守序处理过程;微操作是严格地按
照数据流的约束条件及执行资源的可用性来分派到执行资源的,而与
程序原来的指令顺序无关。
图4 分派/执行单元的内部结构
    注意这种执行调度的处理过程所选用的实际算法对性能是非常重
要的。如果在每个时钟周期内,每个资源端口只有一个操作数据准备
好,那么就不存在选择问题了。但是;如果有几个微操作数据都准备好
了,那么它应该选择哪一个微操作呢?它可以从中随机地选择一个,或
者采取先来先服务的策略。理想情况下,它应该选择能够缩短正在运
行着的程序的整个数据流图(data flow graph)的那一个微操作。由
于在运行时没有什么办法能真正地搞清楚这一点,该单元采用了一个
优先支持背对背(back-to-back)微操作的伪FIFO调度算法,来近似上
述理想算法。
    注意许多微操作属于转移型微操作,这是因为许多IA指令是转移
指令。分支目标缓冲器(BTB)会正确地预测出来其中的绝大部分转移,
但它不可能把它们全部都正确地预测出来。考虑BTB正确地预测出一
个循环底部的一个向后转移的情形:该循环逐次地走向结束,当它恰好
处于结束的那一次时,这个转移的预测结果就是错误的了,因为循环结
束时,CPU该执行循环下面的指令了。转移微操作的尾部缀联着由守序
流水线给其加上的空地址和为其预测的目的操作数。当转移微操作执
行时,它实际上做了的工作要与预测硬件指示它做的工作相比较,如果
二者相符合,那么转移微操作将逐渐地撤离,在转移微操作后面在指令
池中所进行的绝大多数推测执行的工作都是有效的。如果二者之间不
相符合(预测发生一个转移但实际上没有发生,或者预测不发生转移但
实际上发生了),那么跳转执行单元(JEO)将修改转移微操作后面的所
有的微操作的状态,并从指令池中将它们移出去。在这种情况下,将向
BTB提供正确的转移目的操作数,BTB将从新目标地址处重新启动整个
流水线。

    3.旅行线上第3站:撤离单元
    图5给出了撤离单元的详图。
图5 撤离单元的内部结构
    撤离单元也要检查指令池中的微操作状态--它寻找指令池中已经
执行过的从而可以移出去的微操作。一旦移出指令池,这些微操作将
根据原来的IA指令写入其原来的结构目标。撤离单元不仅要检查哪些
微操作已经完成,它还必须重新地按程序原来的指令顺序对它们进行
排序。而且它还得在中断、陷阱、出错、断点和误预测的干扰下完成
这些工作。
    处理器专门留出了两个时钟周期给撤离处理过程。撤离单元首先
必须读指令池,找到潜在的等待撤离的微操作,并确定这些待选的微操
作中哪一个是原来程序顺序中的下一个微操作。然后它把本周期内撤
离操作的结果分别写入指令池和撤离寄有器组。撤离单元在每个时钟
周期内可以撤离3个微操作。

    4.旅行线上的第4站:总线接口单元
    图6给出了总线接口单元的详图。
图6 总线接口单元的内部结构
    有两种存储器访问方式:装载(load,相当于读)和存储(store,相
当于写)。装载操作只需要指定要访问的存储器地址、被检索的数据
的宽度和目的寄存器。装载操作被编码成一个微操作。存储操作需要
提供存储地址、数据宽度以及将要写入的数据。因此存储操作需要用
两个微操作,一个用于生成地址,另一个用于生成数据。这两个微操作
是相互独立地进行调度的,以便最大限度地提高它们的并发性。随后
还必须在存储缓冲器中将它们重新结合起来,以完成存储操作。
    存储操作决不可采用推测执行的方式完成,也不存在取消它们的
透明的方法,也不能对存储操作进行重新排序。存储缓冲器(Store Bu
ffer)只有在一个存储操作其地址和数据都已准备好,而且没有更早的
存储操作等待执行的时候,才分派它。
    推测执行的内核对外部世界具有什么样的影响?基本结论如下:
    服须禁止存储操作越过其它存储操作,因为这样做对性能只有
很小的影响。
    服以禁止存储操作越过装载操作,因为这样做仅会引起次要性
能的损失。
    服止装载越过其它装载或其它存储将对性能产生极为显著的不
利影响。
    因此,我们需要一个能允许装载越过存储的存储器子系统结构,而
且我们需要使装载能够越过装载。存储器排序缓冲器(Memory Order 
Buffer,MOB)完成了这一任务,满足了我们的要求,其行为类似于储备
站(Reservation Station)和重排序缓冲器(Re-Order-Buffer),它保
持悬挂的装载和存储操作,并在阻塞(依赖性或资源引起的)消失时,重
新地分派它们。

    六、旅行总结
    正是改进的转移预测(给核心提供较多的指令)、数据流分析(选
择最合适的指令进行操作)与推测执行(以优先的顺序执行指令)三项
技术的结合,才促成了Pentium Pro处理器在采用与Pentium相同的半
导体制造工艺的条件下,使性能提高了一倍。这种奇妙的结合称为动
态执行,其相对于Pentium的影响不亚于"超标量(Superscalar)"技术
相对于其前代Intel体系结构处理器的影响。
    (宋诗平编译自Intel资料。)

--
※ 来源:.龙门客栈 bbs.newsnet.net.cn.[FROM: 202.96.154.57]

[关闭][返回]