目录
- 1简介
- ▪SIMD浮点寄存器
- ▪SIMD浮点数据类型
- ▪SIMD执行方式
- ▪数据格式
- ▪SIMD浮点控制/状态寄存器
- 2指令集
- ▪概述
- ▪后续版本
- 3寄存器
- 4指令表
- ▪浮点指令
- ▪整数指令
- ▪其他指令
- 53D Now!和SSE的比较
>简介
SSE是 “
因特网数据流单指令序列扩展 ( Internet Streaming SIMD Extensions)的缩写。SSE除保持原有的
MMX指令外,又新增了70条指令,在加快
浮点运算的同时,改善了内存的使用效率,使
内存速度更快。它对游戏性能的改善十分显著,按
Intel的说法,SSE对下述几个领域的影响特别明显:3D几何运算及动画处理、
图形处理(如Photoshop)、
视频编辑/压缩/解压(如MPEG和DVD)、
语音识别以及声音压缩和合成等。
典型的
应用程序是:运动视频,图形和视频的组合,
图像处理,音频合成,语音的识别、合成与压缩,电话、视频会议和2D,3D图形。对于需要有规律地访问大量数据的
应用程序,也可以从流式
SIMD扩展的高性能预取和存储方面获得好处。
SSE定义了一种简单灵活的软件模式。这种新的模式引入了一种新的
操作系统可视状态。为了增强并行性,它增加了一组新的
寄存器。现存的各种软件,可以在不作修改的情况下继续在增加了SSE的
IA处理器上正确运行。SSE引入了一组新的、通用的浮点指令,可对8个128位
SIMD浮点寄存器组进行操作。SSE 指令系统使得程序设计人员能够去设计这样一类的算法,即
SSE指令和
MMX指令两者混合在一起的紧缩单精度浮点运算和紧缩整型运算的算法。SSE 提供了一些新的指令以控制整个MMX
数据类型和32位数据类型的可高速缓存性,能够将数据流直接送存储器而不涉及
Cache。SSE还提供了能够预取数据的新指令。SSE对于IA编程环境而言,提供了如下的新扩展:
>SIMD浮点寄存器
IA的SSE提供了8个128位的
通用寄存器,每个寄存器可以直接寻址。这些寄存器都是新的,需要能使用该类寄存器的操作系统支持。
SIMD
浮点寄存器保存着紧缩的128位数据。流式
SIMD扩展指令访问SIMD
浮点寄存器时,直接使用寄存器名XMM
0~XMM
7。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位的数据总是按“小端”法进行排序,即低地址的字节为低
有效字节,高地址的字节为高有效字节。
当存储器存储实型数时,
单精度实型值按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
浮点数)操作时,不能为每个数据操作提供异常报告。在同一条指令之内出现多个异常条件时,则修改相关的异常标志并且指示着这些条件中最后一个异常条件所发生的异常。在复位时,这些标志将被清除。
启动“清洗为0"方式,在下列情况下,会有如下的效果:
(1)回送0结果,且0值带有真实结果的符号;
在
应用程序中,下溢异常出现时,希望能以精度的轻微损失为代价而换得应用程序的快速运行,因此采用“清洗为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的处理线而已。
①是单指令多数据
浮点运算指令,共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条。
①三操作数指令: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/浮点模式而产生性能的折损。
>指令表
>浮点指令
包裹式– 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)
标量– CVTSI2SS, CVTSS2SI, CVTTSS2SI
包裹式– CVTPI2PS, CVTPS2PI, CVTTPS2PI
>整数指令
PMULHUW, PSADBW, PAVGB, PAVGW, PMAXUB, PMINUB, PMAXSW, PMINSW
>其他指令
MOVNTQ, MOVNTPS, MASKMOVQ, PREFETCH0, PREFETCH1, PREFETCH2, PREFETCHNTA, SFENCE
>3D Now!和SSE的比较
3D Now!是
AMD公司用于对抗MMX的指令集技术,而SSE又是
Intel公司发布的MMX扩展指令集。那么,3D Now!和SSE相比又如何呢?
(1)两种指令集都支持
SIMD (单指令多数据流)操作。
(2)都支持在一个
时钟周期内执行四次浮点操作。它们在这一性能上旗鼓相当。
(4)都兼容
MMX指令集,可混合使用。也就是说在程序中可以自由地使用这些指令。
(5)都支持数据预取机制,也就是说它们都支持分支预测和推测执行技术。
(1)发布时间早,支持者多。3D Now!技术的推出比SSE早了九个多月,拥有超过1000万个K6-2
CPU的用户基础。而且3D Now!在发布时曾广泛征求了
3D技术广大厂商的意见,所以得到了包括微软在内的很多软硬件供应商的支持,涌现出了很多专为其优化的软件、游戏。而相比之下,对几经改名的SSE的推出,广大软硬件厂商的反应并不太热烈。
(2)据Intel公司说,SSE提高了因特网上的
3D网页的开发和运行效率。