-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}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)