MMX及SSE优化--MMX篇

C/C++指令集介绍以及优化(主要针对SSE优化) 前言:最近在做一些OpenCV的优化相关的东西,发现OpenCV现在的执行效率很高的原因一部分是来自于底层的优化,比如指令集优化,但是一直没找到比较系统性的关于CPU指令集优化的文章或者是书籍,于是自己打算做一个总结,鉴于水平有限,有不正确的地方还望有大佬指正。 一、CPU指令集优化的概述 1.1 数据并行的两种实现 在计算机体系中,数据并行有两种实现路径: MIMD(Multipl... 阅读详情
  MMX和SSE都是INTEL开发的基于SIMD(单指令多数据流)的技术。所谓单指令多数据流是指可以用一条指令可以完成多个数据的操作。虽然64位系统已经推出,但是我们大部分都是使用32位系统,所以如果要完成两个128位的相加运算,用普通32位指令很明显要执行4条相加指令,而基于64位的MMX指令只需要执行两次即可完成,更强大的SSE能一次处理128位,故一次就可以完成操作,所以采用MMX及SSE优化能够大幅度提升程序性能。
    MMX采用处理器的80位的浮点寄存器的低64位作为MMX寄存器,一共有8个,从mm0到mm7,因为是“借用”浮点寄存器的低64位所以每次在用完MMX指令后一定要用EMMS指令将寄存器清空,MMX主要是针对整数运算进行优化,一个64位的MMX寄存器可以同时存入8个8位或者4个16位的整数,估计一次性就可以完成8次8位运算或者4次16位运算,要注意的MMX指令不能直接对32位数进行2次运算,但可以把32位拆分成两个16位再进行运算。MMX技术还有一个非常有用的特性是饱和运算,比如两个8位数相加:128+129相加后很明显超过了8位的最大值256,但是进行饱和运算相加的结果将是最大值256,饱和运算将运算结果控制在相应位数的范围内。

下面举一个例子:
在VC 6 SP6中可以直接在内联汇编中使用mmx指令,而且调试时也能查看MMX寄存器
__int16 a[]={1,2,3,4}
__int16 b[]={5,6,7,8}
_asm{
movq mm0,a                                         //将数组a中的4个数一次存入mm0
movq mm1,b                                        //将数组b中的4个数一次存入mm0
paddsw mm0,mm1                               //16位带符号的饱和相加,结果存在mm0中
movq a,mm0                                        //再把mm0中的结果存放在数组a中 
emms                                                   //千万别忘了,擦干净
}

也可以不用内联汇编直接用函数,MS的最新的SDK和INTEL的编译器都支持这种方式
#include <xmmintrin.h>                            //使用所必须包含的头文件
__m64 a=_mm_set_pi16(1, 2, 3, 4);       //向a中写入4个16位的整数
__m64 b=_mm_set_pi16(5, 6, 7, 8);      //最后一位写入最低位,即8写入最低位
a=_m_paddsw(a,b);                               //完成16位加法运算
_m_empty;                                             //一样不要忘记擦PP,嘿嘿

以上只是最基本最简单的介绍,MMX一共有57条指令,包括基本算术运算指令,比较指令,转换指令,逻辑指令,位移和传输指令,此处就不一一列举,详细的指令介绍请参看INTEL的官方网站。但请记住MMX是针对整数运算的,千万不要用于浮点运算,浮点运算要用更为强大的SSE指令完成,预知SSE详解且待下回分解。

OpenCV图像数据结构优化:MMX与SSE技术实现图像反色算法 在图像处理和计算机视觉领域,OpenCV是一个不可或缺的工具库,而Mat是其核心的数据结构。OpenCV由英特尔实验室发起,旨在促进计算机视觉技术的普及和加速开发进程。随着技术的发展,OpenCV逐渐被全球开发者广泛使用,应用于多种领域如安全监控、医疗成像、机器人视觉等。1.1 OpenCV的起源和发展OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉和机器学习软件库。 阅读详情

相关推荐

矩阵相乘SSE优化算法

该代码实现采用SSE对矩阵相乘进行优化,一般的矩阵相乘算法与SSE优化算法耗时进行比较比较。

SSE指令集算法优化

先挖个坑,记录下资料。 REF 1、(c/c++ 代码中使用sse指令集加速)https://www.cnblogs.com/dragon2012/p/5200698.html 2、SSE指令指令集进行程序加速、DCT的优化处理(https://blog.youkuaiyun.com/yangdashi888/article/detail...

weixin_40593924的博客 1370

intel汇编:MMX/SSE指令集(b)

最新intel汇编语言MMX/SSE指令集,熟悉汇编指令工作原理,

一个简单求和函数的C-》SSE-》AVX的实现过程

(转)Intrinsic—使用SSE、AVX指令集处理单精度浮点数组求和(支持vc、gcc,兼容Win、Linux、Mac)   (2013-01-14 10:45:16) 转载▼ 标签:  杂谈 分类: 汇编 [C] 跨平台使用Intrinsic函数范例1——使用SSE、AVX指令集 处理 单精度浮点数组求和(支持vc、gcc

战斗蜗牛的专栏 6312

STC8单片机高精度EV1527解码实战:定时器捕获+状态机抗干扰方案

EV1527是一种广泛应用于433MHz无线遥控的曼彻斯特编码协议,其核心在于对脉宽时序(如同步头、逻辑0/1)的微秒级精确识别。传统外部中断+延时判别方式受MCU中断延迟、编译优化及环境噪声影响,极易导致误码;而基于硬件定时器输入捕获的解码方案,将时间测量交由硬件完成,显著提升时序鲁棒性与温度/电压适应性。该技术适用于STC8等无专用无线解码外设的8位单片机,在智能开关、晾衣架、车库门控等IoT终端中实现低至0.003%的稳定误码率。本文聚焦STC8H系列利用T1定时器下降沿捕获与有限状态机协同解码EV1

weixin_29188997的博客 181

CST高阶技巧:用周期性边界快速仿真共面波导色散特性(含JDM求解器优化)

本文详细介绍了在CST仿真软件中,利用周期性边界条件结合JDM本征模求解器,高效分析共面波导色散特性的高阶技巧。该方法通过仿真一个单元胞而非整条传输线,大幅提升计算效率,并提供了从建模、边界设置、求解器优化到后处理的完整工作流程,是高频电路设计的实用指南。

weixin_29280219的博客 402

OpenCV算法加速(2)使用SIMD指令集(MMX、SSE、AVX)和MIPP实现视觉算法优化

SIMD指令集 SSE/AVX https://blog.youkuaiyun.com/qq_32916805/article/details/117637192 MMX和SSE实现的opencv数据结构的图像反色算法优化 SSE图像算法优化系列一:一段BGR2Y的SIMD代码解析。 SSE图像算法优化系列七:基于SSE实现的极速的矩形核腐蚀和膨胀(最大值和最小值)算法。 ......

$firecat利白的代码足迹$ 1万+

Anki小白必看:手把手教你打造高颜值个性化笔记模板(附Leaflyer模板下载)

本文为Anki新手提供详细的个性化笔记模板设计指南,从基础配置到高级定制技巧,帮助用户打造高效记忆系统。特别推荐Leaflyer模板下载,通过视觉优化和功能强化,显著提升学习体验和记忆效率。

weixin_28717969的博客 433

单线程、SSE、AVX运行效率对比——最大值/最小值运算

前言 单列数组下,AVX比SSE稍慢! math_function.h #pragma once #include <immintrin.h> #include <stdio.h> float MathMax(const float *input, int size); float SSEMax(const float *input, int size); fl...

samylee的博客 7896

ISO26262 功能安全各个阶段测试要求

1. 开发过程说明 系统层面:包括软硬件集成测试、系统集成测试以及整车测试。 硬件层面:包括硬件集成与测试。 软件层面:单元测试、集成测试。 2. 功能安全总体要求 2.1 各项指标 2.2 诊断覆盖度举例 针对一个信号举例说明: 3. 功能安全测试要求 3.1 测试计划 核心内容应包括, 测试对象:需要测试的对象描述,以及测试的范围描...

AgingMoon的博客 1万+

基于Blender软件对Matterport3D数据集场景可视化

使用Blender软件对 Matterport3D 中的室内场景进行可视化。

qq_44100524的博客 289

[C] 跨平台使用Intrinsic函数范例1——使用SSE、AVX指令集 处理 单精度浮点数组求和(支持vc、gcc,兼容Windows、Linux、Mac)...

作者:zyl910。   本文面对对SSE等SIMD指令集有一定基础的读者,以单精度浮点数组求和为例演示了如何跨平台使用SSE、AVX指令集。因使用了stdint、zintrin、ccpuid这三个模块,可以完全避免手工编写汇编代码,具有很高可移植性。支持vc、gcc编译器,在Windows、Linux、Mac这三大平台上成功运行。 一、问题背景   最初,我们只能使用汇编语言来编写SIMD...

weixin_33971205的博客 1433

从 SAP BTP trial 到第一个 CPI iFlow 的实操路线图

本文介绍了如何从零开始学习SAP CPI(现称SAP Integration Suite中的Cloud Integration能力)。主要内容包括:1)明确学习边界,建议使用SAP BTP trial账号进行个人练习,注意90天有效期限制;2)理解SAP BTP账号模型层级结构(Global Account→Subaccount→Space);3)详细说明申请trial账号流程,推荐选择Singapore区域以避免兼容问题;4)指导如何检查Entitlements和Quotas,强调应专注于SAP Inte

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 164

MMX及SSE优化--SSE篇

上回讲到针对整数运算的MMX优化技术,然而真正大运算量的图形和声音处理大都用的是浮点运算,而且现在对浮点运算的要求也是越来越高,在这样一个条件下INTEL终于在Pentium III处理中增加针对浮点运算优化的SSE指令,所以所有用过SSE指令的程序必须在Pentium III或者Althon XP以后的CPU上才来运行。  SSE全新定义了8个新的128位寄存器xmm0-xmm7,比MMX

feixiaku的专栏 1059

禾赛激光雷达AT128P/海康相机(1):ROS环境设备驱动

sudo cp *.so /opt/MVS/lib/64/ # 复制当前文件夹中所有.so文件 到 “/opt/MVS/lib/64/” 文件中。将相应的.so文件复制到 /opt/MVS/lib/64/。我解压的是x86_64的,解压之后,打开,再解压MVS。然后在上一层,也就是选择x86_64那一层打开终端。新建一个工作空间,或者打开自己的工作空间。)包放在src内,并解压,然后编译。MVS V2.1.2下载之后解压,// 驱动代码下载到src文件里面。// 特定文件夹中打开终端。

努力努力努力 882

EMI辐射发射超标案例

EMI辐射发射超标案例

让你爱上电路设计 8502

c语言评价函数,自己编写的strlen函数 各位评价分析下

该楼层疑似违规已被系统折叠隐藏此楼查看此楼全角 换 掉-----------------------static __declspec(naked) void great_ansi_counter(const char*){__asm{mov     eax,dword ptr[esp+4] ; source_pointer to poll (will increase)mov     ebx,...

weixin_28366053的博客 116

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

计算机英语术语介绍,计算机英语术语大全.doc

计算机英语术语大全.doc1、CPU3DNow!(3D no waiting)ALU(Arithmetic Logic Unit,算术逻辑单元)AGU(Address Generation Units,地址产成单元)BGA(Ball Grid Array,球状矩阵排列)BHT(branch prediction table,分支预测表)BPU(Branch Processing Unit,分支处理...

weixin_31080131的博客 199

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

关于使用MMX/SSE技术优化memcpy的尝试

近来,希望能通过使用某种技术优化常规memcpy()的性能,于是尝试了 MMX/SSE,希望能借此实现一个性能更高的memcpy函数。代码如下(里面的USE2函数是借用别人的,但性能也不怎么样):#include #include #include #include #include #define LEN 100*1024*1024 #define USE1 class TimeUse{ public: TimeUse(char * cMsg) { mem

OJOE的专栏 7573

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

MMX,SSE,SSE2扫盲

MMX 指令集 MMX(Multi Media eXtension,多媒体扩展指令集)指令集是Intel公司于1996年推出的一项多媒体指令增强技术。MMX指令集中包括有57条多媒体指令, 通过这些指令可以一次处理多个数据,在处理结果超过实际处理能力的时候也能进行正常处理,这样在软件的配合下,就可以得到更高的性能。MMX的益处在于, 当时存在的操作系统不必为此而做出任何修改便可以轻松地

兼容并蓄终宽阔,若谷虚怀鱼自游 7816

【整理】SIMD、MMX、SSE、AVX、3D Now!、neon

SIMD SIMD单指令流多数据流(SingleInstruction Multiple Data,SIMD)是一种采用一个控制器来控制多个处理器,同时对一组数据(又称“数据向量”)中的每一个分别执行相同的操作从而实现空间上的并行性的技术。在微处理器中,单指令流多数据流技术则是一个控制器控制多个平行的处理微元,例如Intel的MMX或SSE以及AMD的3D Now!技术。 --------

[conowen]大钟的专栏 3万+
上一篇: SSE2初学指南
下一篇: MMX及SSE优化--SSE篇
dbgnu
博客等级 码龄25年 3粉丝 3原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值