SSE

✍ dations ◷ 2025-06-08 10:11:06 #并发计算,X86架构

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

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)浮点指令。

下面这个例子演示了使用SSE的优点。向量加法在计算机图形中很常用,如果在x86平台上想将四对单精度浮点数相加,必须使用四对浮点相加指令。

vec_res.x = v1.x + v2.x;vec_res.y = v1.y + v2.y;vec_res.z = v1.z + v2.z;vec_res.w = v1.w + v2.w;

上面这段代码会被编译成4条x86 FADD指令。下面的伪代码展示用128位包裹式相加(packed-add)指令替代4个纯量相加指令。

 movaps xmm0,           ;xmm0 = v1.w | v1.z | v1.y | v1.x  addps xmm0,            ;xmm0 = v1.w+v2.w | v1.z+v2.z | v1.y+v2.y | v1.x+v2.x                movaps , xmm0

后续版本

SSE2

SSE2是Intel在Pentium 4处理器的最初版本中引入的,但是AMD后来在Opteron和Athlon 64处理器中也加入了SSE2的支持。SSE2指令集添加了对64位双精度浮点数的支持,以及对整型数据的支持,也就是说这个指令集中所有的MMX指令都是多余的了,同时也避免了占用浮点数寄存器。这个指令集还增加了对CPU缓存的控制指令。AMD对它的扩展增加了8个XMM寄存器,但是需要切换到64位模式(x86-64/AMD64)才可以使用这些寄存器。Intel后来在其Intel 64架构中也增加了对x86-64的支持。

SSE3是Intel在Pentium 4处理器的Prescott核心中引入的第三代SIMD指令集,AMD在Athlon 64的第五个版本,Venice核心中也加入了SSE3的支持。这个指令集扩展的指令包含寄存器的局部位之间的运算,例如高位和低位之间的加减运算;浮点数到整数的转换,以及对超线程技术的支持。

SSSE3是Intel针对SSE3指令集的一次额外扩展,最早内置于Core 2 Duo处理器中。

SSE4是Intel在Penryn核心的Core 2 Duo与Core 2 Solo处理器时,新增的47条新多媒体指令集,现在SSE4版本更新至SSE4.2。

AMD也开发了属于自己的SSE4a多媒体指令集,并内置在Athlon II与Opteron等K10架构处理器中,不过SSE4a无法与Intel的SSE4系列指令集兼容。目前AMD新一代处理器已支持Intel的SSE4.1、SSE4.2指令集。

SSE5是AMD为了打破Intel垄断在处理器指令集的独霸地位所提出的,SSE5初期规划将加入超过100条新指令,其中最引人注目的就是三操作数指令(3-Operand Instructions)及熔合乘法累积(Fused Multiply Accumulate)。其中,三操作数指令让处理器可将一个数学或逻辑库,套用到操作数或输入数据。借由增加操作数的数量,一个x86指令能处理二至三笔数据,SSE5允许将多个简单指令汇整成一个指令,达到更有效率的指令处理模式。提升为三运算指令的运算能力,是少数RISC架构的水准。熔合乘法累积让允许创建新的指令,有效率地运行各种复杂的运算。熔合乘法累积可结合乘法与加法运算,透过单一指令运行多笔重复计算。透过简化代码,让系统能迅速运行绘图着色、快速照片着色、音场音效,以及复杂向量演算等性能密集的应用作业。目前AMD已放弃下一代Bulldozer核心内置SSE5指令集,改内置Intel授权SSE4系列指令集。

AVX(Advanced Vector Extensions)是Intel的SSE延伸架构,如IA16至IA32般的把寄存器XMM 128bit提升至YMM 256bit,以增加一倍的运算效率。

相关

  • 复合口服避孕药复合口服避孕药,也叫复方口服避孕药,是目前最常见的避孕药。它是一种通过服用复合雌激素和孕激素来控制生育的方法。如女性正确地根据药物说明,每日规律服用这种药,可达到避孕的
  • 姆斯季斯拉夫·克尔德什姆斯季斯拉夫·弗谢沃洛多维奇·克尔德什(俄语:Мстисла́в Все́володович Ке́лдыш,1911年1月28日(2月10日)-1978年6月24日)是数学家、物理学家、航天
  • 紫花地丁紫花地丁(学名:Viola philippica)是一种堇菜科堇菜属的多年生草本植物。紫花地丁自古以来就有同名异物的问题。《滇南本草》中的紫花地丁为远志科植物苦远志,《本草纲目》的紫花
  • 顾八代顾八代(满语:ᡤ᠋ᡡᠪᠠᡩᠠᡳ,穆麟德:Gūbadai,?-1708年),字文起,伊尔根觉罗氏,满洲镶黄旗人。三藩之乱期间,顾八代在广西数次击破吴世琮,后担任礼部尚书,期间曾教授当时还是皇子的雍正
  • 鸟龙鸟鸟龙鸟属(属名:Avisaurus,意为“鸟蜥蜴”)是白垩纪晚期北美洲的一属反鸟亚纲鸟类。其下仅有一个物种,即模式种阿氏鸟龙鸟(A. archibaldi)。两者都只有一条跗跖骨化石。鸟龙鸟是来自
  • 钻石吧钻石岗(英语:Diamond Bar)中文又音译为戴蒙德吧,是位于美国加州洛杉矶县郊外的一个城市。“钻石岗”这个名字源于Frederick E. Lewis所注册的钢铁品牌“diamond over a bar”。
  • 北马其顿代纳尔北马其顿代纳尔 (马其顿语: денар and денари,也译作德纳尔、第纳尔),货币编码MKD。是北马其顿共和国的流通货币。辅币单位德尼。1代纳尔=100德尼。
  • 函数指针函数指针是一种在C、C++、D语言、其他类 C 语言和Fortran 2003中的指针。函数指针可以像一般函数一样,用于调用函数、传递参数。在如 C 这样的语言中,通过提供一个简单的选取
  • 天才儿童MAX《天才儿童MAX (a.k.a. 天才电视小组MAX)》(天才てれびくんMAX)是NHK教育频道(NHKデジタル教育)与NHK世界台(NHK ワールド プレミアム)针对儿童与青少年所播放的儿童电视节目,主要
  • 伊达宗德伊达宗德(1830年5月19日-1906年11月29日),日本江户时代末期大名、明治时代时期政治家。宇和岛藩第九代藩主(1858年-1871年)。官位从四位下、远江守。明治时代封伯爵,其后晋升为侯爵