momo zone

调核人的blog

超流水线,超标量和SIMD

继续回顾整理自己的己

流水线

流水线技术是一种将每条指令分解为多步,并让各步操作重叠,从而实现几条指令并行处理的技术。程序中的指令仍是一条条顺序执行,但可以预先取若干条指令,并在当前指令尚未执行完时,提前启动后续指令的另一些操作步骤。这样显然可加速一段程序的运行过程。
市场上推出的各种不同的1 6位/ 3 2位微处理器基本上都采用了流水线技术。如8 0 4 8 6和P e n t i u m均使用了6步流水线结构,流水线的6步为:
( 1 ) 取指令。C P U从高速缓存或内存中取一条指令。
( 2 ) 指令译码。分析指令性质。
( 3 ) 地址生成。很多指令要访问存储器中的操作数,操作数的地址也许在指令字中,也许要经过某些运算得到。
( 4 ) 取操作数。当指令需要操作数时,就需再访问存储器,对操作数寻址并读出。
( 5 ) 执行指令。由A L U执行指令规定的操作。
( 6 ) 存储或”写回”结果。最后运算结果存放至某一内存单元或写回累加器A。
在理想情况下,每步需要一个时钟周期。当流水线完全装满时,每个时钟周期平均有一条指令从流水线上执行完毕,输出结果,就像轿车从组装线上开出来一样。P e n t i u m、Pentium Pro和Pentium II处理器的超标量设计更是分别结合了两条和三条独立的指令流水线,每条流水线平均在一个时钟周期内执行一条指令,所以它们平均一个时钟周期分别可执行2条和3条指令。
流水线技术是通过增加计算机硬件来实现的。例如要能预取指令,就需要增加取指令的硬件电路,并把取来的指令存放到指令队列缓存器中,使M P U能同时进行取指令和分析、执行指令的操作。因此,在1 6位/3 2位微处理器中一般含有两个算术逻辑单元A L U,一个主A L U用于执行指令,另一个A L U专用于地址生成,这样才可使地址计算与其它操作重叠进行。

超流水线

超级流水线以增加流水线级数的方法来缩短机器周期,相同的时间内超级流水线执行了更多的机器指令。采用简单指令以加快执行速度是所有流水线的共同特点,但超级流水线配置了多个功能部件和指令译码电路,采用多条流水线并行处理,还有多个寄存器端口和总线,可以同时执行多个操作,因此比普通流水线执行的更快,在一个机器周期内可以流出多条指令。

一般而言,CPU执行一条指令需要经过以下阶段:取指->译码->地址生成->取操作数->执行->写回,每个阶段都要消耗一个时钟周期,同时每个阶段的计算结果在周期结束以前都要发送到阶段之间的锁存器上,以供下一个阶段使用。所以,每个时钟周期所消耗的时间就是由以上几个阶段中的耗时最长的那个决定的。假设耗时最长的阶段耗时为s秒,那么时钟频率就只能设计到1/s赫兹(这里不考虑阶段间信号传递的时间和锁存器的反应时间)。

那么,要提高时钟频率,一种可能的方法就是减小每个阶段的时间消耗。其中一种最简单的办法,就是将每个阶段再进行细分成更小的步骤,同样是细分后的每个阶 段,单个阶段的运算量小了,单位耗时s也就减少,这样实际上就是提高了时钟频率。这种将标准流水线细分的技术,就是超级流水线技术。当然,流水线和超级流 水线之间并没有很明显的区别。这样的技术,虽然提高了CPU的主频,但是也带来了很大的副作用:

首先,细分后的每一个阶段都要在其后使用锁存器锁存,因此将一个阶段细分为N的子阶段并不能让单位时间减少到s/N, 而是s/N + d, 其中d为锁存器的反应时间。这实际上就是增加了多余的时间消耗。

其次,随着流水线级数的加深,一旦分支预测出现错误,会导致CPU中大量的指令作废,这样的消耗是十分巨大的。

以上原因,也就是什么Pentium IV具有31级的流水线,指令的执行效率却赶不上只有14级流水线的Pentium M。

流水线技术针对的都是一条指令所做的优化,如果要进行多指令优化则需要下面的超标量技术

超标量
  超标量(superscalar)是指在CPU中有一条以上的流水线,并且每时钟周期内可以完成一条以上的指令,这种设计就叫超标量技术。 其实质是以空间换取时间。而超流水线是通过细化流水、提高主频,使得在一个机器周期内完成一个甚至多个操作,其实质是以时间换取空间。

SIMD

SIMD是Single Instruction Multiple Data(单指令流多数据流),由名称我们就能猜到SIMD技术的真正含义,以及该技术促进处理器性能提高的原因。事实上,SIMD回答了与时钟速度提高 比较而言,如何导致了处理时间的非比例的减少。原理很简单,就让我们看一下奇迹是怎么发生的吧。
通常,汇编程序的处理数据及指令依次在处理器 中处理执行,一个接一个,每个CPU的周期可以执行一个操作或者一个复杂操作的一部分。因此,要提高处理速度可以提高处理器的应答频率或时钟速率,因而提 高连续工作量的处理速度。但还存在另一种完全不同的办法,也即改进逐个处理数据的方式。试想一下,基于不同的数据集,实现相同操作的并行处理该多好啊。这 恰恰是SIMD技术要做的。SIMD实现了一个单独的指令,它可以实现同时在多个数据包上的运算。
SIMD汇编程序实现了同一指令同时在多个 寄存器上的执行。相比之下,旧有的普通汇编程序在每个所要进行数据处理的寄存器上,都要调用完全相同的指令。从技术角度讲,这不完全正确,但对于我们来 说,这种理解已经足够。实际上,SIMD指令也会一个指令对应一个寄存器,其中的诀窍是寄存器中并非仅仅包含一个数据包,而应该是多个。可以说,SIMD 指令使用的寄存器比旧有的32位寄存器要大一些。SIMD寄存器或多或少有点象你可以同时操作的一个数组内的变量,在同一CPU周期内并行执行。
或许举个应用的例子更容易理解。比如一个三维向量,需要用3个32位大小的浮点数来描述。不使用SIMD的情况下就要动用3个32位的寄存器来描述这个向量。如果进行两个向量的想加运算则需要6个32位寄存器和3次加法运算。如果使用SIMD 技术那么将会启用SIMD的专用寄存器,宽度96位,然后用专用的SIMD指令做一次加法就能完成全部运算。

这里之所以能一次就能完成全部运算,就是因为SIMD指令及SIMD 寄存器被SIMD预处理单元拆分多个相同而且并行的执行流,处理完毕后再合并在一起,得出结果。

注意SIMD的实现针对的是专用指令集,对于intel 而言就是SSE 对于amd 而言就是3D now。

Advertisements

发表评论

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / 更改 )

Twitter picture

You are commenting using your Twitter account. Log Out / 更改 )

Facebook photo

You are commenting using your Facebook account. Log Out / 更改 )

Google+ photo

You are commenting using your Google+ account. Log Out / 更改 )

Connecting to %s

%d 博主赞过: