включение -msse4 снижает производительность?

Пересобрал систему с поддержкой msse4, т.к. являюсь обладателем процессора Core i7 и хотел бы использовать его возможности на полную мощь (до этого система была собрана с march=native). На глаз изменений естественно не заметил, но когда ради интереса запустил sunspider на своём firefox, то был очень расстроен результатами: 780ms с march=native против 980ms с msse4 (это явно уже не в пределах статистической погрешности). Стоит заметить что я использовал флаги рекомендованные в Gentoo wiki

CHOST="i686-pc-linux-gnu"
CFLAGS="-O2 -pipe -march=core2 -msse4 -mcx16 -msahf -fomit-frame-pointer"
CXXFLAGS="${CFLAGS}"

погуглил тесты производительности для других приложений, но так ничего и не нашел.

Что скажите?

Ты, несомненно, прочитал и

Ты, несомненно, прочитал и понял шапку на странице

Цитата:
Warning: GCC 4.x and above support -march=native. -march=native applies additional settings beyond -march, specific to your CPU. Unless you have a specific reason not to (e.g. distcc cross-compiling), you should probably be using -march=native, rather than anything listed below.

Не грусти, товарищ! Всё хорошо, beautiful good!

наверное не понял, объясните

наверное не понял, объясните пожалуйста )

вот на всякий случай сравнил какая разница между safe cflags и native

sergei@localhost ~ $ gcc -march=core2 -O2 -msse4 -mcx16 -msahf -Q --help=target > msse4.target
sergei@localhost ~ $ gcc -march=native -Q --help=target > native.target
sergei@localhost ~ $ diff msse4.target native.target
39c39
<   -mno-sse4                                   [выключено]
---
>   -mno-sse4                                   [включено]
51,56c51,56
<   -msse                                       [включено]
<   -msse2                                      [включено]
<   -msse3                                      [включено]
<   -msse4                                      [включено]
<   -msse4.1                                    [включено]
<   -msse4.2                                    [включено]
---
>   -msse                                       [выключено]
>   -msse2                                      [выключено]
>   -msse3                                      [выключено]
>   -msse4                                      [выключено]
>   -msse4.1                                    [выключено]
>   -msse4.2                                    [выключено]
60c60
<   -mssse3                                     [включено]
---
>   -mssse3                                     [выключено]
66c66
<   -mtune=
---
>   -mtune=                                     core2

Где-то уже проскакивало, что

Где-то уже проскакивало, что --help=target не выдает настоящие флаги оптимизации, которые будут применены при сборке. Так что не показатель.

В двух словах - native включает все то, что ты указал, и сверх того.

Не грусти, товарищ! Всё хорошо, beautiful good!

Что бы точно посмотреть что

Что бы точно посмотреть что выставляет -march=native надо:

$ vim test.c
#include <stdio.h>

int main(int iArg, char** szArg)
{
        puts("Hello world!!");

        return(0);
}

$ gcc -v -march=native test.c -o /dev/null
Using built-in specs.
Target: x86_64-pc-linux-gnu
Configured with: /var/tmp/portage/sys-devel/gcc-4.3.4/work/gcc-4.3.4/configure --prefix=/usr --bindir=/usr/x86_64-pc-linux-gnu/gcc-bin/4.3.4 --includedir=/usr/lib/gcc/x86_64-pc-linux-gnu/4.3.4/include --datadir=/usr/share/gcc-data/x86_64-pc-linux-gnu/4.3.4 --mandir=/usr/share/gcc-data/x86_64-pc-linux-gnu/4.3.4/man --infodir=/usr/share/gcc-data/x86_64-pc-linux-gnu/4.3.4/info --with-gxx-include-dir=/usr/lib/gcc/x86_64-pc-linux-gnu/4.3.4/include/g++-v4 --host=x86_64-pc-linux-gnu --build=x86_64-pc-linux-gnu --disable-altivec --disable-fixed-point --enable-nls --without-included-gettext --with-system-zlib --disable-checking --disable-werror --enable-secureplt --enable-multilib --enable-libmudflap --disable-libssp --enable-libgomp --disable-libgcj --enable-languages=c,c++,treelang --enable-shared --enable-threads=posix --enable-__cxa_atexit --enable-clocale=gnu --with-bugurl=http://bugs.gentoo.org/ --with-pkgversion='Gentoo 4.3.4 p1.0, pie-10.1.5'
Thread model: posix
gcc version 4.3.4 (Gentoo 4.3.4 p1.0, pie-10.1.5)
COLLECT_GCC_OPTIONS='-v'  '-o' '/dev/null'
 /usr/libexec/gcc/x86_64-pc-linux-gnu/4.3.4/cc1 -quiet -v test.c -D_FORTIFY_SOURCE=2 -march=core2 -mcx16 -msahf --param l1-cache-size=32 --param l1-cache-line-size=64 -mtune=core2 -quiet -dumpbase test.c -auxbase test -version -o /tmp/ccbNNwhk.s
ignoring nonexistent directory "/usr/local/include"
ignoring nonexistent directory "/usr/lib/gcc/x86_64-pc-linux-gnu/4.3.4/../../../../x86_64-pc-linux-gnu/include"
#include "..." search starts here:
#include <...> search starts here:
 /usr/lib/gcc/x86_64-pc-linux-gnu/4.3.4/include
 /usr/lib/gcc/x86_64-pc-linux-gnu/4.3.4/include-fixed
 /usr/include
End of search list.
GNU C (Gentoo 4.3.4 p1.0, pie-10.1.5) version 4.3.4 (x86_64-pc-linux-gnu)
        compiled by GNU C version 4.3.4, GMP version 4.3.1, MPFR version 2.4.1-p5.
GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072
Compiler executable checksum: 9a11af468c840af60c3b3ea1839cf6d1
COLLECT_GCC_OPTIONS='-v'  '-o' '/dev/null'
 /usr/lib/gcc/x86_64-pc-linux-gnu/4.3.4/../../../../x86_64-pc-linux-gnu/bin/as -V -Qy -o /tmp/cccgo4hA.o /tmp/ccbNNwhk.s
GNU assembler version 2.18 (x86_64-pc-linux-gnu) using BFD version (GNU Binutils) 2.18
COMPILER_PATH=/usr/libexec/gcc/x86_64-pc-linux-gnu/4.3.4/:/usr/libexec/gcc/x86_64-pc-linux-gnu/4.3.4/:/usr/libexec/gcc/x86_64-pc-linux-gnu/:/usr/lib/gcc/x86_64-pc-linux-gnu/4.3.4/:/usr/lib/gcc/x86_64-pc-linux-gnu/:/usr/libexec/gcc/x86_64-pc-linux-gnu/4.3.4/:/usr/libexec/gcc/x86_64-pc-linux-gnu/:/usr/lib/gcc/x86_64-pc-linux-gnu/4.3.4/:/usr/lib/gcc/x86_64-pc-linux-gnu/:/usr/lib/gcc/x86_64-pc-linux-gnu/4.3.4/../../../../x86_64-pc-linux-gnu/bin/
LIBRARY_PATH=/usr/lib/gcc/x86_64-pc-linux-gnu/4.3.4/:/usr/lib/gcc/x86_64-pc-linux-gnu/4.3.4/:/usr/lib/gcc/x86_64-pc-linux-gnu/4.3.4/../../../../lib64/:/lib/../lib64/:/usr/lib/../lib64/:/usr/lib/gcc/x86_64-pc-linux-gnu/4.3.4/../../../../x86_64-pc-linux-gnu/lib/:/usr/lib/gcc/x86_64-pc-linux-gnu/4.3.4/../../../:/lib/:/usr/lib/
COLLECT_GCC_OPTIONS='-v'  '-o' '/dev/null'
 /usr/libexec/gcc/x86_64-pc-linux-gnu/4.3.4/collect2 --eh-frame-hdr -m elf_x86_64 -dynamic-linker /lib64/ld-linux-x86-64.so.2 -o /dev/null /usr/lib/gcc/x86_64-pc-linux-gnu/4.3.4/../../../../lib64/crt1.o /usr/lib/gcc/x86_64-pc-linux-gnu/4.3.4/../../../../lib64/crti.o /usr/lib/gcc/x86_64-pc-linux-gnu/4.3.4/crtbegin.o -L/usr/lib/gcc/x86_64-pc-linux-gnu/4.3.4 -L/usr/lib/gcc/x86_64-pc-linux-gnu/4.3.4 -L/usr/lib/gcc/x86_64-pc-linux-gnu/4.3.4/../../../../lib64 -L/lib/../lib64 -L/usr/lib/../lib64 -L/usr/lib/gcc/x86_64-pc-linux-gnu/4.3.4/../../../../x86_64-pc-linux-gnu/lib -L/usr/lib/gcc/x86_64-pc-linux-gnu/4.3.4/../../.. /tmp/cccgo4hA.o -lgcc --as-needed -lgcc_s --no-as-needed -lc -lgcc --as-needed -lgcc_s --no-as-needed /usr/lib/gcc/x86_64-pc-linux-gnu/4.3.4/crtend.o /usr/lib/gcc/x86_64-pc-linux-gnu/4.3.4/../../../../lib64/crtn.o

Размер кешей выставлять не нужно, с ним некоторые ./configure неправильно парсят CFLAGS

--param l1-cache-size=32 --param l1-cache-line-size=64

Working on Gentoo Linux for Asus P535 and Qtopia :-)

gcc -v -march=pentium-m

gcc -v -march=pentium-m test.c -o /dev/null

 /usr/libexec/gcc/i686-pc-linux-gnu/4.4.2/cc1 -quiet -v test.c -D_FORTIFY_SOURCE=2 -quiet -dumpbase test.c -march=pentium-m -auxbase test -version -o /tmp/ccdFpvG4.s

gcc -v -march=native test.c -o /dev/null

 /usr/libexec/gcc/i686-pc-linux-gnu/4.4.2/cc1 -quiet -v test.c -D_FORTIFY_SOURCE=2 -march=pentium-m --param l1-cache-size=32 --param l1-cache-line-size=64 --param l2-cache-size=2048 -mtune=generic -quiet -dumpbase test.c -auxbase test -version -o /tmp/cckhlAy0.s

Т.к. юзаю distcc, то в make.conf стоит -march=pentium-m, но в любом случае -msse2 -msse -mmmx отутствуют.B еще у native присутсвует -mtune=generic
Исходя из этого в make.conf мне стоит написать: "-march=pentium-m -msse2 -msse -mmmx -pipe -fomit-frame-pointer" Я прав или надо учесть еще что-то?

в другом треде приводили

в другом треде приводили ссылку:
http://gcc.gnu.org/ml/gcc-help/2009-04/msg00305.html

Цитата:
> I assume you are asking whether the code will use SSE instructions if
> appropriate. Yes, it will, because you specified -march with a
> processor that supports SSE. The output of --help=target just tells you
> the status of the various command line options; it doesn't tell you
> which architecture will be used.

а т.к.

Цитата:
pentium-m
Low power version of Intel Pentium3 CPU with MMX, SSE and SSE2 instruction set support. Used by Centrino notebooks.

то во флаге -march=pentium-m содержатся флаги -mmmx,-msse,-msse2. И их включать не нужно. А -fomit-frame-pointer содержится во флаге -O2.

Поправьте если не прав.

Это я читал, знаю, но как

Это я читал, знаю, но как проверить, что реально включилось - хз. Можно конечно поверить на слово, но все равно останется вопрос, почему некоторые флаги проявляются в явном виде, а некоторые нет.

в принципе

Однозначно проверить можно только скомилировав программу заведомо использующую данные фунции (в идеале тестовую) 2мя способами и посмотрев результат. могу заняться если кто-нибудь кинет ссылку на простейшие примеры benchmark'ов или программ, которые можно оптимизировать используя sse,sse2,sse3 и т.д.

-Q --help=target - показывает те флаги, которые gcc вставляет в команду компиляции дополнительно к платформе, т.е. флаги, которые входять в march не показываются, т.е. тут всё логично. Но почему это сделано так, чтоинформацию нужно искать в рассылках мне лично не понятно.

написал сейчас простенькую

написал сейчас простенькую программу с умножением векторов. Собрал с gcc -O2 -march=native и диззасеблировал, в работе присутствуют вызовы типа CVTSD2SS, это вызовы SSE2. Т.е. sse2 реально включилось. Может можно посмотреть и другие примеры, но для меня это занимает много времени лазания по гуглу, т.к. я плохо разбираюсь, что есть в каком SSE и где компилятор может соптимизировать.

native включает флаги

native включает флаги оптимизации для выбранного типа процессора. их список можно увидеть на

http://gcc.gnu.org/onlinedocs/gcc/i386-and-x86_002d64-Options.html

так для core2:

Intel Core2 CPU with 64-bit extensions, MMX, SSE, SSE2, SSE3 and SSSE3 instruction set support.

соответсвенно все ssse3 будут включены автоматом, но не msse4. Включение msse4 явно приводит к включению явно всех младших msse, что можно видеть на представленном diff.

qnikst написал(а): все ssse3

qnikst написал(а):
все ssse3 будут включены автоматом, но не msse4

Судя по тыц - это одно и то же...

Мы тоже не всего читали Шнитке!.. © В. Вишневский

Похоже отбой воздушной

Похоже отбой воздушной тревоги. У меня во время пересборки, firefox даунгрейднулся с 3.6 до 3.5.6 какого - то хрена. И теперь он hard masked в оф ветке. Вобщем поставил, покрутил и так и сяк, разницы вобще никакой не заметил между march=native и save cflags.
на всякий случай оставил такой вариант

-O2 -pipe -march=native -msse4

А мы тут пыхтели, а оно тут о

А мы тут пыхтели, а оно тут о как :)

Working on Gentoo Linux for Asus P535 and Qtopia :-)

Настройки просмотра комментариев

Выберите нужный метод показа комментариев и нажмите "Сохранить установки".