SSE2,全名为Streaming SIMD Extensions 2,是一种IA-32架构的SIMD(单一指令多重数据)指令集。SSE2是在 2001年随着Intel发表第一代Pentium 4处理器也一并推出的指令集。它延伸较早的SSE指令集,而且可以完全取代MMX指令集。在2004年,Intel 再度扩展了SSE2指令为 SSE3 指令集。与 70 条指令的 SSE 相比,SSE2新增了144条指令。在2003年,AMD也在发布AMD64的64位处理器时跟进SSE2指令集。
SSE2延伸了MMX指令群使用XMM寄存器来运算,这能让开发人员完全避免让8个64位MMX寄存器与原有的IA-32浮点运算寄存器共享。而这样子就能够不需要切换MMX与x87浮点运算的前提之下混合SIMD标量与浮点向量运算。不过,这不会因为 SSE 的寄存器的精度提高而让运算结果的精度也提高。
而还有部分的SSE2指令集包含了一系列的CPU缓存控制指令。当处理理论上无限的数据流,还有数字格式转换指令所产生出来的大量补码,能够使缓存污染有效的降低。
AMD在AMD64架构上的SSE2再新增额外8个寄存器,把寄存器的量提升到16个(XMM0~XMM15)。这些额外的寄存器只有运行于64位的模式下才能够使用。2004年,Intel也采用这些额外的寄存器于它的86-64(Intel64)架构。
FPU的指令集(x87)通常在运算时使用80位的精度。原始的FPU软件的算法如果套用到SSE2,在数学运算上或是数据输入肯定会造成一些可测得的数值误差。这在科学运算上是很严重的问题,会导致在不同的架构上运算出互不相同的结果。而这问题很容易发生在编译器在解释一条包含好几项运算符(加减乘除)的数学式上。取决于使用哪种编译方式(与最优化),计算过程中会产生不一样的中间值。而在FPU中这些中间值会从80位截成64位。而当这被截掉的中间值拿来运算,最后的数值有可能会大不相同。下面使用G95编译的Fortran代码就是其中一个例子。
program hireal a,b,c,dreal x,y,za=.013b=.027c=.0937d=.79y=-a/b + (a/b+c)*EXP(d)print *,yz=(-a)/b + (a/b+c)*EXP(d)print *,zx=y-zprint *,xend