首页 随笔 乐走天涯 程序资料 评论中心 Tag 论坛 其他资源 搜索 联系我 关于 RSS

MMX技术开发者手册:第二章 处理器体系结构和流水线简介(一)


日期: 2000-06-12 14:00 | 联系我 | 关注我: Telegram, Twitter

  本节简要介绍了具有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™ 技术程序员参考手册》(Intel Architecture MMX™ Technology Developer's Manual)。

2.1.2 动态执行(P6系列)流水线

  P6系列处理器使用动态执行结构。该结构通过硬件寄存器重命名和分支预测的方法,将乱序执行和推测执行合成在一起。这些处理器有一个有序进入的流水线,它将Intel 386™的宏指令支解成简单的微操作(或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位处理器优化方案》(Optimizations for Intel's 32-bit Processors, Application Note AP-526, Order Number 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.对同一个地址读和写的指令可安排在同一时钟周期。

标签: MMX 优化 |

 文章评论
目前没有任何评论.

↓ 快抢占第1楼,发表你的评论和意见 ↓

发表你的评论
如果你想针对此文发表评论, 请填写下列表单:
姓名: * 必填 (Twitter 用户可输入以 @ 开头的用户名, Steemit 用户可输入 @@ 开头的用户名)
E-mail: 可选 (不会被公开。如果我回复了你的评论,你将会收到邮件通知)
反垃圾广告: 为了防止广告机器人自动发贴, 请计算下列表达式的值:
9 x 2 + 2 = * 必填
评论内容:
* 必填
你可以使用下列标签修饰文字:
[b] 文字 [/b]: 加粗文字
[quote] 文字 [/quote]: 引用文字

 
首页 随笔 乐走天涯 猎户星 Google Earth 程序资料 程序生活 评论 Tag 论坛 资源 搜索 联系 关于 隐私声明 版权声明 订阅邮件

程序员小辉 建站于 1997 ◇ 做一名最好的开发者是我不变的理想。
Copyright © XiaoHui.com; 保留所有权利。