如何在vs2010中使用SSE指令集

如何在vs2010中使用SSE指令集,第1张

您好,1、主要就是在工程中包含SSE头文件即可,具体如下:mmintrin.hMMXxmmintrin.hSSEemmintrin.hSSE2pmmintrin.hSSE3tmmintrin.hSSSE3intrin.hSSE4Asmmintrin.hSSE4.1nmmintrin.hSSE4.22、然后vs2010工程的编译方式最好修改为x64的64位编译。3、项目属性的“C/C++”->“语言”中,添加openmp支持。4、使用鲁大师查看你的CPU特征,以本人i52410为例,特征为“MMXSSESSE2SSE3SSE4.1SSE4.2”,就说明该CPU支持SSE4.2指令集。5、在vs2010工程中添加相应指令集的头文件,既可以开始SSE编程之旅。

1、编译器的自动矢量化

-mfpmath=sse

仅建议在P4和K8以上级别的处理器上使用该选项。

-mmmx

-msse

-msse2

-msse3

-m3dnow

-mssse3(gcc-4.3新增)

-msse4.1(gcc-4.3新增)

-msse4.2(gcc-4.3新增)

-msse4(含4.1和4.2,gcc-4.3新增)

是否使用相应的扩展指令集以及内置函数,需要按照自己的cpu做选择。

2、使用C/C++类库

目前,GNU

GCC等大多数编译器都提供了对SSE指令集的变成支持,允许用户在C++代码中不用编写汇编代码,就可以直接通过调用库函数而直接使用SSE指令。

3、使用编译器的内嵌原语(Intrinsics)

SSE的intrinsics的规则

_mm_<opcode>_<suffix>

其中,<opcode>是指令的类别,像add、sub等等,<suffix>是指令的种类。在SSE浮点运算指令中,只有两种:ps和ss。

ps:Packed

Single-precision,指对寄存器中的四个单精度浮点同时进行运算。

ss:Scaler

Single-precision,指对寄存器中的DATA0进行运算。

编程时需要包含下表所示的头文件:

mmintrin.h

MMX

xmmintrin.h

SSE

emmintrin.h

SSE2

pmmintrin.h

SSE3

tmmintrin.h

SSSE3

intrin.h

SSE4A

smmintrin.h

SSE4.1

nmmintrin.h

SSE4.2

mm3dnow.h

3DNOW

说明:如果导入一个高版本的指令集头文件,那么一般就不需要在导入低版本的指令了。

4、使用内嵌汇编

指令语法特征

如:PADDUSW(无符号饱和模式的字组相加)

前缀:P代表成组数据类型

*** 作指令:如ADD、SUB等

后缀:US为无符号饱和处理

S为有符号饱和处理

B、W、D、Q分别为字节组、字组、双字组、四字。

GCC的asm结构

用汇编编写的程序运行速度快,但开发速度非常慢,效率也很低。如果只是想对关键代码段进行优化,更好的办法是将汇编指令嵌入到C语言程序中,充分利用高级语言和汇编语言各自的优点。一般来讲,在C代码中嵌入汇编语句要比“纯粹”的汇编语言代码复杂的多,因为需要解决如何分配寄存器,以及如何与C代码中的变量相结合等问题。内联汇编能够灵活 *** 作,而且可以使其输出通过C变量显示出来。因为它具有这种能力,所以asm可以用作汇编指令和C程序之间的接口。使用__asm__关键字,如果超过一行的指令,每行要加上双引号,并且后面加上\n\t。如果希望确保编译器不会在“asm”内部优化指令,可以在“__asm__”后面使用关键字“volatile”。

内联汇编的基本要素

具体语法结构,请看我的一篇博文:《GCC内嵌汇编》文章连接:

http://blog.chinaunix.net/u3/119372/showart_2417924.html

基本要素说明:

限定符

意义

“m” “v” “o”

内存单元

“r”

任意寄存器

“q”

寄存器eax,ebx,ecx,edx之一

“i” “h”

直接 *** 作数

“E” “F”

浮点数

“g”

任意

“a” ”b” ”c” ”d”

分别表示寄存器eax,ebx,ecx,edx

“S” ”D”

寄存器esi,edi

“I”

常数(0至31)

5、SSE编程注意事项

数据对齐

CPU内存单元以16Byte为边界,如果数据在运算之前不进行对齐,会是指令运算产生大量延时。

GCC:

float

__attribute__((aligned(16))) a[4]={1.2f,3.5f,1.7f,2.8f}

VC:

__declspec(align(16)) float a[4]={1.2f,3.5f,1.7f,2.8f}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/11747615.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-18
下一篇 2023-05-18

发表评论

登录后才能评论

评论列表(0条)

保存