从Pentium III到扣肉 SSE指令集发展历程回顾

从Pentium III到扣肉 SSE指令集发展历程回顾

作者:八戒 出处:天极网 责任编辑: 寒冬 [ 2006-08-24 00:01 ]
前言:

  自最简单的 电脑开始,指令序列便能取得运算对象,并对它们执行计算。对大多数电脑而言,这些指令同时只能执行一次计算。如需完成一些并行操作(如立体声左、右声道,或显示器的红、绿、蓝混合),就要连续执行多次计算。此类电脑采用的是“单指令单数据”(SISD)处理器。

  然而,现实世界的大多数计算都会同SISD模型冲突。比如对麦克风传来的左、右立体声道进行简单过滤处理时,需将之前的几个采样值累加起来,再同当前值加到一起,再除以采样次数,必须重复计算左、右声道。看来似乎颇为简单,但在实际应用中,每次采样都必须作同样的计算。如决定使用CD音质,那么每秒种都要对左、右声道执行44100次采样,总共便要计算88200次。

  为获得LeftSum和RightSum的结果,分别要执行6条指令。所以为确保获得连贯的CD音质,每秒钟要执行的指令总数为:44100次采样×2个声道×6条指令=529000条!电脑显示的道理与此相似,但情况会糟得多—想想在1024×768的分辨率和24位真彩色下,假定每秒显示30帧(虽然好但非特别出色的3D加速性能),仅仅为了访问每个像素,而不做任何实际工作,每秒便要执行70778880条指令,这显然是个沉重的负担。设想一下,假如有这样的一种处理器,虽然它只能执行单个指令序列,但能将那些指令同时应用于几个独立的数据流,速度显然就会快上许多。我们称之为“单指令多数据”(SIMD)处理器。而我们平常所说的SSE(Streaming SIMD Extensions)便属于此类单指令多数据。

  自SSE起,到目前已经历经4代,每一次改进都为我们带来或多或少的惊喜。因此今天我们就简单介绍一下SSE的发展历程,希望能对你在了解处理器技术发展时有所帮助。

一、SSE指令集

  在了解SSE之前,我们先说说多媒体指令集的发展。在SSE发布之前,英特尔的P2主要以MMX多媒体指令集为主。不过随着AMD发布K6-2,MMX早已经成为历史,取代它的是“3D NOW!”和SSE。AMD当时的“3D NOW!”把提升CPU的3D效能作为一个主要要求,在相当程度上弥补了AMDK6芯片浮点处理能力上的不足,使得廉价的非Intel芯片能够拥有超过奔腾的3D性能,因此K6-2在市场上大获成功,使得Intel的PⅡ备受打击,并直接导致了Intel“新赛扬”的出笼。

  “3D NOW!”如此成功,以致它成了AMD的一大骄傲,并不断在它的基础上改进加强,一直在Athlon上还能见到它的身影。为此,Intel在Pentium III中引入更先进的SSE指令集。

  其实,早在PIII正式推出之前,Intel公司就曾经通过各种渠道公布过所谓的KNI(Katmai New Instruction)指令集,这个指令集也就是SSE指令集的前身,并一度被很多传媒称之为MMX指令集的下一个版本,即MMX2指令集。究其背景,原来“KNI”指令集是Intel公司最早为其下一代芯片命名的指令集名称,而所谓的“MMX2”则完全是 硬件评论家们和媒体凭感觉和印象对“KNI”的评价,Intel公司其实从未正式发布过关于MMX2的消息。而最终推出的SSE指令集也就是所谓胜出的“互联网SSE”指令集。

  SSE指令集包括了70条指令,其中包含提高3D图形运算效率的50条SIMD(单指令多数据技术)浮点运算指令、12条MMX 整数运算增强指令、8条优化内存中连续数据块传输指令。理论上这些指令对目前流行的图像处理、浮点运算、3D运算、视频处理、音频处理等诸多多媒体应用起到全面强化的作用。SSE指令与3DNow!指令彼此互不兼容,但SSE包含了3DNow!技术的绝大部分功能,只是实现的方法不同。SSE兼容MMX指令,它可以通过SIMD和单时钟周期并行处理多个浮点数据来有效地提高浮点运算速度。那么SSE能为我们带来什么呢?

  与P2时代的MMX相比,SSE也是在原来的处理器指令集的基础上添加的扩展指令集,都是SIMD(单指令多数据)指令,不同的是他们处理的数据类型不同. MMX只能在整数上支持SIMD,而SSE指令增加了单精度浮点数的SIMD支持.MMX可以进行同时对2个32位的整数操作,而SSE可以同时对4个32位的浮点数操作。MMX和SSE的一个主要的区别是MMX并没有定义新的寄存器,而SSE定义了8个全新的128位寄存器,每个寄存器可以同时存放4个单精度浮点数(每个32位长),他们在寄存器中排列顺序见下图。


新数据类型排列

  这里有一个问题,既然MMX没有定义新的寄存器,那么她又有什么寄存器可操作呢?事实上,MMX是和原来的浮点寄存器共享的.一个浮点寄存器是80位长的,她的低端64位被用做MMX的寄存器.这样,一个应用 程序就不能在执行MMX指令的同时进行浮点操作了.同时,处理器还要花掉大量的时钟周期去维护寄存器状态从MMX操作和浮点操作之间的切换。SSE指令集就没有这些限制了。由于她定义了全新的寄存器,应用程序可以在进行整数SIMD操作(MMX)的同时进行浮点数的SIMD操作(SSE),同样,SSE还可以在执行浮点数的非SIMD操作的同时进行SIMD操作。

  MMX和SSE的寄存器排列见下图:


MMX和SSE的寄存器:(a)是MMX和浮点数共享一个寄存器的情况,(b)是SSE的独立寄存器排列MMX和SSE寄存器有一个共同点,那就是都有8个寄存器.MMX的寄存器被命名为mm0—mm7,SSE的寄存器名字是xmm0—xmm7。?Pentium III的SSE指令集是为SIMD设计的,她可以同时操作4个单精度浮点值.因此,利用这些加强的浮点计算能力,对3D应用程序的细节表现是有实质性的提高的。事实上,SSE就是为3D应用创建的.游戏和其他的使用后端3D来显示2D和2.5D图象的程序,和使用矢量图形的应用程序一样都能分享到这种好处。

  电脑表示的3D图形是用大量的表示图形顶点的浮点数组成的,通过操作这些顶点数据就可以改变3D图形的外观.通过使用SSE指令集,应用程序可以获得更多的帮助,处理器可以在一个时钟周期内处理更多的数据,大大加快了3D图形的顶点计算速度,可以给用户带来更深刻的3D体验。同样,应用程序开发者还可以用更多的顶点数据和更复杂的算法来创造出更为生动的3D图象效果来。使用SSE指令集可以显著的改善一些在3D操作中经常用到的计算,像矩阵乘法、矩阵变换以及矩阵之间的加、减、乘、向量矩阵相乘、矢量化、 矢量点相乘和光照计算等等。

  比如玩Quake时,3D对象均由多边形构成,而这些多边形以一系列点的形式保存。每个点都有对应的3轴坐标。如限制成只用整数,便不能精确地表示这些位置(如每个坐标轴使用16位,那么只能得到65536个坐标点),造成图形显示非常糟糕。

  自奔腾开始,Intel各型处理器的浮点运算能力便非常强大,游戏开发者几乎都情愿选用浮点运算。由于MMX不能对浮点进行操作(更糟的是,从MMX切换到浮点模式时,还会造成性能的瞬间剧降),所以MMX并不能将游戏提速至比设备驱动程序更高的一个水准,这正是MMX令许多人失望的原因。假如你用3D加速卡做图形渲染,游戏中完成的运算(模拟、3D变形、照明等)会耗去约90%的处理器时间。也就是说,MMX只为处理器留出了10%的时间来做其它工作,这还是在你使用了3D卡的前提下。

  而SSE可以有效解决了这个问题,除保持原有的MMX指令外,又新增了70条指令,在加快浮点运算的同时,也改善了内存的使用效率,使内存速度显得更快一些。对于用户来说,这意味着3D物体更生动,表面更光滑,“虚拟现实”更“现实”。按Intel当时的说法,SSE对下述几个领域的影响特别明显:3D几何运算及动画处理;图形处理(如Photoshop);视频编辑/压缩/解压(如MPEG和DVD);语音识别以及声音压缩和合成。

  SSE另一大优点是可以大大减小数据计算的指令操作数目.如果不使用SIMD和SSE,要进行一个400次的浮点数乘法计算,需要循环使用400次的乘法指令。而如果使用了SIMD和SSE,则只要进行100次的乘法指令就可以完成相同的任务了,因为这里每次的乘法操作都可以同时对4个浮点数进行计算。

  SSE指令可以说是将Intel的MMX和AMD的3DNow!技朮相结合的产物,由于3DNow!使用的是浮点寄存方式,因而无法较好地同步进行正常的浮点运算。而SSE使用了分离的指令寄存器,从而可以全速运行,保证了与浮点运算的并行性。尤其是两者所使用的寄存器差异颇大─3DNow!是64位,而SSE是128位。同时为了充分发挥SSE的优势,Intel引进了新的“处理器分离模式”以提高浮点运算速度。

代表之作:PentiumIII

从Pentium III到扣肉 SSE指令集发展历程回顾_第1张图片
老PentiumIII,挺着眼的!

从Pentium III到扣肉 SSE指令集发展历程回顾_第2张图片
新封装的PentiumIII

  不过,要发挥SSE的速度优势,要满足以下条件:使用DirectX 6 API开发应用程序;使用支持SSE的图形驱动程序;使用支持“处理器分离模式”的操作系统等。由于SSE要求软件的数据结构重写,又比“3D NOW!”晚推出了9个多月,因此市场上使用“3D NOW!”的系统装机量远远超过SSE。基于以上种种原因,SSE一直没有得到充分的发展。直到Pentium 4发布之后,开发人员看到使用SSE指令之后,程序执行性能将得到极大的提升,于是Intel又在SSE的基础上推出了更先进的SSE2指令集。

二、SSE2指令集

  SSE2是Intel第2代浮点多媒体处理器指令集,是英特尔为了应对AMD的3Dnow!+指令集而在SSE的基础上开发的指令集。它主要增加了144条新建指令,使得其处理器性能有大幅度提高。

从Pentium III到扣肉 SSE指令集发展历程回顾_第3张图片

  SSE2有8个128-bit寄存器,但在这里不能存储 4个32-bit的浮点数据,而是 2个64-bit的浮点扩展精度数据。SSE2涉及了多重的数据目标上立刻执行一单个的指令(即SIMD)。最重要的是SSE2能处理128位和两倍精密浮点数学运算。处理更精确浮点数的能力使SSE2成为加速多媒体程序、3D处理工程以及工作站类型任务的基础配置,非常适于执行3D渲染、图形驱动、游戏和多媒体编码等应用。而当时Athlon系列处理器支持MMX(整数)和SSE、3DNow!(单精度浮点)等指令集,不过并不支持SSE2。

  共有144个全新的指令可做任何事情,这也是当初SSE2推出所想达成之目标。长度为 128-bit压缩的数据,在SSE时,该仅能以4个单精确浮点值的形式来处理;但在SSE2下,该数据能选用下列几种数据表达来处理。

·4个单精确浮点数(SSE)
·2个双倍精确浮点数(SSE2)
·16个字节数(SSE2)
·8个字组(word)数(SSE2)
·4个双倍字组数(SSE2)
·2个四倍字组数(SSE2)
·1个128位长的整数(SSE2)

  由于SSE2可供选择的数据型态很多,而且无疑地相当有用。 因此,当时Intel 极希望软件开发者能用SSE2 的双倍精确浮点指令来取代旧有的 x86 浮点指令,如此一来 Intel所称 Pentium4是当时FPU 性能最强的处理器这项谣言,最后也就变成了事实。在相关测试中,SSE2对于处理器的性能的提升是十分明显的,虽然在同频率的情况下,Pentium 4和性能不如Athlon XP,但由于Athlon XP不支持SSE2,所以经过SSE2优化后的程序Pentium 4的运行速度要明显高于Athlon XP。而AMD方面也注意到了这一情况,在随后的K-8系列处理器中,都加入SSE2指令集。

代表之作:Pentium 4处理器


老Pentium 4

三、SSE3指令集

  SSE3是英特尔在研发Prescott核心时所引入的指令集。它最先被称为PNI(是Prescott New Instructions的简称,Prescott新指令),但它最终改用了一个新的行销名称—SSE3。在指令的复杂程度方面,相对于此前的MMX、SSE、SSE2,SSE3似乎要简洁不少—此前MMX包含有57条命令,SSE包含有50条命令,SSE2包含有144条命令,SSE3包含有13条命令。SSE3指令集这13条命令共分为5个应用层:

从Pentium III到扣肉 SSE指令集发展历程回顾_第4张图片

  第一层中的指令是“数据传输命令”,只有一条指令:FISTTP,它有利于x87浮点转换成整数,并可以大大提高优化的效率。

  第二层中的指令是“数据处理命令”,一共有五条,分别是ADDSUBPS,ADDSUBPD,MOVSHDUP,MOVSLDUP,MOVDDUP。这些指令可以简化复杂数据的处理过程,由于未来数据处理流量将会越来越大,因此Intel在这里应用的指令集最多、达到了五条。

  第三层中的指令是“特殊处理命令”,也只有一条:LDDQU。在这条指令主要针对视频解码,用来提高处理器对处理媒体数据结果的精确性。

  第四层中的指令是“优化命令”,一共有四条指令,分别是HADDPS,HSUBPS,HADDPD,HSUBPD,它们可以对程序起到自动优化的作用。这些指令对处理3D图形相当有用。

  第五层中的指令是“超线程性能增强”,一共有两条针对线程处理的指令:MONITOR, MWAIT,这有助于增加Intel超线程的处理能力、大大简化了超线程的数据处理过程。

  从技术上来看,SSE3对于SEE2的改进非常有限,因此它为Prescott所带来的性能提升相当有限,它的优势仍体现在视频解码方面—Intel宣称如果在数据编码算法使用LDDQU指令,那么影象压缩速度可以提升10%左右。在当时来看,SSE3仍属于最先进的指令集,因此AMD、全美达后来也在它的处理器中加入对SSE3指令集的支持。

代表之作:基于Prescott核心的Pentium 4

四、SSE4指令集

  SSE4指令集是Conroe架构所引入的新指令集。这项原本计划应用于NetBurst微架构Tejas核心处理器之上的全新技术也随着它的夭折最终没能实现,这不能不说是个遗憾,但是SSE4指令集出现在了Conroe上又让我们看到了希望。

  SSE4指令集共包括16条指令,不过虽然扣肉处理器推出已经有一些时日,但目前英特尔仍没有公布SSE4指令集的具体资料。这相当令人感到纳闷。也许英特尔是基于特殊的考虑,仅让少数合作软件厂商取得数据,只是这种作法实在很没有说服力就是了,天底下没有哪家处理器厂商,希望自己新增的指令越少人用越好。

  不过,从Intel Core微架构针对SSE指令所作出的修改被称之为“Intel Advanced Digital Media Boost”技术来看,未来SSE4将更注重针对视频方面的优化,我们认为SSE4主要改进之处可能将针对英特尔的Clear Video高清视频技术及UDI接口规范提供强有力的支持。这两项技术基于965芯片组,Intel的官方把Clear Video技术定义为:支持高级解码、拥有预处理和增强型3D处理能力。

  值得一提的是,在SSE4中另一个重要的改进就是提供完整128位宽的SSE执行单元,一个频率周期内可执行一个128位SSE指令。Conroe中SSE的ADDPS(4D 32bit共128bit,单精度加法)、MULPS(4D 32bit共128bit,单精度乘法)和SSE2的ADDPD(2D 64bit共128bit,双精度加法)、MULPD(2D 64bit共128bit,双精度乘法),这四条重要SSE算术指令的吞吐周期都降低到1个周期,真正做到了英特尔宣称的每个周期执行一条128位向量加法指令和一条128位向量乘法指令的能力。

  可以说 Conroe的向量单元已经全面引入了流水线化的设计。而支持SSE3的NetBurst微处理器架构虽然提供128位宽执行单元,但仅有一组,性能孰高孰低一目了然。更为重要的是,目前已经有相当多的软件针对SSE指令集进行了优化,其中包括2D制图、3D制图、视频播放、音频播放、文件压缩等方面,可见其应用范围相当广泛。


  配合完整的128位SSE执行单元,以及庞大的执行单元数目,Conroe处理器可在一个频率周期内,同时执行128位乘法、128位加法、128位数据加载与128位数据回存,或着是4个32位单倍浮点精确度乘法与4个32位单倍浮点精确度加法运算,这将使其更利于多媒体应用。因此,SSE4指令集能够有效带来系统性能上的提升,这一代在众多测试中早已被证实。虽然其不会像当年SSE2指令集出现时那样带来巨大的性能提升,但是其在某些特殊方面的应用还是让我们对它充满了期待。

代表之作:Core 2 Duo处理器

 

你可能感兴趣的:(游戏,优化,英特尔,图形,64bit,多媒体处理)