基于MMX指令集的程序设计简介

2023-11-12

基于MMX指令集的程序设计简介

作者:Alex Farber
出处:http://www.codeproject.com/cpp/mmxintro.asp

MMX技术简介
 
Intel 公司的MMX™(多媒体增强指令集)技术可以大大提高应用程序对二维三维图形和图象的处理能力。Intel MMX技术可用于对大量数据和复杂数组进行的复杂处理,使用MMX技术可处理的数据基本单位可以是字节(byte)、字(word),或者是双字(double-word)。

Visual Studio .NET 2003提供了对MMX指令集特性的支持,从而可以不必编写汇编代码,直接使用C++代码就可以实现MMX指令的功能。通过参考Intel软件说明书(Intel Software manuals)[1]以及阅读MSDN中有关MMX编程技术的主题会使你更好地把握MMX编程的要点。

MMX技术实现了单道指令多道数据流(SIMD,single-instruction, multiple-data)的执行模式。考虑下面一个需要编程完成的任务,在一个字节(BYTE)数组中使其中每一个元素加上一个数,在传统的程序中,实现这个功能的算法如下:

for each  b in array     //对数组中的每一个元素b
    b = b + n            //加上一个数n

下面看看它的实现细节:

for each  b in array  //对数组中的每一个元素b
{
    把b加载到寄存器中
    把此寄存器中的数加上n
    把所得寄存器中的结果放回内存
}


具有MMX指令集支持的处理器有八个64位的寄存器,每一个寄存器可以存放8个字节(byte)、4个字(word)或2个双字(double-word)。MMX技术同时提供了一个MMX指令集,其中的指令可以可以把一个数值(其类型可以是字节、字或双字)加载到这些MMX寄存器中,在寄存器中进行算术或逻辑运算,然后把寄存器中的结果放回内存存储单元。上面的例子采用MMX技术后的算法是这样的:

for each  8 members in array  //把数组中的8个字节(其中一个字节为数组中的一个单位)作为一组取出
{
    把这8个字节加载到MMX寄存器中
    通过一个CPU指令执行周期把这个寄存器中的8个字节都加上n
    把寄存器中计算的结果写回内存
}


C++编程人员不必直接使用MMX指令集中的指令访问这些MMX寄存器。你可以使用64位的数据类型__m64和一系列C++函数来进行相关的算术和逻辑运算。而决定程序使用哪个MMX寄存器以及代码优化是C++编译器的任务。

Visual C++ MMXSwarm [4]是MSDN中提供的一个很好的使用MMX技术进行图象处理的例子,它包含了一些封装好了的类简化了使用MMX技术的操作,并向你展示了对各种不同格式图象进行处理的操作(如单色24位象素RGB、32位象素RGB等)。本文只是对使用Visual C++实现MMX程序设计的简单介绍。如果你感兴趣的话,可以参看MSDN上MMXSwarm的例子。

MMX程序设计详细介绍

包含的头文件

所有的MMX指令集函数在emmintrin.h文件中定义:
#include <emmintrin.h>
因为程序中用到的MMX处理器指令是由编译器决定,所以它并没有相关的.lib库文件。

__m64 数据类型

这种类型的变量可用作MMX指令的操作数,它不能被直接访问。_m64类型的变量被自动分配为8个字节的字长。

CPU对MMX指令集的支持

如果你的CPU能够具有了MMX指令集,你就可以使用Visual Studio .NET 2003提供的对MMX指令集支持的C++函数库了,你可以查看MSDN中的一个Visual C++ CPUID[3]的例子,它可以帮你检测你的CPU是否支持SSE、MMX指令集或其它的CPU功能。

饱和算法(Saturation Arithmetic)和封装模式(Wraparound Mode)

MMX技术支持一种叫做saturating arithmetic(饱和算法)的计算模式。在饱和模式下,当计算结果发生溢出(上溢或下溢)时,CPU会自动去掉溢出的部分,使计算结果取该数据类型表示数值的上限值(如果上溢)或下限值(如果下溢)。饱和模式的计算用于对图象的处理。
下面的例子能够让你理解饱和模式和封装模式的区别。如果一个字节(BYTE)类型变量的值为255,然后将其值加一。在封装模式下,相加结果为0(去掉进位);在饱和模式下,结果为255。饱和模式用类似的方法来处理下溢出,比如对于一个字节数据类型的数在饱和模式下,1减2的结果为0(而不是-1)。每一个MMX算术指令都有这两种模式:饱和模式和封装模式。本文所要讨论的项目只使用饱和模式下的MMX指令。

编程实例

以下讲解了MMX技术在Visual Studio .NET 2003下的应用实例

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

基于MMX指令集的程序设计简介 的相关文章

  • 如何使用 ASP.NET MVC 编辑多选列表?

    我想编辑一个如下所示的对象 我希望用 UsersGrossList 中的一个或多个用户填充 UsersSelectedList 使用 mvc 中的标准编辑视图 我只得到映射的字符串和布尔值 下面未显示 我在 google 上找到的许多示例都
  • 无法将 std::min 传递给函数,std::min 的副本有效

    Passing std min函数无法编译 我复制了 libcpp 声明std min进入我的源文件并且它可以工作 std 版本有什么问题 clang 和 gcc 也会发生同样的情况 在 Godbolt 上测试 https godbolt
  • 我如何知道 C 程序的可执行文件是在前台还是后台运行?

    在我的 C 程序中 我想知道我的可执行文件是否像这样在前台运行 a out 或者像这样 a out 如果你是前台工作 getpgrp tcgetpgrp STDOUT FILENO or STDIN FILENO or STDERR FIL
  • 锁定 ASP.NET 应用程序变量

    我在 ASP NET 应用程序中使用第三方 Web 服务 对第 3 方 Web 服务的调用必须同步 但 ASP NET 显然是多线程的 并且可能会发出多个页面请求 从而导致对第 3 方 Web 服务的同时调用 对 Web 服务的调用封装在自
  • XPATH 查询、HtmlAgilityPack 和提取文本

    我一直在尝试从名为 tim new 的类中提取链接 我也得到了解决方案 给出了解决方案 片段和必要的信息here https stackoverflow com questions 2982862 extracting a table ro
  • 并行化斐波那契序列生成器

    我正在学习并行化 在一项练习中 我得到了一些我应该提高性能的算法 其中之一是斐波那契数列生成器 array 0 0 array 1 1 for q 2 q lt MAX q array q array q 1 array q 2 我怀疑 这
  • 进程退出后 POSIX 名称信号量不会释放

    我正在尝试使用 POSIX 命名信号量进行跨进程同步 我注意到进程死亡或退出后 信号量仍然被系统打开 在进程 打开它 死亡或退出后是否有办法使其关闭 释放 早期的讨论在这里 当将信号量递减至零的进程崩溃时 如何恢复信号量 https sta
  • 在 ASP.NET MVC 中将模型从视图传递到控制器

    我正在 ASP NET MVC 中开发我的第一个应用程序 但遇到了一个我无法解决的问题 即使在阅读了整个互联网之后也是如此 因此 我有几个使用视图模型创建的视图 它们是报告 这些视图模型是根据用户选择标准填充的 我正在尝试构建一种接受模型并
  • 将下拉列表与字典绑定

    我将字典绑定到下拉列表 举例来说 我的字典中有以下项目 Test1 123 Test2 321 我希望下拉文本采用以下格式 Test1 Count 123 Test2 Count 321 我沿着以下路径走 但没有运气 MyDropDown
  • C# 编译器数字文字

    有谁知道 C 编译器数字文字修饰符的完整列表 默认情况下 声明 0 使其成为 Int32 声明 0 0 使其成为 Double 我可以在末尾使用文字修饰符 f 来确保某些内容被视为 Single 例如像这样 var x 0 x is Int
  • 有什么方法可以重载 C# 中的扩展方法吗?

    我有以下模型模式 public abstract class PARENTCLASS public class CHILD A CLASS PARENTCLASS public static class EXTENSION public s
  • 在 C# 中何时使用 ArrayList 而不是 array[]?

    我经常使用一个ArrayList而不是 正常 array 当我使用时 我感觉好像我在作弊 或懒惰 ArrayList 什么时候可以使用ArrayList在数组上 数组是强类型的 并且可以很好地用作参数 如果您知道集合的长度并且它是固定的 则
  • 如何使用递归查找数字中的最小元素 [C]

    好的 所以我正在准备我的 C 考试 当谈到递归时我有点卡住了我是大学一年级的学生 这对我来说似乎有点困难 练习要求在给定的数字中使用递归函数我需要找到最小的元素 例如 52873 是 2 程序需要打印 2 include
  • 将错误代码映射到 C++ 中的字符串

    将错误代码从枚举映射到字符串的更有效方法是什么 在 C 中 例如 现在我正在做这样的事情 std string ErrorCodeToString enum errorCode switch errorCode case ERROR ONE
  • 从 NumPy 数组到 Mat 的 C++ 转换 (OpenCV)

    我正在围绕 ArUco 增强现实库 基于 OpenCV 编写一个薄包装器 我试图构建的界面非常简单 Python 将图像传递给 C 代码 C 代码检测标记并将其位置和其他信息作为字典元组返回给 Python 但是 我不知道如何在 Pytho
  • Linq.Select() 中的嵌套表达式方法调用

    I use Select i gt new T 每次手动点击数据库后将我的实体对象转换为 DTO 对象 以下是一些示例实体和 DTOS 用户实体 public partial class User public int Id get set
  • 无法识别解决方案文件夹中的 Visual Studio 2017 Nuget.config

    我在使用 Visual Studio 2017 时遇到问题 新的解决方案不断引用 C Users yopa AppData Roaming NuGet Nuget config 中意外位置的 Nuget config 文件 我已将 nuge
  • 为什么表达式 a = a + b - ( b = a ) 在 C++ 中给出序列点警告?

    以下是测试代码 int main int a 3 int b 4 a a b b a cout lt lt a lt lt a lt lt lt lt b lt lt b lt lt n return 0 编译此命令会出现以下警告 gt g
  • C++ Boost ASIO 简单的周期性定时器?

    我想要一个非常简单的周期性计时器每 50 毫秒调用我的代码 我可以创建一个始终休眠 50 毫秒的线程 但这很痛苦 我可以开始研究用于制作计时器的 Linux API 但它不可移植 I d like使用升压 我只是不确定这是否可能 boost
  • 嵌入式二进制资源 - 如何枚举嵌入的图像文件?

    我按照中的说明进行操作这本书 http www apress com book view 9781430225492 关于资源等的章节 我不太明白的是 如何替换它 images Add new BitmapImage new Uri Ima

随机推荐

  • 欧拉函数以及欧拉降幂

    大数幂运算指数太大的时候 我们需要进行降幂操作 首先呢 认识欧拉定理之前 先了解一下欧拉函数 欧拉函数性质 若p是一个质数 那么 p p 1 欧拉函数是积性函数 所以 nm n m 若n p k且p为质数 那么 n p k p k 1 证明
  • 耐人思考的“30秒法则”

    时间管理 30秒法则 也被称为 电梯法则 这个法则说得是 凡事要在最短的时间内把结果表达清楚 凡事要直奔主题 直奔结果 这个30秒法则 是由一个真实的故事引申出来的 美国知名咨询公司麦肯锡 有一位重要的大客户来公司洽谈 董事长因急事赶飞机
  • STM32毕业设计题目选题分享

    文章目录 1前言 2 STM32 毕设课题 3 如何选题 3 1 不要给自己挖坑 3 2 难度把控 3 3 如何命名题目 1前言 更新单片机嵌入式选题后 不少学弟学妹催学长更新STM32和C51选题系列 感谢大家的认可 来啦 以下是学长亲手
  • java 以流的形式从服务器下载文件并保存到本地

    1 基本实现流程 当我们想要下载网站上的某个资源时 我们会获取一个url 它是服务器定位资源的一个描述 下载的过程有如下几步 1 客户端发起一个url请求 获取连接对象 2 服务器解析url 并且将指定的资源返回一个输入流给客户 3 建立存
  • JavaScript设计模式读书笔记(五)=>架构型设计模式,MVC,MVP,MVVM

    全系列目录 JavaScript设计模式读书笔记 一 gt 创建型设计模式 JavaScript设计模式读书笔记 二 gt 结构型设计模式 JavaScript设计模式读书笔记 三 gt 行为型设计模式 JavaScript设计模式读书笔记
  • ] 2014找工作总结-机会往往留给有准备的人

    看了这篇文章 感觉到了震撼 如果早看到该有多好 我也是2014年的毕业生 我的找工作历程也基本上告一段落了 与本博文的原作者比起来 自己仿佛到现在也没有真正的为工作而准备 这也是自己没有规划的原因吧 所以在找工作的过程中只收到了一个offe
  • 电脑与云服务器传输文件,电脑与云服务器传输文件

    电脑与云服务器传输文件 内容精选 换一换 当创建文件系统后 您需要使用云服务器来挂载该文件系统 以实现多个云服务器共享使用文件系统的目的 本章节以Windows 2012版本操作系统为例进行CIFS类型的文件系统的挂载 同一SFS容量型文件
  • react map循环生成的button_【第1945期】彻底搞懂React源码调度原理(Concurrent模式)...

    前言 估计会懵逼 今日早读文章由成都 苏溪云投稿分享 正文从这开始 最早之前 React还没有用fiber重写 那个时候对React调度模块就有好奇 而现在的调度模块对于之前没研究过它的我来说更是带有一层神秘的色彩 色彩中朦胧浮现出两个字
  • ZIGBEE: Error[Pa045]: function "" has no prototype问题解决方法

    IAR CC2530的2个程序整合后 报错 而全部错误都是一个性质 Error Pa045 function has no prototype 去掉 Require prototype选项 重新编译即可 应该是一个编译顺序问题
  • 大屏三维地图怎么做?什么软件可以做室内地图?

    人们80 的活动时间是在室内 因此室内生成的数据量巨大且异常重要 在各类数据中 室内电子地图空间数据是非常重要的数据支撑 基于空间数据 一方面服务于C端客户 为C端客户的快速位置查询 了解室内地物分布及路径导航指引等提供服务 另一方面 地图
  • ng-alain 添加tinymce及tinymce图片上传功能模块

    tinymce的使用 tinymce中文文档 默认ng alain 已经内置了tinymc 查看共享模块是否加载了tinymce import NgxTinymceModule from ngx tinymce const THIRDMOD
  • 【牛客网练习题】Java专项练习(50题)含解析

    目录 1 运行结果 3 5 6 7 2 jdk1 8中 下面有关java 抽象类和接口的区别 说法错误的是 B D 3 在 applet 的方法中 可关闭小应用程序并释放其占用资源的是 D 4 对于构造方法 下列叙述正确的是 A C D 5
  • 从零开始使用Hexo搭建个人博客

    title Hexo Github搭建个人博客 date 2022 07 26 19 53 05 tags hexo 前往我的个人博客 阅读体验更佳本文链接 1 环境准备 1 1 安装Git 到Git 官网上下载安装 安装好后 使用命令查看
  • UNIAPP可视化设计工具 一键生成UNIAPP应用代码

    网址 DIY官网可视化工具 打造UNIAPP可视化一键生成导出
  • xman的思维导图快捷键_思维导图怎么做?

    推荐软件 微软的Mindmanager Xmind和imindmap 关于下载安装 浏览器搜索网址 https www xmind cn 网页导航栏选择Xmind8 Xmind有两种版本 一种体验版 即免费版 一种是需要购买的专业版 平时学
  • 傅里叶 方波 matlab,matlab实现方波傅立叶级数演示

    Square Wave Fourier Series Demo Square Wave Fourier Series Demo square wave fourier series demo m The user can design va
  • 重装系统后的一些环境配置

    重装系统后的一些环境配置 nvm 与 nodejs 配置 打开环境变量配置页面
  • Ubuntu 16.04安装libuvc

    安装依赖 sudo apt get intall libjpeg dev libusb 1 0 0 dev sudo ldconfig 安装libuvc git clone https github com ktossell libuvc
  • 搜索引擎技术简介

    搜索引擎技术简介 1 系统结构 抓取网页建立索引库在索引库中搜索结果排序主要的数据结构 倒排索引 inverted indexing list 这种数据结构广泛地应用在今天包括Web搜索引擎在内的各种信息检索系统中 其典型的总体结构 如下图
  • 基于MMX指令集的程序设计简介

    基于MMX指令集的程序设计简介 作者 Alex Farber出处 http www codeproject com cpp mmxintro asp MMX技术简介 Intel 公司的MMX 多媒体增强指令集 技术可以大大提高应用程序对二维