目录
1. 背景
SSE指的是流式单指令多数据扩展媒体和科学计算指令集(Streaming SIMD Extensions Media and Scientific Programming),SIMD指单指令多数据指令集(Single Instruction Multiple Data)。SSE指令集主要基于存储于YMM/XMM寄存器中或从内存中载入的向量操作数(相对于标量操作数)上执行整数和浮点数的操作。这类指令可以加速某种类型的执行程序——典型情况是高性能媒体和科学程序——通过大量的因素,具体取决于数据元素的大小和规律性以及从内部访问数据的局部性。
大部分SSE算术指令在成对的向量上执行并行操作。向量操作也称为打包(packed)或者SIMD操作。它们携带由多个元素组成的向量操作数并且众多元素以并行的次序执行。一些SSE也用标量(scalar)代替向量(vector)执行。
2. SSE指令具备的能力
SSE指令设计初衷就是为了支撑媒体和科学计算的应用。很多物理和数学对象可以采用一组数字(或元素)进行建模,用一组与之相关的固定数字量化其属性。这些元素聚合在一起就称为向量。SSE指令允许应用基于向量执行数学运行。在一个向量指令中,一个或多个向量操作数的元素使用同一个数学函数以并行的次序被执行。元数可以是整数(从字节到八字(octwords))和浮点数(单精度或双精度)。算术操作产生有符号、无符号、和/或饱和结果(saturating results)。可以获得几种类型的向量移动指令以及(在64位模式下)两倍数量的 YMM/XMM 寄存器(总共 16个)可以大大减少内存访问开销,使性能上的提升巨大。
3. SSE指令的应用领域
非常适合 SSE 编程模型的应用程序包括范围广泛的音频、视频和图形程序。例如,音乐合成、语音合成、语音识别、音频和视频压缩(编码)和解压缩(解码)、2D 和 3D 图形、流式视频(高达高清电视)和数字信号处理(DSP)内核都可能会遇到使用SSE指令比使用 AMD64架构中的其他类型指令具有更高的性能。此类应用程序通常在重复循环中使用小型整数或单精度浮点数据元素,其中典型操作本质上是并行的。例如,8位和16 位数据元素通常用于图形应用程序中的像素信息,其中每个RGB像素分量(红色、绿色、蓝色和alpha)由8位或16位表示位整数。16位数据元素也常用于音频采样。
SSE指令允许将像这样的多个数据元素打包到位于MM/XMM寄存器或内存中的256 位或128位向量操作数中。这些指令在这些向量中的每个元素上并行操作。例如,可以将8 位数据的32个元素打包成一个 256 位的向量操作数,这样所有32字节的元素以成对的方式,通过一条指令同时进行操作(所谓单指令多数据)。
SSE 指令还支持广泛的科学应用。例如,他们基于双精度浮点向量元素进行并行运算的能力使它们非常适合计算,如密集的线性方程组,包括矩阵和带有实数和复杂数字的向量空间。例如,在专业 CAD 应用程序中,可以实施高性能物理建模算法来模拟热转导或流体动力学之类的过程。
4. SSE指令的打包数据类型
基于上面的描述,“打包”(packed)是基于SSE的向量数据类型而言的,与标量数据类型相对。因为SSE执行的是并行运算,为了适应这种运算,基本数据类型被聚合为向量数据,这个聚合过程就称为打包,打包后的数据称为打包数据,一般我们说打包数据类型就是指向量数据类型。
参考资料:AMD和Intel官方文档。