MMX及SSE优化--MMX篇

王朝vc·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

MMX和SSE都是INTEL开发的基于SIMD(单指令多数据流)的技术。所谓单指令多数据流是指可以用一条指令可以完成多个数据的操作。虽然64位系统已经推出,但是我们大部分都是使用32位系统,所以如果要完成两个128位的相加运算,用普通32位指令很明显要执行4条相加指令,而基于64位的MMX指令只需要执行两次即可完成,更强大的SSE能一次处理128位,故一次就可以完成操作,所以采用MMX及SSE优化能够大幅度提升程序性能。

MMX采用处理器的80位的浮点寄存器的低64位作为MMX寄存器,一共有8个,从mm0到mm7,因为是“借用”浮点寄存器的低64位所以每次在用完MMX指令后一定要用EMMS指令将寄存器清空,MMX主要是针对整数运算进行优化,一个64位的MMX寄存器可以同时存入8个8位或者4个16位的整数,估计一次性就可以完成8次8位运算或者4次16位运算,要注意的MMX指令不能直接对32位数进行2次运算,但可以把32位拆分成两个16位再进行运算。MMX技术还有一个非常有用的特性是饱和运算,比如两个8位数相加:128+129相加后很明显超过了8位的最大值256,但是进行饱和运算相加的结果将是最大值256,饱和运算将运算结果控制在相应位数的范围内。

下面举一个例子:

在VC 6 SP6中可以直接在内联汇编中使用mmx指令,而且调试时也能查看MMX寄存器

__int16 a[]={1,2,3,4}

__int16 b[]={5,6,7,8}

_asm{

movq mm0,a //将数组a中的4个数一次存入mm0

movq mm1,b //将数组b中的4个数一次存入mm0

paddsw mm0,mm1 //16位带符号的饱和相加,结果存在mm0中

movq a,mm0 //再把mm0中的结果存放在数组a中

emms //千万别忘了,擦干净

}

也可以不用内联汇编直接用函数,MS的最新的SDK和INTEL的编译器都支持这种方式

#include <xmmintrin.h> //使用所必须包含的头文件

__m64 a=_mm_set_pi16(1, 2, 3, 4); //向a中写入4个16位的整数

__m64 b=_mm_set_pi16(5, 6, 7, 8); //最后一位写入最低位,即8写入最低位

a=_m_paddsw(a,b); //完成16位加法运算

_m_empty; //一样不要忘记擦PP,嘿嘿

以上只是最基本最简单的介绍,MMX一共有57条指令,包括基本算术运算指令,比较指令,转换指令,逻辑指令,位移和传输指令,此处就不一一列举,详细的指令介绍请参看INTEL的官方网站。但请记住MMX是针对整数运算的,千万不要用于浮点运算,浮点运算要用更为强大的SSE指令完成,预知SSE详解且待下回分解。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
 
© 2005- 王朝網路 版權所有 導航