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

MMX 初体验MMX 初体验View Code1#include"stdafx.h"

2#include<xmmintrin.h>

3

4int_tmain(intargc, _TCHARargv[])

5{

6constintARRAY_COUNT=4000;

7intcount=ARRAY_COUNT/4;

8short__declspec(align(8))as[ARRAY_COUNT];

9short__declspec(align(8)) bs[ARRAY_COUNT];

10short__declspec(align(8)) cs[ARRAY_COUNT];

11

12for(inti=0; i<ARRAY_COUNT; i++)

13{

14as[i]=rand()%100;

15bs[i]=rand()%70;

16}

17

18__m64
a;

19__m64b;

20__m64
c;

21

22a=(__m64)&as[0];

23b=(__m64
)&bs[0];

24c=(__m64)&cs[0];

25for(inti=0; i<count; i++)

26{

27
c++=_m_paddsw(a++,b++);

28}

29

30return0;

31}

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

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

原文链接: https://www.cnblogs.com/pennant/archive/2011/04/09/2010122.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/23678

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月8日 上午1:35
下一篇 2023年2月8日 上午1:36

相关推荐