1

如果我以这种方式使用 gcc 编译代码,则在 linux x64 上

gcc -m32 -march=native -mfpmath=sse -c -ftree-vectorize myfile.c

如果我看一下程序集,我看不到使用任何 SSE 指令或寄存器,并且代码结果与生成的代码完全相同,没有任何标志 gcc myfile.c

在我的代码中,对浮点数组和矩阵进行了许多操作,因此与基本编译相比,gcc 不使用 SSE 并且不执行任何优化,这很奇怪。

为什么?这是编译器的错误吗?

编辑

如果我添加标志-msse2,编译器也使用 SSE 指令,但march=native应该包括当前 CPU 支持的所有指令,因此也包括 SSE2。为什么会这样?

4

1 回答 1

0

使用 gcc 4.9.2 为我工作。(Ubuntu amd64)

// fp-simple.c
double fp_func (double a, double b)
{
        return a*b + 32;
}

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,您将获得相同的代码,但非 VEX 版本的 SSE 指令。)

因此,如果 gcc4.8 的行为不是这样,这听起来像是一个错误。

于 2015-08-01T23:27:30.413 回答