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

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/p/2010122.html