求真百科欢迎当事人提供第一手真实资料,洗刷冤屈,终结网路霸凌。

SSE查看源代码讨论查看历史

事实揭露 揭密真相
跳转至: 导航搜索
SSE

中文名: 因特网数据流单指令序列扩展

外文名: Streaming SIMD Extensions

简 介: 是指令集的简称

简 称: SSE

包 括: 70条指令

SSE(Streaming SIMD Extensions)是英特尔在AMD的3D Now!发布一年之后,在其计算机芯片Pentium III中引入的指令集,是继MMX的扩展指令集。SSE指令集提供了70条新指令。AMD后来在Athlon XP中加入了对这个新指令集的支持。[1]

简介

SSE是 “因特网数据流单指令序列扩展 ( Internet Streaming SIMD Extensions)的缩写。SSE除保持原有的MMX指令外,又新增了70条指令,在加快浮点运算的同时,改善了内存的使用效率,使内存速度更快。它对游戏性能的改善十分显著,按Intel的说法,SSE对下述几个领域的影响特别明显:3D几何运算及动画处理、图形处理(如Photoshop)、视频编辑/压缩/解压(如MPEG和DVD)、语音识别以及声音压缩和合成等。   SSE由一组队结构的扩展组成,用以提高先进的媒体和通信应用程序的性能。该扩展(包括新的寄存器、新的数据类型和新的指令)与单指令多数据(SIMD)技术相结合,有利于加速应用程序的运行。这个扩展与MMX技术相结合,将显著地提高多媒体应用程序的效率。   典型的应用程序是:运动视频,图形和视频的组合,图像处理,音频合成,语音的识别、合成与压缩,电话、视频会议和2D,3D图形。对于需要有规律地访问大量数据的应用程序,也可以从流式SIMD扩展的高性能预取和存储方面获得好处。   SSE定义了一种简单灵活的软件模式。这种新的模式引入了一种新的操作系统可视状态。为了增强并行性,它增加了一组新的寄存器。现存的各种软件,可以在不作修改的情况下继续在增加了SSE的IA处理器上正确运行。SSE引入了一组新的、通用的浮点指令,可对8个128位SIMD浮点寄存器组进行操作。SSE 指令系统使得程序设计人员能够去设计这样一类的算法,即SSE指令和MMX指令两者混合在一起的紧缩单精度浮点运算和紧缩整型运算的算法。SSE 提供了一些新的指令以控制整个MMX数据类型和32位数据类型的可高速缓存性,能够将数据流直接送存储器而不涉及Cache。SSE还提供了能够预取数据的新指令。SSE对于IA编程环境而言,提供了如下的新扩展:   ●8个SIMD浮点寄存器(XMM0~XMM7); ●SIMD浮点数据类型(128位紧缩浮点数); ●SSE指令系统。   SIMD浮点寄存器 IA的SSE提供了8个128位的通用寄存器,每个寄存器可以直接寻址。这些寄存器都是新的,需要能使用该类寄存器的操作系统支持。   SIMD浮点寄存器保存着紧缩的128位数据。流式SIMD扩展指令访问SIMD浮点寄存器时,直接使用寄存器名XMM0~XMM7。SIMD浮点寄存器可被用以完成数据计算,但不能用来寻址存储器。寻址仍然使用整型寄存器来实现,并且采用标准的IA寻址方式以及通用寄存器名。   MMX寄存器被映射为浮点寄存器。从MMX操作转换到浮点操作需要执行EMMS指令。由于SIMD浮点寄存器是一个独立的寄存器文件,因此MMX指令和浮点指令都能够与流式SIMD扩展指令混合在一起,而不需要执行如EMMS指令那样的特殊操作。   SIMD浮点数据类型 IA流式SIMD扩展的基本数据类型是紧缩单精度浮点操作数,即4个32位,单精度浮点(SP ~ FP)数。新的SIMD整型指令可以按紧缩字节、紧缩字或者紧缩双字的数据类型进行操作。新的预取指令是在32字节或者更大的数据规模基础之上工作的,它不管这些数据属于何种类型。4个32位单精度浮点数编号为0~3,第0个数据位于寄存器的低32位之中。   SSE与存储器之间的紧缩数据(单精度的浮点双字)传送,按64位的块或者128位的块来进行。但是,当按紧缩数据类型执行算术操作或者逻辑操作时,却按SIMD浮点寄存器中4个独立的双字并行地进行操作。新的SIMD整型指令遵循MMX指令的惯例,按MMX寄存器的数据类型,而不是按SIMD浮点128位寄存器的数据类型进行操作。   SIMD执行方式 SSE使用单指令多数据(SIMD)技术,按照128位浮点寄存器中的单精度浮点数完成算术和逻辑操作。这种技术通过一条指令并行地处理多个数据元素,以提高软件的速度性能。流式SIMD扩展支持紧缩的单精度浮点数据类型的操作,其SIMD整型指令支持紧缩整型数据类型(字节、字、双字)的操作。SSE 指令能够在保护方式、实地址方式和虚拟8086方式下运行。   数据格式 SSE的紧缩128位数据,编号为0~127。位0为最低有效位(ISB),127为最高有效位( MSB)。当存储数据时,128位的数据总是按“小端”法进行排序,即低地址的字节为低有效字节,高地址的字节为高有效字节。   Pentium II处理器的SIMD浮点指令以32位单精度浮点数据为单位进行操作。SIMD浮点寄存器中的值与存储器中的128位数具有相同的格式。   当存储器存储实型数时,单精度实型值按4个连续的字节存储在存储器中。128位的访问方式用于128位的存储器访问SIMD浮点寄存器之间的128位传送以及所有的逻辑展开/算术指令操作。32位的访问方式则用于32位的存储器访问、SIMD浮点寄存器之间的32位传送以及各种算术指令操作。其中,算术指令有128位操作的,也有32位操作的。   [[SIMD浮点控制]/状态寄存器 控制/状态寄存器MXCSR用来屏蔽/开放数值异常处理、设置舍入方式、设置清零方式和观察状态标志。该寄存器的内容可以通过LDMXCSR和FXRSTOR指令来加载,通过STMXSCRR和FXSAVE指令将它存入存储器。   寄存器中的位5 ~位0表示是否检测到SIMD浮点数值异常。它们是“粘贴( Sticky)"标志,通过LDMXSCR指令对相应字段写0可以清除这些标志。如果LDMXCSR指令清除了相应的屏蔽位之后又对相应的异常标志置1,不会立即产生异常。只有在下一次SSE扩展处理时,出现了这种异常条件才会发生异常。SSE的每种异常只有一个异常标志,因此一次紧缩数据(4个SP浮点数)操作时,不能为每个数据操作提供异常报告。在同一条指令之内出现多个异常条件时,则修改相关的异常标志并且指示着这些条件中最后一个异常条件所发生的异常。在复位时,这些标志将被清除。   位12~位7组成数值异常屏蔽。如果相应的位置1,则该种异常被屏蔽;如果相应的位被清除,则该种异常开放。在复位时,这些位全被置为1,意味着屏蔽所有的数值异常。 位14~位13为舍入控制字段。舍人控制除提供定向舍入、截尾舍入之外,还控制着公用的就近舍入方式。在复位时,舍入控制被置为就近舍入。 位15( FZ)用来启动“清洗为0( Flush To Zero)"方式。在复位时,该位被清除,为禁止“清洗为0”方式。MXCSR寄存器的其他位(位31 ~ 位16和位6)定义为保留位并清除为0。试图使用FXRSTOR或者LDMXCSR指令对保留位写人非0值,将引起通用保护异常。   启动“清洗为0"方式,在下列情况下,会有如下的效果:   (1)回送0结果,且0值带有真实结果的符号; (2)精度异常标志和下溢异常标志置为1。   在应用程序中,下溢异常出现时,希望能以精度的轻微损失为代价而换得应用程序的快速运行,因此采用“清洗为0"方式。对于“清洗为0”的下溢是这样定义的:当计算结果规格化之前,指数部分处于不可规格化范围,则产生“清洗为0",而不管是否有精度损失。未屏蔽的下溢异常是早于“清洗为0”方式产生的,这就意味着,当下溢异常未被屏蔽时,产生了下溢条件的SSE指令,将调用异常处理程序,而不管“清洗为0"方式是否为“使能”状态。   Intel在Pentium IV处理器中加入了SSE2指令集。与Pentium III处理器采用的SSE指令集相比,目前Pentium IV的整个SSE2指令集共有144条,其中包括原有的68组SSE指令及新增加76组SSE2的指令。全新的SSE2指令除了将传统整数MMX寄存器也扩展成128位(128bit MMX)位,另外还提供了128位SIMD整数运算操作和128位双精密度浮点运算操作。  

指令集

概述 AMD后来在Athlon XP中加入了对SSE指令集的支持。这个指令集增加了对8个128位寄存器XMM0-XMM7的支持,每个寄存器可以存储4个单精度浮点数。使用这些寄存器的程序必须使用FXSAVE和FXRSTR指令来保持和恢复状态。但是在Pentium III对SSE的实现中,浮点数寄存器又一次被新的指令集占用了,但是这一次切换运算模式不是必要的了,只是SSE和浮点数指令不能同时进入CPU的处理线而已。 SSE指令集主要包括以下3种类型:   ①是单指令多数据浮点运算指令,共50条。 PentiumⅢ芯片内增加了8个专门配套的128位浮点寄存器,一条指令可以同时处理4对单精度32位浮点数的运算,从而使 PentiumⅢ在语音数据处理以及图形的旋转、翻转和变形等三维空间浮点运算处理方面的整体性能有了很大的提高。   ②是内存连续数据流优先处理指令,共8条。典型的存储器连续数据流有音频数据流、视频数据流、数据库访问数据流与图形处理数据流等。通过采用新的数据预存取技术,减少了CPU处理连续数据流的中间环节,大大提高了连续数据流处理的效率,也明显改善了视频/音频信息处理的速度与质量。   ③增强MMX多媒体运算的新指令,共12条。它们采用了比 Pentium更先进的算法进一步增强和完善了MMX指令系统。   后续版本 SSE2 SSE2是Intel在Pentium 4处理器的最初版本中引入的,但是AMD后来在Opteron 和Athlon 64处理器中也加入了SSE2的支持。SSE2指令集添加了对64位双精度浮点数的支持。这个指令集还增加了对CPU快取的控制指令。AMD对它的扩展增加了8个XMM寄存器,但是需要切换到64位模式(AMD64)才可以使用这些寄存器。   SSE3 SSE3是Intel在P4的 Prescott版中引入的指令集。SSE3新增了13条指令,其中用于视频解码,两条用于线程同步,其余的用于复杂的数学运算、浮点数与整数之间的转换及SIMD浮点运算,使处理器对DSP及3D处理的性能大为提升。   SSSE3 2005年,作为SSE3指令集的补充版本,SSSE3出现在酷睿微架构处理器中,新增16条指令,进一步增强CPU在多媒体、图形图像和 Internet等方面的处理能力。   SSE4 SSE4是Intel在Penryn核心的Core 2 Duo与Core 2 Solo处理器时,新增的47条新多媒体指令集,多媒体指令集,并内建在Phenom与Opteron等K10架构处理器中,不过无法与Intel的SSE4系列指令集相容。   SSE5 SSE5指令集是AMD公司推出的全新指令集,它的功能是增强高性能计算应用,并充分发挥多核心、多媒体的并行优势。SSE5是128-bit指令集,一共有170条指令,其中基础指令64条。   SSE5指令集增加了几条新指令:   ①三操作数指令:x86指令以往只能处理双操作数,而SSE5会提高到三操作数,达到RISC架构的水平,从而把多个简单的指令集整合到更高效的一个单独指令中,提高执行效率。   ②融合乘法累积:该技术可以把乘法和其他算法结合起来,保证只用一条指令就能完成迭代运算,从而简化代码、提高效率,适用于真实图形着色、快速照相渲染、空间化音频、复向量(矢量)数学等场合。   ③除此之外,SSE5还新增了整数乘法累积指令(IMAC, IMADO)、置换与条件移动指令、向量比较与测试指令、精度控制舍入与变换指令等。   AVX AVX全称 Advanced vector extensions(高级矢量扩展),是 Intel公司推出的全新一代SIMD指令集,直接跳过SSE5(由AMD所定义),AVX借鉴了一些 AMD SSE5指令集的设计思路,进行扩展和加强,形成一套新一代的完整SIMD指令集规范。   AVX指令集将原来的128位XMM寄存器扩充为256位的YMM寄存器,从而支持256位的vector计算。改进和加强了原有的在3个 operands指令的编码和语法,使之更灵活。增加一个全新的VEX prefix,实现对原有的 prefix ( escape / SIMD prefix) 集成,从而消除了 escape / SIMD prefix。FMA功能支持IEEE-754 2008。   AVX指令集通过 VEX prefix可实现4个 operands,表示为dest、srel、src2、src3,dest、srcl、src2可由 VEX. vvvv、 ModRM. r/m及 ModRM. r/m来提供,src3由1个字节的immediate来提供。AVX指令不支持MMX寄存器。   AES-NI指令集 AES-NI指令集的作用在于加速AES加密解密的处理过程,类似于我们熟悉的SSE等CPU指令集,AES-NI指令集能够大大缓解CPU的工作负担,同时在一定程度上加速AES的加解密过程。   AES-NI指令集中包含了4条新的指令,它们分别是负责加密的 AESENC、 AESENCLAST和负责解密的 AESDEC、 AESDECLAST。另外还有两个AES密匙扩展指令 AESIMO、AESKEYGENASSIST。这些指令都属于SIMD单指令多数据编码。它们支持目前最为主流的AES-128、AES-196、AES-256。  

寄存器

SSE加入新的8个128位寄存器(XMM0~XMM7)。而AMD发表的x86-64延伸架构(又称AMD64)再加入额外8个寄存器。除此之外还有一个新的32位的控制/状态寄存器(MXCSR)。不过只能在64位的模式下才能使用额外8个寄存器。   每个寄存器可以容纳4个32位单精度浮点数,或是2个64位双精度浮点数,或是4个32位整数,或是8个16位短整数,或是16个字符。整数运算能够使用正负号运算。而整数SIMD运算可能仍然要与8个64位MMX寄存器一起运行。   因为操作系统必须要在进程切换的时候保护这些128位的寄存器状态,除非操作系统去引导这些寄存器,否则默认值是不会去激活的。这表示操作系统必须要知道如何使用FXSAVE与FXRSTOR指令才能存储x87与SSE寄存器的状态。而在当时IA-32的主流操作系统很快的都加入了此功能。   由于SSE加入了浮点支持,SSE就比MMX更加常用。而SSE2加入了整数运算支持之后让SSE更加的有弹性,当MMX变成是多余的指令集,SSE指令集甚至可以与MMX并发运作,在某些时候可以提供额外的性能增进。   第一个支持SSE的CPU是Pentium III,在FPU与SSE之间共享运行支持。当编译出来的软件能够交叉的同时以FPU与SSE运作,Pentium III并无法在同一个周期中同时运行FPU与SSE。这个限制降低了指令管线的有效性,不过XMM寄存器能够让SIMD与标量浮点运算混合运行,而不会因为切换MMX/浮点模式而产生性能的折损。  

指令表

SSE提供标量与包裹式(packed)浮点指令。   浮点指令 存储器到寄存器/寄存器到存储器/寄存器之间的数据搬移   标量– MOVSS 包裹式– MOVAPS, MOVUPS, MOVLPS, MOVHPS, MOVLHPS, MOVHLPS 数学运算   标量– ADDSS, SUBSS, MULSS, DIVSS, RCPSS, SQRTSS, MAXSS, MINSS, RSQRTSS 包裹式– ADDPS, SUBPS, MULPS, DIVPS, RCPPS, SQRTPS, MAXPS, MINPS, RSQRTPS 比较   标量– CMPSS, COMISS, UCOMISS 包裹式– CMPPS 数据拆包(unpack)与随机搬移(shuffle)   包裹式– SHUFPS, UNPCKHPS, UNPCKLPS 数据类型转换   标量– CVTSI2SS, CVTSS2SI, CVTTSS2SI 包裹式– CVTPI2PS, CVTPS2PI, CVTTPS2PI 逐位逻辑运算   包裹式– ANDPS, ORPS, XORPS, ANDNPS 整数指令 数学运算   PMULHUW, PSADBW, PAVGB, PAVGW, PMAXUB, PMINUB, PMAXSW, PMINSW 数据搬移   PEXTRW, PINSRW 其他   PMOVMSKB, PSHUFW 其他指令 MXCSR管理   LDMXCSR, STMXCSR 缓存与存储器管理   MOVNTQ, MOVNTPS, MASKMOVQ, PREFETCH0, PREFETCH1, PREFETCH2, PREFETCHNTA, SFENCE

相关比较

3D Now!是AMD公司用于对抗MMX的指令集技术,而SSE又是Intel公司发布的MMX扩展指令集。那么,3D Now!和SSE相比又如何呢?   首先,它们有很多相似之处:   (1)两种指令集都支持SIMD (单指令多数据流)操作。   (2)都支持在一个时钟周期内执行四次浮点操作。它们在这一性能上旗鼓相当。 (3)都支持“平面”寄存器组结构。 (4)都兼容MMX指令集,可混合使用。也就是说在程序中可以自由地使用这些指令。 (5)都支持数据预取机制,也就是说它们都支持分支预测和推测执行技术。   其次,3D Now!比SSE具有如下优势:   (1)发布时间早,支持者多。3D Now!技术的推出比SSE早了九个多月,拥有超过1000万个K6-2 CPU的用户基础。而且3D Now!在发布时曾广泛征求了3D技术广大厂商的意见,所以得到了包括微软在内的很多软硬件供应商的支持,涌现出了很多专为其优化的软件、游戏。而相比之下,对几经改名的SSE的推出,广大软硬件厂商的反应并不太热烈。   (2)不需要对现存的Windows操作系统做任何修改,因此实现极为容易。3D Now!的性能非常优秀。而SSE与操作系统有关,当时的Windows必须进行修改,以支持SSE的八个新寄存器。所以Windows 98的用户需要使用软件补丁,升级以支持SSE;而Windows NT的用户则必须升级到Windows 2000才行。   第三,SSE比3D Now!具有如下优势:   (1)由于Intel公司在计算机界的地位和Pentium II的巨大出货量,Pentium 的用户一定比 K6-2、Athlon 多得多,所以SSE举足轻重。   (2)据Intel公司说,SSE提高了因特网上的3D网页的开发和运行效率。  

参考来源

  1. [1],bilibili ,