新数据类型排列
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
不过,要发挥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条新建指令,使得其处理器性能有大幅度提高。
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个应用层:
第一层中的指令是“数据传输命令”,只有一条指令: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处理器