GCC赢得';不要在32位中使用SSE
在linux x64上,如果我以这种方式使用gcc编译代码GCC赢得';不要在32位中使用SSE,gcc,sse,gcc4.8,Gcc,Sse,Gcc4.8,在linux x64上,如果我以这种方式使用gcc编译代码 gcc-m32-march=native-mfpmath=sse-c-ftree矢量化myfile.c 如果我看一下程序集,我没有看到使用任何SSE指令或寄存器,代码结果与生成的代码完全相同,没有任何标记gcc myfile.c 在我的代码中,许多操作都是使用浮点数组和矩阵的,所以gcc不使用SSE,并且与基本编译相比,不执行任何优化,这非常奇怪 为什么??这是编译器的错误吗 编辑 如果我添加标志-msse2编译器也使用SSE指令,但是
gcc-m32-march=native-mfpmath=sse-c-ftree矢量化myfile.c
如果我看一下程序集,我没有看到使用任何SSE指令或寄存器,代码结果与生成的代码完全相同,没有任何标记gcc myfile.c
在我的代码中,许多操作都是使用浮点数组和矩阵的,所以gcc不使用SSE,并且与基本编译相比,不执行任何优化,这非常奇怪
为什么??这是编译器的错误吗
编辑
如果我添加标志
-msse2
编译器也使用SSE指令,但是march=native
应该包括当前CPU支持的所有指令,因此也使用SSE2。为什么会这样 适用于gcc 4.9.2。(Ubuntu amd64)
gcc-m32-march=native-ftree-vectorize-S-o-
:
blah blah a lot of mov insns because we didn't use -O3
fldl -8(%ebp)
fmull -16(%ebp)
fldl .LC0
faddp %st, %st(1)
leave
ret
gcc-m32-march=native-mfpmath=sse-ftree vectorize-S-o-fp simple.c
:
mov ... copy from args to locals on the stack
vmovsd -8(%ebp), %xmm0
vmulsd -16(%ebp), %xmm0, %xmm1
vmovsd .LC0, %xmm0
vaddsd %xmm0, %xmm1, %xmm0
vmovsd %xmm0, -24(%ebp)
fldl -24(%ebp)
leave
ret
(使用-march=nehalem
,您将获得与SSE指令相同的代码,但不是VEX版本。)
因此,如果gcc4.8没有这样的行为,听起来像是一个bug。您可能想尝试添加
-msse2
。如果我使用march=native,则未启用?如果您使用优化(如-O3
)进行编译会发生什么?这没有意义。它展示了什么?在我的系统上使用-m32
显示SSE2已启用。什么是您的CPU?-march=native
在某些虚拟机上往往表现不好,因为这些虚拟机可能会将自己宣传为不可能的机器(如64位奔腾2)。然而,如果它说sse2已启用,我真的看不出-msse2有什么不同。
mov ... copy from args to locals on the stack
vmovsd -8(%ebp), %xmm0
vmulsd -16(%ebp), %xmm0, %xmm1
vmovsd .LC0, %xmm0
vaddsd %xmm0, %xmm1, %xmm0
vmovsd %xmm0, -24(%ebp)
fldl -24(%ebp)
leave
ret