打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
第二章 处理器体系结构和流水线简介
INTEL 体系结构 MMX? 技术开发者手册
第二章 处理器体系结构和流水线简介
本节简要介绍了具有MMX?技术的奔腾处理器和动态执行(P6系列)处理器的流水线及其结构特征。在了解了代码在处理器总线上的执行过程之后,你将会了解为什么这种优化方法能够提高代码的运行速度。另外,它将帮助你调度和优化你的应用程序,以获得更高的运行效率。
2.1 超标量(奔腾系列)的流水线和动态执行(P6系列)体系结构
2.1.1 超标量(奔腾系列)的流水线
奔腾处理器是一个高级的超标量处理器。它是建筑在两个通用的整型流水线和一个可流水作业的浮点单元上的,这使处理器能够同时执行两条整型指令。一个对软件透明的动态分支预测机制能够使分支的流水线阻塞达到最小化。具有MMX?技术的奔腾处理器将为流水线增加新的处理阶段。MMX?流水线与整型流水线的集成方法非常相似。
奔腾处理器可以在一个时钟周期内完成两条指令,一个流水线完成一条指令。第一个逻辑管道称之为“U”管道,第二个称之为“V”管道。在任何一条给定的指令译码期间,它安排的后面两条指令将被检查。并且,如果有可能,第一条指令被安排到“U”管道执行,第二条指令被安排到“V”管道执行。如果不能,则第一条指令被安排到“U”管道执行,“V”管道中不安排指令运行。
指令在两个管道中运行与它们顺序执行所产生的效果是完全一样的。当发生管道阻塞时,后继的指令无法通过被阻塞的指令所在的任一管道中。图2-1说明了这种调度的流水线结构。
图2-1 MMX?流水线结构
具有MMX?技术的奔腾处理器为整型流水线增加了一个额外的处理阶段。指令从代码的高速缓冲区中预取出来,被送入到“预取”(PF)阶段,并且在“提取”(F)阶段中进行指令的语法分析。另外,全部的前缀译码都在F阶段中进行。
指令在先进先出(FIFO)的指令缓冲区中将语法分析与指令译码分开,这个缓冲区位于F阶段与译码1(D1)阶段之间。FIFO缓冲区的空间能够将被处理的指令上升到四条指令。FIFO缓冲区是透明的,当它为空时,不增加额外的迟延。
在每个时钟周期内,可将两条指令压到指令的FIFO缓冲区中(根据有效的代码字节,以及其它因素,如前缀)。然后,再将成对的指令从FIFO缓冲区中弹出来,送到D1阶段中。由于指令的平均执行效率为每个时钟周期内不超过两条指令,所以FIFO通常是满的。只要FIFO是满的,就可以防止在指令提取和进行语法分析时产生的阻塞。如果发生了这样的阻塞,FIFO也可以使阻塞不在管道的执行阶段上发生。但如果FIFO空,由于流水线中无指令运行,则可能会导致一个执行阻塞。较长的指令或前缀可能会在FIFO入口处产生阻塞(参见3.2.3节和3.4.2节)。
下面的图表详细说明了超标量处理器中的MMX?流水线以及流水线中发生阻塞的条件。
图2-2 在具有MMX?技术的奔腾处理器中的MMX?指令流
表2-1详细说明了每类MMX?指令的功能单元、迟延、吞吐量和执行管道。
表2-1 MMX?指令和执行单元
操作 功能单元个数 迟延 吞吐量 执行管道
ALU 2 1 1 U和V
乘法器 1 3 1 U或V
移位/成组/分组 1 1 1 U或V
内存访问 1 1 1 U
整型寄存器访问 1 1 1 U
算术逻辑单元(ALU)用于执行算术和逻辑操作(即加、减、异或、与)。
乘法器单元执行全部的乘法操作。乘法要求三个时钟周期,但通过流水线安排,可在每个时钟周期内完成一条乘法操作。处理器仅有一个乘法器单元,也就是说,不能同时运行两条乘法指令。但是,乘法指令可以同其它类型的指令配对而同时运行。它们可以在U管道或V管道中运行。
移位单元执行全部的移位、成组或分组操作。由于同一时间只有一个移位器可以有效地进行移位、成组或分组操作,所以不能与其它移位单元的指令进行配对。但移位单元的指令可以和其它类型的指令配对运行。它们可以在U管道或V管道中运行。
MMX?指令只能在U管道中执行访问内存或整型寄存器,且不能与非MMX?指令配对运行。
当对一个MMX?寄存器修改后,需经过两个时钟周期后,才能将MMX?寄存器移到内存或整型寄存器中。
有关指令配对的信息请见3.3节。
其它信息和指令格式请见《INTEL体系结构 MMX? 技术程序员参考手册》(IntelArchitecture MMX? Technology Developer's Manual)
2.1.2 动态执行(P6系列)流水线
P6系列处理器使用动态执行结构。该结构通过硬件寄存器重命名和分支预测的方法,将乱序执行和推测执行合成在一起。这些处理器有一个有序进入的流水线,它将Intel386?的宏指令支解成简单的微操作(或UOP)和一个可以处理这些微操作的乱序的超标量处理器内核。这个乱序的处理器内核包含了几条流水线,连接了整型、跳转、浮点和内存执行单元。几种不同的执行单元可以集成在同一条流水线上。例如:一个整型地址逻辑单元和浮点执行单元(加法器、乘法器和除法器)同享一个流水线。数据高速缓冲区由一个专用的读取端口和其它的存储端口交错而成。大多数简单操作(整型ALU,浮点加法,甚至浮点乘法)可以按每时钟周期完成一至两个操作的吞吐量进行流水作业。浮点除法不可以进入流水线,长迟延操作可以和短迟延操作并行处理。
P6系列的流水线由三部分构成:有序组织的前端(In-Order Issue Front-end)单元,乱序内核(Out-of-Order Core)单元和有序的退出(In-Order Retirement)单元。下面将详细介绍有序组织的前端单元。
图2-3 乱序内核与退出流水线
由于动态执行处理器按乱序的方式执行指令,所以产生了数量充足的、可供执行的微操作,并使大多数有关性能调节方面的考虑得以实现。正确的分支预测和快速的译码是有序前端单元提高性能的核心。有关分支预测和分支目标缓冲区的详细内容见2.3节,下面讨论译码部分。
在每个时钟周期内,ID1管道阶段可以对多达3条的Intel体系结构宏指令进行译码。但是,如果指令复杂或指令长度超过了7个字节,译码器的译码指令数将有所下降。
译码器可以译码:
(1) 每个时钟周期多达三条宏指令。
(2) 每个时钟周期多达六条微操作。
(3) 指令长度大于7的宏指令。
P6系列处理器在D1阶段上有3个译码器。第一个译码器可在每个时钟周期完成一个由四个以下微操作构成的宏指令,其它两个译码器在每个时钟周期内完成一个由一个微操作构成的宏指令。由多于4个微操作构成的指令将耗费多个时钟周期来完成译码,在使用汇编语言编程时,按4-1-1微操作序列来安排指令将增加每个时钟周期内的译码指令数。通常:
简单的寄存器——寄存器格式的指令仅用一个微操作。
读取指令仅为一个微操作。
存贮指令为两个微操作。
简单的读-修改指令为两个微操作。
简单的寄存器——内存格式的指令由2-3个微操作构成。
简单的读-修改-写指令由4个微操作构成。
复杂的指令通常超过4个微操作,故需耗费多个时钟周期译码。
为了计算微操作,MMX?指令都是简单指令,见《Intel的32位处理器优化方案》(Optimizationsfor Intel's 32-bit Processors, Application Note AP-526, OrderNumber 242816)。附录D是一个说明Intel体系结构指令集中每一指令所用微操作数的表。
一旦微操作被译码,它们从有序前端单元发送到保留(RS)站中,保留站是乱序核心管道阶段的开始部分。在RS中,微操作等待它们的操作数变为有效。一旦一条微操作的所有操作数有效,它将从RS中被送到一个执行单元。如果一个微操作在数据准备好的状态下进入RS(即为全部数据有效),那么该微操作将立即被送到一个合适的且有效的执行的单元中。在这种情况下,在RS中的微操作只耗费了很少的时钟周期,全部的执行单元聚集在RS的输出端口上,一旦微操作执行完将返回到ROB,并等待退出。在这个管道阶段中,全部数据值被回写到内存并且全部的微操作按序退出,一次三条。下图提供了有关乱序核心和按序退出管道阶段的细节。
图2-4 乱序内核和退出流水线
表2-2 动态执行(P6-系列)处理器流水线执行单元
端口 执行单元 迟延/吞吐量
0 整型ALU单元 迟延1,吞吐量1/每周期
LEA指令 迟延1,吞吐量1/每周期
移位指令 迟延1,吞吐量1/每周期
整数乘法指令 迟延4,吞吐量1/每周期
浮点单元
FADD指令 迟延3,吞吐量1/每周期
FMUL指令 迟延5,吞吐量1/2每周期1,2
FDIV单元 迟延长,数据多,不可流水作业的吞吐量
MMX?ALU单元 迟延1,吞吐量1/每周期
MMX?乘法单元 迟延3,吞吐量1/每周期
1 整型ALU单元 迟延1,吞吐量1/每周期
MMX?ALU单元 迟延1,吞吐量1/每周期
MMX?移位单元 迟延1,吞吐量1/每周期
2 取单元 命中高速缓存时,迟延3,吞吐量1/每周期4
3 存贮地址单元 迟延3,(非适用)吞吐量1/每周期3
4 存贮数据单元 迟延3,(非适用)吞吐量1/每周期
注释
1.FMUL单元在接收第一个FMUL后,在下一时钟周期内不能接收第二个FMUL,但这并不是说只能在偶数时钟周期内执行FMUL。
2.流水线上每两个时钟周期处理一个FMUL。可以视为P6系列处理器只有一个32x32->乘法流水线。
3.存贮迟延对于数据流的全局来说并不十分重要。重要的是相应操作何时结束并退出。不同的存贮情况所产生的迟延也不同。例如,在时钟周期10,对一个部分地址进行数据存贮和地址存贮时,如地址100,在时钟周期10也可以对同样地址100读取(同样大小和类型),且不被阻塞。
4.对同一个地址读和写的指令可安排在同一时钟周期。
2.2 高速缓存(Cache)
具有MMX?技术的处理器的在片高速缓存子系统,是由两个16K的4路线长为32字节的关联高速缓存体构成。高速缓存具有一个回写机制和一个伪LRU的置换算法。数据的高速缓存由八个按四字节边界交错的存贮体构成。
在具有MMX?技术的奔腾处理器上,只要引用的数据不在同一个高速缓存体上,就可以被一条读取指令和一条存贮指令同时访问。在具有MMX?技术的奔腾处理器上,高速缓存访问失败的迟延为8个内部时钟周期。在具有MMX?技术的动态执行处理器中,最小迟延是10个内部时钟周期。
2.3 分支目标缓存
具有MMX?技术的奔腾处理器和动态执行处理器在分支预测方面,除一个较小的异常处理外(本书2.3.1节中讨论),在功能上完全一样。
分支目标缓冲区(BTB)存贮了预先所见的分支和它们的目标。当一个分支被预取后,BTB将目标地址直接填入到指令读取单元(IFU)。一旦分支被执行,BTB将随着目标地址而改变。使用分支目标缓存时,预先所见的分支被动态预告。分支目标缓存的预测算法包括了模式匹配和每目标多达4位的预测历史位。例如,一个具有4个迭代长度的循环将百分之百地被正确预测到。遵循下列原则将提高预测性能:
编写条件分支(除循环外)可将最常执行的分支紧接在分支指令后(即失败)。
另外,具有MMX?技术的处理器有一个堆栈返回缓存(RSB, Return Stack Buffer),可以连续地为不同地址上调用的过程正确地预测其返回地址,进一步为展开具有函数调用的循环带来了益处,并删除了某些需要in-line的过程。
2.3.1 相连分支
另外,在具有MMX?技术的奔腾处理器上,如果两个分支指令的最后一个字节在同一个按四字节对齐的内存段内,则分支不可预测。如下图所示:
图2-5 相连分支的例子
这种情况,发生在两个相连分支间没有间隔指令且第二个指令只有两个字节长的情况下(如+/-128字节的相对跳转指令)。
为避免这种无法预测的情况,应使第二分支加长,在分支指令中用16位的相对位移代替8位的相对位移。
2.4 写缓存
具有MMX?技术的处理器具有4个写缓存(相对无MMX?技术的奔腾处理器的两个写缓存)。另外,写缓存可以被U管道使用,也可以被V管道使用(相对无MMX?技术的奔腾处理器的一个写缓存对应一个管道的情况)。通过对内存写操作进行安排调度,可以提高关键循环的性能。如果你不想看到写未命中,每组指令不能安排多于4条写指令。并在安排另外的写指令前调度其它指令。
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
深入浅谈,CPU设计原理(已完结)
Intel® Nehalem/Westmere架构/微架构/流水线 (1) - 特性概述
浅谈分支预测、流水线与条件转移
微体系结构
轻松读懂移动处理器 CPU微架构全解析
特斯拉自研芯片架构带来的启示
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服