领导干部当好家:基于SSE 指令集的程序优化

来源:百度文库 编辑:中财网 时间:2024/04/29 22:42:42

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

目录

  • 1 SSE 的暂存器
  • 2 SSE 指令表
    • 2.1 浮点指令
    • 2.2 整数指令
    • 2.3 其他指令
  • 3 后续版本
    • 3.1 SSE2
    • 3.2 SSE3
    • 3.3 SSSE3
    • 3.4 SSE4
    • 3.5 SSE5
    • 3.6 AVX
    • 3.7 FMA
  • 4 参见

[编辑] SSE 的暂存器

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 指令表

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

[编辑] 后续版本

[编辑] 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

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

[编辑] SSSE3

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

[编辑] SSE4

SSE4是Intel在Penryn核心的Core 2 Duo与Core 2 Solo处理器时,新增的47条新多媒体指令集,并且现在更新至SSE4.2。AMD也开发了属于自己的SSE4a多媒体指令集,并自带在Phenom与Opteron等K10架构处理器中,不过无法与Intel的SSE4系列指令集兼容。

[编辑] SSE5

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

[编辑] AVX

AVX(Advanced Vector Extensions) 是Intel的SSE延伸架构,如IA16至IA32般的把暂存器XMM 128bit提升至YMM 256bit,以增加一倍的运算效率。此架构支持了三运算指令(3-Operand Instructions),减少在编码上需要先复制才能运算的动作。在微码部分使用了LES LDS这两少用的指令作为延伸指令Prefix。

[编辑] FMA

  • FMA是Intel的AVX扩充指令集,如名称上熔合乘法累积(Fused Multiply Accumulate)的意思一样。