技术编程|SIMD:为什么Intel CPU选择了它?


SIMD是Single-instruction multiple-data的缩写 。 意思是通过一条指令就能够对若干笔数据进行处理运算 。 这种指令对于整数型数组运算 , 或者是图象像素点运算都极为有利 。 为了支持这种处理模式 , Intel推出了一系列的技术和指令集 , 这其中包括:
MMX技术
SSE扩展指令集
SSE2扩展指令集
SSE3扩展指令集
SSE3补充指令集
SSE4扩展指令集
所有的技术或是指令集都提供了若干指令用来支持SIMD运算 。 其运算对象可以是整数型数据或者是浮点数据 。
对于SIMD的整数数据运算 , 可以使用64位MMX寄存器 , 或者是128位XMM寄存器 。 而对于SIMD的浮点数据运算 , 则只能是哟很难过128位的XMM寄存器 。
在奔腾II时期 , Intel就推出了MMX技术 , 该技术包括了MMX指令集以及MMX寄存器 。 MMX寄存器为64位宽度 , 可以一次性处理8个独立字节的整数型运算 , 或者是4个独立16位的整数型运算 , 或者两个独立的32位整数型运算 , 或者一个64位整数型运算 。
【技术编程|SIMD:为什么Intel CPU选择了它?】当到了奔腾III时期 , Intel又推出了SSE扩展指令集 。 这些指令可以在XMM寄存器中处理单精度浮点数据 , 或者在MMX寄存器中处理整数型数据 。 部分SSE指令提供了对状态 , 缓存(Cache)和内存访问顺序等方面的控制 。 SSE指令集对于图象处理方面进行了补强 。 例如3D建模 , 渲染和视频解码等方面 。
Intel的奔腾4和至强(Xeon)系列处理器推出后 , 又增加了SSE2扩展指令集 。 这些指令可以使用相同的XMM寄存器处理双精度浮点数据和整数型数据 。 这样一来 , 原本只能处理64位整数型数据的能力得到了提升 。 除此之外 , 在对缓存以及内存访问顺序方面 , SSE2也提供新的支持 。
SSE3扩展指令集伴随着奔腾4处理器超线程(Hyper-Threading)技术一起发布 。 SSE3扩展指令集增加了13个新指令用来提高SIMD相关运算的性能 。
SSSE3扩展指令集增加了32个指令用来提升SIMD对于整数型数据运算的性能 , 最早在Intel的Xeon 5100系列和Intel Core 2处理器上使用 。
SSE4扩展指令集又增加了54条指令 。 其中47条指令被称为SSE4.1 , 剩下7条指令被称为SSE4.2 。
进入到Intel 64架构后 , 128位的XMM寄存器由原来的8个 , 增加到了16个 。
再往后 , Intel推出了AVX (Advacned Vector Extensions)技术 。 相比传统的SIMD相关运算 , AVX提供了更为强大的架构支持 。 主要特点如下:
提供了256位的YMM寄存器 , 用来扩展原本的XMM寄存器 。
相比128为XMM寄存器来说 , 两倍效能提升(如果执行时间一致的话)
相比传统SIMD指令 , AVX指令能够支持3操作数运算 , 这对于编程来说 , 提供更好的灵活性 。 如果只有两个操作数 , 势必有一个操作数中的内容将会被运算结果替换掉 。

技术编程|SIMD:为什么Intel CPU选择了它?
本文插图

Reference:
Intel? 64 and IA-32 ArchitecturesSoftware Developer’s ManualVolume 1 (2.2.7 SIMD Instructions)


    推荐阅读