SSE2,全名为Streaming SIMD Extensions 2,是一种IA-32架构的SIMD指令集。SSE2是在2001年随着Intel发表第一代Pentium
4处理器也一并推出的指令集。它延伸较早的SSE指令集,而且可以完全取代MMX指令集。在2004年,Intel再度扩展了SSE2指令为SSE3指令集。与70条指令的SSE相比,SSE2
新增了144条指令。在2003年,AMD也在发布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 64、Sempron
64、Turion 64等为主的AMD
K8架构处理器;(2)、Phenom、Phenom
II、Athlon II等为主的AMD
K10、AMDK10.5架构处理器;(3)、Pentium
4、Xeon、Celeron、Celeron
D等为主的IntelNetBurst架构的处理器;(4)、IntelPentium
M与Celeron M;(5)、Intel
Core架构的处理器,包括 Core Duo、Core Solo 等;(6)、IntelCore 2架构的处理器,包含 Core 2 Duo、Core 2 Quad、Core 2 Extreme
等;(7)、IntelCore
i3、Core i5、Core
i7等;(8)、IntelAtom;(9)、Transmeta(全美达)Efficeon;(10)、VIA(威盛)C7;(11)、VIANano。
不支持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
分享到:
相关推荐
介绍Intel的SSE/SSE2等MISD指令的原理及使用方法,适合初学者,或当参考使用。 这篇文章告诉使用者如何学习使用由Intel® Pentium® 4 Processor所提供的SSE和SSE2指令集,以及为什么要使用SSE/SSE2,并且举例说明...
SSE2命令大全,内容十分详细,中文版,对于要使用SSE2的开发者来说,帮助很大!
SSE的介绍及其使用文档,里边介绍了sse相关运算的相关函数及数据操作
SSE2 编程简介,图像处理
SSE是指令集的简称,它包括70条指令,其中包含单指令多数据浮点计算、以及额外的SIMD整数和高速缓存控制指令。
Os_Snow_Leopard_10_6_1_10_6_2_Sse2_Sse3_Intel_Amd_Iso_chinamac.com.torrent苹果Mac下载种子文件。
SSE指令集SSE优化手册,SSE指令 SIMD优化
SSE4 Home › Articles by Kiefer Kuah April 2007 Intel Software Solutions Group Abstract Intel® SSE4 is a new set of Single Instruction Multiple Data (SIMD) instructions that will be introduced in the...
大神的学习笔记,个人也是很受益,所以拿出来分享一下!
sse2neon 重要的提示 该项目现已弃用! 其他软件工程师已在另一个GitHub库中对该项目进行了持续改进。 这不再考虑SSE2NEON官方仓库! 您应该重定向到: AC / C ++头文件,可将Intel SSE内部函数转换为ARN NEON...
在ARM平台上使用neon指令集生成了一套替换sse指令的函数接口;
该资源是针对无GPU的计算机,支持仅有CPU的计算机,支持的CPU架构指令集是SSE2,运行在windows系统下。
通过一个完整的java示例来演示如何通过okhttp来调用远程的sse流式接口 背景:我们有一个智能AI的聊天界面,需要调用三方厂商的大模型chat接口,返回答案(因为AI去理解并检索你的问题的时候这个是比较耗时的,这个...
使用SSE2加载/存储内部指令的memcpy()。 与VC ++一起为32位编译时,它的性能优于memcpy()。 当为64位编译时,它的性能与memcpy()相同,因为所有x86-64芯片都支持SSE,因此memcpy()已被实现。 在Linux上,...
MATLAB_SSE_MSE_SSR_SST等的介绍pdf文件
最近整理的VS2010所支持的VC下可以调用的SSE相关函数包括SSE(1,2,3,s3,4.1,4.2,4a))。
使用SIMD的C ++图像处理库:SSE,SSE2,SSE3,SSSE3,SSE4.1,SSE4.2,AVX,AVX2,AVX-512,VMX(Altivec)和VSX(Power7),NEON for ARM。 简介Simd库是一个免费的开源图像处理和机器学习库,专为C和C ++程序员...
Simd:使用以下SIMD的C ++图像处理和机器学习库:SSE,SSE2,SSE3,SSSE3,SSE4.1,SSE4.2,AVX,AVX2,AVX-512,VMX(Altivec)和VSX(Power7),NEON臂
关于在SSE、SSE2代码优化过程中数据16位对齐方式的详细说明,包括如何对齐以及对齐的多种方式。