GCC не будет использовать SSE в 32-битной версии

В linux x64, если я компилирую код с помощью gcc таким образом

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

если я взгляну на сборку, я не увижу какой-либо инструкции SSE или используемого регистра, и результат кода точно такой же, как код, сгенерированный без какого-либо флага gcc myfile.c

В моем коде много операций с массивами и матрицами с плавающей запятой, поэтому довольно странно, что gcc не использует SSE и не выполняет никакой оптимизации по сравнению с базовой компиляцией.

Почему? Это ошибка компилятора?

РЕДАКТИРОВАТЬ

если я добавлю флаг -msse2, компилятор также будет использовать инструкции SSE, но march=native должен включать все инструкции, поддерживаемые текущим ЦП, следовательно, также SSE2. Почему это происходит?


person AndreaF    schedule 24.06.2014    source источник
comment
Вы можете попробовать добавить -msse2.   -  person Paul R    schedule 24.06.2014
comment
Если я использую March=Native не включен?   -  person AndreaF    schedule 24.06.2014
comment
Я не знаю - я просто подумал, что стоит попробовать.   -  person Paul R    schedule 24.06.2014
comment
Что произойдет, если вы скомпилируете с такой оптимизацией, как -O3?   -  person Z boson    schedule 24.06.2014
comment
То же самое бозон @Z не использует SSE. Только если, как предложил Paul R i, я добавлю -msse2, похоже, использует SSE, несмотря на все другие флаги, которые я добавил   -  person AndreaF    schedule 24.06.2014
comment
Какая версия GCC? Я думаю, что это было исправлено давно, как в GCC 4.4.что-то.   -  person Ismael Luceno    schedule 24.06.2014
comment
это gcc 4.8, как я отметил   -  person AndreaF    schedule 24.06.2014
comment
лол, похоже, это еще один случай, никого не волнует производительность на 32-битной версии.   -  person Mysticial    schedule 24.06.2014
comment
Это не имеет никакого смысла. Что делает gcc -march=native -Q --help=target показать? С -m32 в моей системе он показывает, что SSE2 включен. Какой конкретно у вас процессор?   -  person Z boson    schedule 27.06.2014
comment
Да, это абсурдно, целевые справки показывают, что они включены, но не используются, если я не указал явно -msse2. Может ли это зависеть от того, что я на виртуальной машине?   -  person AndreaF    schedule 28.06.2014
comment
-march=native ведет себя плохо на некоторых виртуальных машинах, потому что они могут рекламировать себя как невозможные машины (например, 64-битный Pentium 2). Однако, если он говорит, что sse2 включен, я действительно не понимаю, как -msse2 может иметь значение.   -  person Marc Glisse    schedule 02.08.2014


Ответы (1)


У меня работает с gcc 4.9.2. (Убунту амд64)

// 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 вы получаете тот же код, но версии инструкций SSE без VEX.)

Так что, если gcc4.8 не ведет себя так, это звучит как ошибка.

person Peter Cordes    schedule 01.08.2015