【发布时间】:2018-08-10 15:09:24
【问题描述】:
我有一个使用 sse2 内在函数的非常简单的 c++ 代码(我实际在做的一个最小示例)。
#include <xmmintrin.h>
int main(){
__m128d a = {0,0};
__m128d b = {1,1};
__m128d c = a + b;
int t = c[0] >= 1;
return t;
}
我想检查加法是否确实编译为矢量化指令。我用g++ -S test.cpp编译文件
我对这件事的理解是,如果我不将msse2 标志放入g++,则不会启用sse2。好像被g++ -Q --help=target的结果证实了
-msse [disabled]
-msse2 [disabled]
-msse2avx [disabled]
-msse3 [disabled]
-msse4 [disabled]
-msse4.1 [disabled]
-msse4.2 [disabled]
-msse4a [disabled]
但是,在查看汇编代码时,似乎使用了addpd 指令。
main:
.LFB499:
.cfi_startproc
pushq %rbp
.cfi_def_cfa_offset 16
.cfi_offset 6, -16
movq %rsp, %rbp
.cfi_def_cfa_register 6
subq $80, %rsp
movq %fs:40, %rax
movq %rax, -8(%rbp)
xorl %eax, %eax
pxor %xmm0, %xmm0
movaps %xmm0, -48(%rbp)
movapd .LC0(%rip), %xmm0
movaps %xmm0, -32(%rbp)
movapd -48(%rbp), %xmm0
addpd -32(%rbp), %xmm0
movaps %xmm0, -64(%rbp)
movsd -64(%rbp), %xmm0
pxor %xmm1, %xmm1
ucomisd %xmm1, %xmm0
setnb %al
movzbl %al, %eax
movl %eax, -68(%rbp)
movl -68(%rbp), %eax
movq -8(%rbp), %rdx
xorq %fs:40, %rdx
je .L3
call __stack_chk_fail
.L3:
leave
.cfi_def_cfa 7, 8
ret
.cfi_endproc
.LFE499:
.size main, .-main
.section .rodata
.align 16
.LC0:
.long 0
.long 1072693248
.long 0
.long 1072693248
.ident "GCC: (Ubuntu 5.4.0-6ubuntu1~16.04.10) 5.4.0 20160609"
.section .note.GNU-stack,"",@progbits
我在这里看到了一个矛盾,这让我觉得有些东西我不明白。 sse2 是否启用?
【问题讨论】:
-
在 64 位模式下它始终处于启用状态。
-
那我猜问题是我不太明白
g++ -Q --help=target做了什么。 -
--help=target选项仅指您传递给 gcc 的命令行选项。见gcc.gnu.org/onlinedocs/gcc/Option-Index.html -
您也可以使用
-m32创建 32 位二进制文件。不确定-Q --help=target是否认为不同。 -
sse2 不是 AMD64 的扩展,它是基本指令集的一部分,因此“-msse”和“-msse2”参数不做任何事情,默认情况下它们可能处于关闭状态,但不会停止 gcc 生成 SSE2 代码
标签: c++ gcc assembly vectorization