转载自:https://www.cnblogs.com/xidian-wws/p/11023762.html
https://blog.csdn.net/lidonghat/article/details/70244288
https://blog.csdn.net/lb920519/article/details/80065102?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.channel_param&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.channel_param
-
SIMD简介
SIMD,即Single Instruction, Multiple Data,即单指令多数据运算,一条指令操作多个数据,其目的就在于帮助CPU实现数据并行,提高运算效率,是CPU基本指令集的扩展。
SIMD主要用于提供fine grain parallelism,即小碎数据的并行操作.比如说图像处理,图像的数据常用的数据类型是RGB565, RGBA8888, YUV422等格式,这些格式的数据特点是一个像素点的一个分量总是用小于等于8bit的数据表示的.如果使用传统的处理器做计算,虽然处理器的寄存器是32位或是64位的,处理这些数据确只能用于他们的低8位,似乎有点浪费.如果把64位寄存器拆成8个8位寄存器就能同时完成8个操作,计算效率提升了8倍。SIMD指令的初衷就是这样的,只不过后来慢慢cover的功能越来越多。SIMD的思想在不同平台架构下进行了实现
X86:SSE指令
ARM:NEON指令
MIPS:MSA不同平台架构下为实现SIMD思想也添加了不同的硬件支持(专用寄存器):
X86:目前支持128bit寄存器,256bit,甚至是512bit
ARM:128bit
MIPS:128bit -
为何SIMD可以更加快速的进行矩阵运算
一般流程:每次从内存加载一个数据寄存器进行运算
SIMD:一次加载多个数据到专用寄存器,则一条指令就能进行多个数据的加乘运算 -
SIMD指令发展历史
图中可以看出,SSE首先就是有了属于自己的8个128位长的寄存器,即32x4,可以支持4个单精度浮点数同时计算,这8个寄存器称为XMM0~XMM7, SSE指令要求数据是16byte对齐的.SSE2则进一步支持双精度浮点数,由于寄存器长度没有变长,所以只能支持2个双精度浮点计算或是4个单精度浮点计算.另外,它在这组寄存器上实现了整型计算,从而代替了MMX.SSE3支持一些更加复杂的算术计算.SSE4增加了更多指令,并且在数据搬移上下了一番工夫,支持不对齐的数据搬移,增加了super shuffle引擎。 -
MMX
MMX是由57条指令组成的SIMD多媒体指令集,MMX将64位寄存当作2个32位或8个8位寄存器来用,只能处理整形计算,这样的64位寄存器有8组,分别命名为MM0~MM7.这些寄存器不是为MMX单独设置的,而是借用的FPU的寄存器,占用