SIMD指令集
from:https://zhuanlan.zhihu.com/p/31271788
SIMD,即Single Instruction, Multiple Data,一条指令操作多个数据.是CPU基本指令集的扩展.主要用于提供fine grain parallelism,即小碎数据的并行操作.比如说图像处理,图像的数据常用的数据类型是RGB565, RGBA8888, YUV422等格式,这些格式的数据特点是一个像素点的一个分量总是用小于等于8bit的数据表示的.如果使用传统的处理器做计算,虽然处理器的寄存器是32位或是64位的,处理这些数据确只能用于他们的低8位,似乎有点浪费.如果把64位寄存器拆成8个8位寄存器就能同时完成8个操作,计算效率提升了8倍.SIMD指令的初衷就是这样的,只不过后来慢慢cover的功能越来越多.
好多处理器都有SIMD指令,我们先仅关注Intel的SIMD.
Intel的初代SIMD指令集是MMX,Multi-Media Extension, 即多媒体扩展,因为它的首要目标是为了支持MPEG视频解码.MMX将64位寄存当作2X32或8X8来用,只能处理整形计算.这样的64位寄存器有8组,分别命名为MM0~MM7.这些寄存器不是为MMX单独设置的,而是借用的FPU的寄存器,也就是说MMX指令执行的时候,FPU就没有办法工作.
后来Intel进一步实现了SSE, SSE2~SSE4指令集,给了他们单独的寄存器,之后MMX就被停掉了.
发展历史
SSE, SSE2一直到SSE4,AVX都是一代一代发展过来的,基本上是在原来的基础上增加一些功能,这个增加的过程在网上找到了一张图可以很好的解释.
图中可以看出,SSE首先就是有了属于自己的8个128位长的寄存器,即32x4,可以支持4个单精度浮点数同时计算,这8个寄存器称为XMM0~XMM7, SSE指令要求数据是16byte对齐的.SSE2则进一步支持双精度浮点数,由于寄存器长度没有变长,所以只能支持2个双精度浮点计算或是4个单精度浮点计算.另外,它在这组寄存器上实现了整型计算,从而代替了MMX.SSE3支持一些更加复杂的算术计算.SSE4增加了更多指令,并且在数据搬移上下了一番工夫,支持不对齐的数据搬移,增加了super shuffle引擎.