MMX 初体验

      今日突然想起讯雷说自己的界面使用MMX优化了,速度得到提升。那什么是MMX呢?

      原来MMX是由英特尔开发的一种SIMD多媒体指令集,共有57条指令,以并行方式处理多个数据元素。它最早集成在英特尔奔腾(Pentium)MMX处理器上,以提高其多媒体数据的处理能力。

      MMX技术提高了很多应用程序的执行性能,例如活动图像、视频会议、二维图形和三维图形。几乎每一个具有重复性和顺序性整数计算的应用程序都可以从MMX技术中受益。对于8位、16位和32位数据元素的处理,改善了程序的性能。一个MMX指令可一次操作8个字节,且在一个时钟周期内完成两条指令,也就是说,可在一个时钟周期内处理16个数据元素。另外,为增强性能,MMX技术为其它功能释放了额外的处理器周期。以前需要其它硬件支持的应用程序,现在仅需软件就能运行。更小的处理器占用率给更高程度的并发技术提供了条件,在当今众多的操作系统中这些并发技术得到了利用。在基于英特尔的分析系统中,某些功能的性能提高了50%~400%。这种数量级的性能扩展可以在新一代处理器中得到体现。在软件内核中,其速度得到更在的提高,其幅度为原有速度的3~5倍。

  MMX也有缺点,由于MMX的运算指令必须在数据配对整齐的时候才能使用,所以使用MMX指令要比普通的汇编指令多余许多分组配对的指令,如果运算不是特别的整齐的话,就要浪费大量的时间在数据的配对上,所以说MMX指令也不是万能的,也有其很大的缺陷。同时MMX指令在处理16位数据的时候才能发挥最大的作用,处理8位数据要有一点技巧。而处理32位数据,MMX指令几乎没有什么加速能力。(考虑分组耗时的话)

     上面的都是在网络上可以找到的关于MMX一些信息,通过这些信息,对MMX大概有一个了解,但对于知识,我们还是不能简单的接受,也要通过思考和实验验证一下,才能对MMX有更深的了解,好在在实际项目上更好的应用起来。

 

      初试MMX

 

ExpandedBlockStart.gif View Code
 1  #include  " stdafx.h "
 2  #include  < xmmintrin.h >
 3 
 4  int  _tmain( int  argc, _TCHAR *  argv[])
 5  {
 6       const   int  ARRAY_COUNT  =   4000 ;
 7       int  count  =  ARRAY_COUNT  /   4 ;
 8       short  __declspec(align( 8 ))  as [ARRAY_COUNT];
 9       short  __declspec(align( 8 )) bs[ARRAY_COUNT];
10       short  __declspec(align( 8 )) cs[ARRAY_COUNT];
11 
12       for ( int  i  =   0 ; i  <  ARRAY_COUNT; i ++ )
13      {
14           as [i]  =  rand()  %   100 ;
15          bs[i]  =  rand()  %   70 ;
16      }
17 
18      __m64 *  a;
19      __m64 *  b;
20      __m64 *  c;
21 
22      a  =  (__m64 * ) & as [ 0 ];
23      b  =  (__m64 * ) & bs[ 0 ];
24      c  =  (__m64 * ) & cs[ 0 ];
25       for ( int  i  =   0 ; i  <  count; i ++ )
26      {                
27           * c ++   =  _m_paddsw( * a ++ * b ++ );
28      }
29 
30       return   0 ;
31  }

 

      在C++里面使用MMX有两种方式,一种是使用内联汇编的方式,另一种是使用C++封装好的函数,两种方式我都尝试比较过,发现性能差异很小(没感觉),所以我就直接使用第二种方式好了;要使用第二种方式,首先我们需要引用“xmmintrin.h”头文件,它包含一64位和128位数据定义和全部运算函数。

      上面的例子是有两个16位数据的数组进行相加,结果保存到第三个数组上;在数组定义的语句上,我加了一个8位对齐的声明,但从实际结果来看,这个声明没有什么影响,应该是C++基本数据没有对齐的问题。实际测试结果比普通一个个相加的时间缩短一半多一些,还蛮不错的。

 

转载于:https://www.cnblogs.com/pennant/archive/2011/04/09/2010122.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值