Использование программами SSE3, SSSE3 и SSE4.1 [РЕШЕНО]

читая man gcc понял, что -march=core2 включает SSE>=3

но, при проверке генерируемых инструкций выясняется, что используются только SSE и SSE2:

./analyze /usr/bin/gimp

./analyze /usr/bin/mplayer

использовал этот скрипт

в качестве основного результата брался этот (./analyze /usr/bin/mplayer), сделанный не мной.

мои CFLAGS и CFLAGS компа, где был засечён основной результат

добавь флаг -msse4

добавь флаг

-msse4

___________________________________________
Working on Gentoo for iPAQ hx4700 and Openmoko Neo Freerunner :-)
Если у вас компьютер с Windows, есть два выхода: выбросить компьютер в форточку или выбросить форточки с компьютера

мой C2D E7400 держит только

мой C2D E7400 держит только SSE 4.1

Я просто для примера привел

Я просто для примера привел =)

___________________________________________
Working on Gentoo for iPAQ hx4700 and Openmoko Neo Freerunner :-)
Если у вас компьютер с Windows, есть два выхода: выбросить компьютер в форточку или выбросить форточки с компьютера

Цитата: SSE4.1 is for 45 nm

Цитата:
SSE4.1 is for 45 nm processors only

http://en.wikipedia.org/wiki/Intel_Core_2
На всякий случай...

и к чему это?

и к чему это?

Во-первых, это объясняет

Во-первых, это объясняет почему -march=core2 не включает sse4.1 (так как среди core 2 duo процессоров не все поддерживают sse4.1).
Во-вторых, это написано до того как вы сообщили модель своего процессора.

если посмотреть в мои флаги,

если посмотреть в мои флаги, то там обнаруживается -msse4.1

А gimp написан с

А gimp написан с использованием инструкций из sse4.1 ?

А gimp написан с

А gimp написан с использованием инструкций из sse4.1 ?

И как написать с с использованием инструкций из sse4.1 на сишке или плюсах ? :) Это не возможно, если не использовать асм, но тогда теряется переносимость. Как пример, рекомендую рязобратся, что делает юз sse2 в openssl и закрыть тему оптимизации по sse раз и навсегда

Compute:
Bosch M2.8.1 -> custom Bosch M2.8.3 clone from Russia.
Speed about 260 km,Ram 2 pers.,HDD - 70 kg,210 FLOPS ;)

google: "intrinsic gcc sse"

google: "intrinsic gcc sse" http://www.google.ru/search?hl=ru&newwindow=1&q=intrinsic+gcc+sse&aq=f&aqi=&aql=&oq=&gs_rfai=
Здесь: http://gcc.gnu.org/wiki/Math_Optimization_Flags ссылаются на xmmintrin.h, в котором видимо определены некоторые (или все) SIMD инструкции. Где я должен использовать ассемблер ? Да, появляется несущественная зависимость от компилятора, но в целом код переносим.
Я предлагаю не закрывать тему SIMD в gentoo, мне, к примеру, интересно есть ли действительно хоть какой-то профит от -msse в CFLAGS, если само приложение не использует прямо SIMD инструкции ?

хорошо, пример кода,

хорошо, пример кода, требующего ( т.е не работаюшего без) sse3 на чистом си в студию, пожалуйста.

U.P как пример - http://cvs.openssl.org/dir?d=openssl/crypto/md5.
Особенно - http://cvs.openssl.org/fileview?f=openssl/crypto/md5/asm/md5-x86_64.pl&v=1.8

Compute:
Bosch M2.8.1 -> custom Bosch M2.8.3 clone from Russia.
Speed about 260 km,Ram 2 pers.,HDD - 70 kg,210 FLOPS ;)

Я не могу привести пример

Я не могу привести пример кода, использующего sse3 (хотя я не понимаю зачем это вообще нужно), у меня не было опыта программирования с использованием SIMD.
Что касается http://cvs.openssl.org/fileview?f=openssl/crypto/md5/asm/md5-x86_64.pl&v=1.8
то там только ассемблер, если я не ошибаюсь. Ни sse3 инструкции, ни любой другой SIMD там нет.
Что касается именно sse3 intrinsic функций, то они, насколько я понял, определены в pmmintrin.h, у меня этот файл можно найти в /usr/lib/gcc/i686-pc-linux-gnu/4.4.4/include/pmmintrin.h

Программировать на C, используя SIMD (sse, sse2, ...) без ассемблерных вставок, можно.
Что именно вы хотите сказать ?

Ж_Ж

$ find /usr/bin/ | xargs -n 1 file | grep "ELF 64-bit" | awk '{print $1}' | sed -e "s/://" | xargs -n 1 ./analyze > sse.txt
$ egrep "sse(3|4)" sse.txt 
 sse3:   3
 sse3:   5
 sse3:   6
 sse3:   6
 sse3:   155
 sse3:   6
 sse3:   5
 sse3:   10
 ssse3:  239
 sse3:   2
 sse3:   6
 sse3:   2
 sse3:   10
 ssse3:  239

увы

а эта строка - это просто подпись

пошёл учить матчасть

пошёл учить матчасть, нихрена не понял

:

по-русски это звучит так:

берём все файлы из /usr/bin/, отфильтровали бинарники для analyze
(потому что зачем analyze-у, скажем, /usr/bin/whatis - это ж скрипт),
и вызвали analyze для каждого такого бинарника.
Вывод сохранили в sse.txt
И видим, что sse3 инструкции нашлись лишь в нескольких программах,
ssse3 - только в ОДНОЙ программе, а sse4.1 вообще ни у кого нет.

Надо бы для чистоты эксперимента написать helloworld c asm-вставками с sse4.1,
чтобы убедиться, что и gcc знает, и analyze увидит.
Но лениво, да и работа отвлекает.

а эта строка - это просто подпись

вобщем, суть в том, что

вобщем, суть в том, что большинство программ не держат даже SSE3. я правильно вас понял? :)

а почему-же тогда в эталонном результате и sse 4.1 есть?

попробуйте проверить

попробуйте проверить /usr/lib64/libx264.so.98

OMFG

$ ./analyze /usr/lib64/libx264.so.98
instructions '/usr/lib64/libx264.so.98':
 cpuid: 1        nop: 599        call: 0         count: 125409
 i486:   302
 i686:   432
 mmx:    12423
 sse:    3799
 sse2:   4628
 sse3:   292
 ssse3:  817
 sse4.1:         35

А! Не там искали! Thnx!

а эта строка - это просто подпись

О_О

instructions:
 cpuid: 1	 nop: 3895	 call: 3532	 count: 149992
 i486:	 346
 i686:	 466
 mmx:	 14806
 sse:	 3960
 sse2:	 4807
 sse3:	 275
 ssse3:	 711
 sse4.1:	 31
 sse4a:	 11

в заголовок

[SOLVED] [РЕШЕНО]

а эта строка - это просто подпись

Какая то странная

Какая то странная тестилка (или библиотека):

$ ./analyze /usr/lib64/libx264.so.78 
instructions:
 cpuid: 1        nop: 192        call: 0         count: 100403
 i486:   115
 i686:   342
 mmx:    13542
 sse:    3595
 sse2:   3917
 sse3:   292
 ssse3:  857
 sse4.1:         35

Это на процессоре, который не знает про sse4

>_<

победителем является /usr/lib64/gstreamer-0.10/libgstffmpeg.so из media-plugins/gst-plugins-ffmpeg

 cpuid: 4        nop: 4917       call: 0         count: 1059014
 i486:   3370
 i686:   4587
 mmx:    92147
 sse:    8999
 sse2:   8139
 sse3:   30
 ssse3:  284
 sse4.1:         928
 3dnow!:         1627
 3dnowext:       17

тут всего в кучу и много

а эта строка - это просто подпись

analyze-x86.c ищет инструкции

analyze-x86.c ищет инструкции и в блоках данных - верить ему нельзя

Как так

ведь я же вижу строку:snprintf(tmp, 8191, "objdump -d %s", argv[1]);
а man objdump строго говорит:

-d
       --disassemble
           Display the assembler mnemonics for the machine instructions from objfile.
           This option only disassembles those sections which are expected to contain instructions.

а эта строка - это просто подпись

И что, objdump и блоки данных

И что, objdump и блоки данных переведет в мнемоники ассемблера.
PS. Точно сказать что код, а что данные - Вам не сможет ни один тупой дизассемблер - для этого используют такие вещи как ida, да и там надо долго глазами смотреть и кнопочки тыкать.

о_0

а конкретный пример того, как objdump ошибся, привести можете?

а эта строка - это просто подпись

есть подозрение, что там это

есть подозрение, что там это на asm просто написано, но ветка кода не используется, если проц не тот.

а как оно тогда

а как оно тогда ассемблируется? Тогда уж в напрямую в машинных кодах

sse4.1 встречал очень редко,

sse4.1 встречал очень редко, sse3 вообще не видел вроде бы.

разобрался!

нехитрые тесты с использованием /etc/portage/env/* показали, что с -mfpmath=sse,387 генерируются только SSE и SSE2, а с -ftree-vectorize генерируются вообще ВСЕ инструкции.
результаты:-mfpmath=sse,387, -ftree-vectorize

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

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