• 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++基本数据没有对齐的问题。实际测试结果比普通一个个相加的时间缩短一半多一些,还蛮不错的。

  • 相关阅读:
    无重复字符的最长子串
    有效的括号
    最长公共前缀
    罗马数字转整数
    Android解析JSON数据异步加载新闻图片
    回文数
    Java从Json获得数据的四种方式
    JavaMD5加密工具类
    div模仿select效果二:带搜索框
    BG雪碧图制作要求
  • 原文地址:https://www.cnblogs.com/pennant/p/2010122.html
Copyright © 2020-2023  润新知