分类: 嵌入式
2013-08-22 20:13:51
SIMD指令(Single Instruction Multiple Data,单指令多数据流指令)(其主要用在多媒体上)是一种并行语
句,包括MMX、SSE1、SSE2、SSE3、SSE4。它主要将多个相同数据
(8位、16位、32位、64位)打包在一个128位(xmm,8个)或64位(mm,8个)寄存器上,同时
对其进行相同运算(加减乘除、移动、逻辑运算等等),从而加快了运算速率。比如对
一个float型数据(32位),将其存入xmm(128位)中,同时对其进行相同处理,可使得运
算速率变为原来的4倍。
常用的SIMD语句主要如下:
移动 加 减 求最大值 乘
movdqu paddw psubw pmaxsw pmullw __int16型(16位,128/16=8)
movd paddd psubd pmaxsd pmulld int型(32位,128/32=4)
movups addps subps maxps mulps 浮点型(32位,128/32=4)
关于SIMD语句在Visual Studio中的使用,我们可以通过两种方式,一是建立专门的asm文件,二是通过在C文件中内嵌汇编语句的方式,格式为__asm{ }。下面是一个简单的SIMD指令的例子:
__int16 test1[8]={1,2,3,2,9,2,2,6};
__int16 test2[8]={3,4,5,3,2,5,4,3};
__asm{
movdqu xmm0,test1
movdqu xmm1,test2
paddw xmm0,xmm1
psubw xmm0,xmm1
pmaxsw xmm1,xmm0
pmullw xmm0,xmm1
movdqu test1,xmm0
movdqu test2,xmm1
for(int i=0;i<8;i++)
printf("test1[%d]=%d,test2[%d]=%d\n",i,test1[i],i,test2[i]);