SSE2介绍及其简单用法举例

2023-11-03

SSE2,全名为Streaming SIMD Extensions 2,是一种IA-32架构的SIMD指令集。SSE2是在2001随着Intel发表第一代Pentium 4处理器也一并推出的指令集。它延伸较早的SSE指令集,而且可以完全取代MMX指令集。在2004,Intel再度扩展了SSE2指令为SSE3指令集。与70条指令的SSE相比,SSE2 新增了144条指令。在2003AMD也在发布AMD64的64比特处理器时跟进SSE2指令集。

SSE2延伸了MMX指令群使用XMM暂存器来运算,这能让开发人员完全避免让8个64比特MMX暂存器与原有的IA-32浮点运算暂存器共用。而这样子就能够不需要切换MMX与x87浮点运算的前提之下混合SIMD标量与浮点矢量运算。不过,这不会因为SSE的暂存器的精度提高而让运算结果的精度也提高。而还有部分的SSE2指令集包含了一系列的CPU高速缓存控制指令。当处理理论上无限的数据流,还有数字格式转换指令所产生出来的大量补数,能够使高速缓存污染有效的降低。AMD在AMD64架构上的SSE2再新增额外8个暂存器,把暂存器的量提升到16个(XMM0~XMM15)。这些额外的暂存器只有运行于64比特的模式下才能够使用。2004年,Intel也采用这些额外的暂存器于它的x86-64(Intel 64)架构。

    MMX与SSE2的差别:SSE2让MMX指令群使用XMM暂存器来运算。换句话说,现有的MMX脚本能够完全转换成SSE2。不过XMM的暂存器是MMX暂存器的两倍大,循环计数器与存储器访问机制也会跟着修改来因此变化。而即使一个SSE2指令能够比MMX指令操作多两倍数据量,性能也并没有很明显的提升。有两个主要原因导致此现象:存储器内部访问SSE2的数据并没有以16字节的间隔对齐,这会造成明显的性能损失。还有在大多数的x86架构实现上SSE2的指令吞吐量是小于MMX的。Intel 首先面对第一个问题的解决方案是在SSE3指令中新增一个指令,能够在处理未对齐的数据时减少overhead。而第二个问题也在Core微架构中将运行引擎加宽而解决。

    支持SSE2的编译器:(1)、微软的Visual C++与MASM;(2)、Intel C++ 编译器;(3)、GCC 3及更高版本;(4)、Sun Studio Compiler Suite。

支持SSE2指令集的处理器:(1)、Athlon 64Sempron 64Turion 64 等为主的 AMD K8 架构处理器;(2)、PhenomPhenom IIAthlon II 等为主的 AMD K10AMDK10.5 架构处理器;(3)、Pentium 4XeonCeleronCeleron D 等为主的 Intel NetBurst 架构的处理器;(4)、Intel Pentium M 与 Celeron M;(5)、Intel Core 架构的处理器,包括 Core Duo、Core Solo 等;(6)、IntelCore 2 架构的处理器,包含 Core 2 Duo、Core 2 Quad、Core 2 Extreme 等;(7)、Intel Core i3Core i5Core i7 等;(8)、Intel Atom;(9)、Transmeta(全美达)Efficeon;(10)、VIA(威盛)C7;(11)、VIA Nano

    不支持SSE2处理器的共同特点:SSE2是IA-32架构的延伸。所以目前所有不支持IA-32架构的其他架构一概不支持SSE2。由于x86-64架构的处理器是由IA-32延伸出来的,所有x86-64架构的处理器也都支持SSE2指令集。而有些CPU并没有支持SSE2,但是有其他的指令集可以提供与SSE2相似的功能。下列的IA-32架构的处理器是在SSE2 发表之后才开发的,但是并不支持SSE2指令集:(1)、比 Athlon 64 早推出的 AMD 处理器,包含了所有使用Socket A插槽的处理器;(2)、比Pentium 4早推出的Intel处理器;(3)、VIA的C3处理器;(4)、Transmeta Crusoe处理器。

SSE2 是一套由越来越多的第三方应用和驱动程序使用的关于处理器的标准指令集。

    SSE2 was first introduced on the IntelPentium 4, and are also known sometimes as "Willamette" instructions.These instructions are very similar to the SSE instructions in structure, butallow us considerably more flexibility in crunching numbers. The biggestdifferences between SSE and SSE2 were the ability to deal withdouble-precision, or 64bit, floating-point values as well as with 32bit ones,along with the ability to now work on 128bit integer types in XMM registers aswell. In total, 144 new instructions were added.

简单用法举例:

#include "stdafx.h"
//#include <mmintrin.h>//mmx header file
//#include <xmmintrin.h>//sse header file(include mmx header file)
#include <emmintrin.h>//sse2 header file(include sse header file)

void Integer_Add(const unsigned char* p1, const unsigned char* p2, unsigned char* p3, int num)
{
	__m128i m1 = _mm_loadu_si128((__m128i*)p1);
	__m128i m2 = _mm_loadu_si128((__m128i*)p2);
	__m128i m3 = _mm_add_epi8(m1, m2);

	_mm_storeu_si128((__m128i*)p3, m3);
}

void Integer_Sub(const unsigned char* p1, const unsigned char* p2, unsigned char* p3, int num)
{
	__m128i m1 = _mm_loadu_si128((__m128i*)p1);
	__m128i m2 = _mm_loadu_si128((__m128i*)p2);
	__m128i m3;

	m3 = _mm_setzero_si128();
	m3 = _mm_subs_epi8(m1, m2);

	_mm_storeu_si128((__m128i*)p3, m3);
}

void Integer_Avg(const unsigned char* p1, const unsigned char* p2, unsigned char* p3, int num)
{
	__m128i m1 = _mm_loadu_si128((__m128i*)p1);
	__m128i m2 = _mm_loadu_si128((__m128i*)p2);
	__m128i m3;

	m3 = _mm_setzero_si128();
	m3 = _mm_avg_epu8(m1, m2);

	_mm_storeu_si128((__m128i*)p3, m3);
}

int _tmain(int argc, _TCHAR* argv[])
{
	const int num = 16;
	unsigned char array1[num] = {0x00, 0x10, 0x20, 0x30, 0x40, 0x50, 0x60, 0x70, 0x80, 0x90, 0xa0, 0xb0, 0xc0, 0xd0, 0xe0, 0xf0};
	unsigned char array2[num] = {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f};
	unsigned char array3[num] = {0};

	Integer_Add(array1, array2, array3, num);
	Integer_Sub(array1, array2, array3, num);
	Integer_Avg(array1, array2, array3, num);

	return 0;
}


参考文献:

1、 http://blog.csdn.net/fengbingchun/article/details/18318065

2、http://blog.csdn.net/fengbingchun/article/details/18460199

3、http://zh.wikipedia.org/wiki/SSE2

4、http://blog.csdn.net/zyl910/article/details/8116560

5、http://www.songho.ca/misc/sse/sse.html

6、http://zerocool.is-a-geek.net/?p=422

7、http://courses.engr.illinois.edu/ece390/books/labmanual/inst-ref-simd.html

8、https://www.kernel.org/pub/linux/kernel/people/geoff/cell/ps3-linux-docs/CellProgrammingTutorial/BasicsOfSIMDProgramming.html



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

SSE2介绍及其简单用法举例 的相关文章

  • clip文件不显示缩略图解决方法

    删除该文件夹后重启电脑 clip文件显示缩略图 打开优动漫 原路径中自动创建DontShowMessage 但仍可显示缩略图 来源 优动漫 动漫创作支援平台 优动漫PAINT绘画软件 udongman cn
  • 集群间同步导致的内存溢出

    有一个基于B S的MIS系统 硬件为两台2个CPU 8GB内存的HP小型机 服务器是WebLogic9 2 每台机器启动了3个WebLogic实例 构成一个6个节点的亲合力式集群 由于是亲合式集群 节点之间没有进行Session同步 但是有
  • python爬虫和web方向_王者程序员整理的Python网络爬虫和web的系统学习路线图

    如何学习Python系统 我相信这个话题应该有很多人想学习Python 今天 我将告诉你一个zero rooted新手 如何系统性地学习Python编程语言 和更少的时间浪费在学习的道路 并避免弯路 我相信每个人都知道Python目前集中在
  • Git Stash 贮藏命令

    文章目录 一 前言 二 git stash命令演示 三 git stash命令总结 一 前言 在使用Git过程中 有时当你在项目的其它分支正在进行开发 并且该分支还尚未开发完成进行提交 这个时候需要你切换分支进行工作 这个时候做到一半的工作
  • 如何快速确认代码是否被编译链接

    1 应用场景 1 在大型项目中 通过编译选项可以编译成不同平台 不同分支的程序 2 编译出来不同的程序 原因就是编译链接了不同的头文件和源代码 比如 工程中不同路径下存在多份同名文件 文件里通过宏定义有多个代码分支 2 确认方法 2 1 分
  • Qcom 平台 camera 之 RAW+YUV图抓取

    目录 前言 抓取注意事项 dumping mask bit 定义 Andorid5 8 HAL1 拍照 RAW 调试 抓取拍照 RAW 图 Android9 0 Android9 0 HAL1 preview RAW 操作步骤 抓取的脚本
  • 【Docker实践】Docker中使用 Dockerfile 构建自己的镜像并运行redis

    Docker实践 Docker中使用 Dockerfile 构建自己的镜像并运行redis 资源 docker redis 镜像官网 1 获取redis的配置文件 2 添加 Dockerfile 文件 3 添加运行脚本 问 如何解决报错 u
  • 苹果账号申请流程——99刀(个人版或公司版 ),299刀(企业版)

    APPLE的政策是 要发布到APP STORE必须用99美元的个人版或公司版Apple Developer Programs 要在非商店外下载只能使用299美元的企业版iOS Developer Enterprise 开发者证书目前有三种

随机推荐

  • mybatis的二级缓存你了解多少

    缓存机制 Mybatis提供查询缓存 如果缓存中有数据就不用从数据库中获取 用于减轻数据压力 提高系统性能 Mybatis的查询缓存总共有两级 我们称之为一级缓存和二级缓存 一级缓存是SqlSession级别的缓存 在操作数据库时需要构造s
  • GLES3.0中文API-glGetAttribLocation

    返回目录 openglES3 0中文API list 名称 glGetAttribLocation 返回属性变量的位置 C规范 GLint glGetAttribLocation GLuint program const GLchar na
  • ttf字体取点阵字模

    ttf是矢量字体 freetype2可以解析并操作ttf格式字体 利用它可实现ttf字体提取点阵字模c源代码文件及头文件 软件界面如下 字框为假象字符边框尺寸 字符尺寸为实际字符尺寸 通常一致即可 碰到有些偏小字体可以适当调大字框尺寸 软件
  • 电子工程师的自我修养 - 整流桥

    基本介绍 利用二极管的单向导电性将正负变化的交流电压变为单向脉动电压的电路 在交流电源的作用下 整流二极管周期性地导通和截止 使负载得到脉动的直流电 工作原理 在整流桥的每个工作周期内 同一时间只有两个二极管进行工作 因此我们可以将整流器工
  • fiddler接口基础

    为什么要先学fiddler 学习接口测试必学http协议 如果直接先讲协议 我估计小伙伴们更懵 为了更好的理解协议 先从抓包开始 结合抓包工具讲http协议更容易学一些 抓firefox上https请求 fiddler是一个很好的抓包工具
  • 小理解

    一 数组指针 数组名本身就是一个指针 指向数组的首地址 如int p 10 表示一个指向10个int元素的数组的一个指针 注意这是声明定长数组时 其数组名指向的数组首地址是常量 而声明数组并使某个指针指向其值指向某个数组的地址 不一定是首地
  • 堆栈详解

    堆区 1 存储的全部是对象 每个对象都包含一个与之对应的class的信息 class的目的是得到操作指令 2 jvm只有一个堆区 heap 被所有线程共享 堆中不存放基本类型和对象引用 只存放对象本身 栈区 1 每个线程包含一个栈区 栈中只
  • 程序设计的基本概念

    程序设计的基本概念 1 程序 2 结构化程序设计 1 程序 由高级语言编写的程序称为 源程序 由C语言编写的程序扩展名为 C 经过 编译 目标程序 后生成文件的扩展名为 obj 经过 链接 可执行程序 后生成文件的扩展名为 exe C语言源
  • System.Net.HttpListenerException (0x80004005): 拒绝访问。

    C 生成的exe突然报错了 原来是被人改了权限配置 我也没改回来 只需要将生成的exe设置成管理员身份运行 往后就不会再报错了
  • 15个免费学习JavaScript的最佳网站

    JavaScript是Web最流行的语言 对于任何Web开发人员来说 JavaScript现在是必须学习的语言 像追踪树这样的创新已经大大提高了JavaScript的性能 并且它在所有开发人员中越来越受欢迎 如果您想要事业得到进一步的发展
  • Python 基础——range() 与 np.arange()

    range 返回的是range object 而np arange 返回的是numpy ndarray type np arange 10 np ndarray 两者都是均匀地 evenly 等分区间 range尽可用于迭代 而np ara
  • Images之Dockerfile中的命令2

    COPY COPY has two forms COPY chown
  • cocos2dx中毒冰冻shader

    中毒效果 ifdef GL ES precision mediump float endif uniform sampler2D u texture varying vec2 v texCoord varying vec4 v fragme
  • 《深入理解Java函数式编程》系列文章

    Introduction 本系列文将帮助你理解Java函数式编程的用法 原理 本文受启发于JavaOne 2016关于Lambda表达式的相关主题演讲Lambdas and Functional Programming和Refactorin
  • 在Python环境下使用pgmpy构建动态贝叶斯网络并进行参数学习(附详细代码)

    首先列举当前主要构建贝叶斯网络的一些工具 1 软件 Netica SMILE 2 MATLAB包 BNT 3 Python包 pgmpy libpgm pomegranate 4 R包 dbnlearn 如果是单纯的进行贝叶斯网络的学习与推
  • html弹窗代码只弹窗一次,信息弹窗提示一天只弹出一次js代码

    信息弹窗提示一天只弹出一次js代码 通过jquery cookie js实现功能 避免重复弹出 弹窗提示 margin 0 padding 0 alert windows display none position absolute z i
  • 计算机网络第八版详细思维导图复习(可复制修改)

    按照我们学校的教学课本 计算机网络第八版 谢希仁 计算机网络自顶向下第七版 老师习题讲解课件 B站 计算机网络微课堂 有字幕无背景音乐版 王道计算机考研 计算机网络 湖科大深入浅出计算机网络 示范教学包等途径整合而成 有个人总结和自己的思考
  • 使用SVG+React实现飞行仪表仿真

    SVG React实现 演示地址 https liujialun github io i
  • 深入理解Mysql底层数据结构

    一 索引的本质 索引是帮助MySQL高效获取数据的排好序的数据结构 二 索引的数据结构 二叉树 红黑树 Hash表 BTree B Tree mysql的索引采用的是B 树的结构 mysql为什么不用二叉树 因为对于单边增长的数据列 二叉树
  • SSE2介绍及其简单用法举例

    SSE2 全名为Streaming SIMD Extensions 2 是一种IA 32架构的SIMD指令集 SSE2是在2001年随着Intel发表第一代Pentium 4处理器也一并推出的指令集 它延伸较早的SSE指令集 而且可以完全取