LINUX.ORG.RU
решено ФорумTalks

2 megabaks: Векторизация ,как и было предсказано Зальцманном из бухгалтерии


0

2

прелюдия:
чтобы не считали тему 5.4,
речь идет о том включают ли флаги -msse* генерацию соответствующих инструкций в коде или имеют лишь пермиссивное значение


Итак маленькое пилотное исследование:

материал исследования - GNU bash 4.1,
скомпилированый бинарник содержит около 160 тысяч asm инструкций,
не содержит специализированных ассемблерных вставок с SSE/MMX.
инструментарий - GCC 4.3.4 release, GCC 4.4.3 release, GCC 4.5 release candidate,
а также вот эта утилита http://dev.gentoo.org/~dirtyepic/bin/analyze-x86 , которую я переписала в процессе на Си, потому что перлячья уж сильно тормозит

Значение исследования: помочь гентушникам и прочим собирателям из исходников познать дзен, ввиду того что публикуемая документация по GCC недостаточно данный вопрос раскрывает.

интерлюдия: о -march=native , разные версии GCC относятся к этому флагу немного по разному,
посмотреть что именно они имеют ввиду можно не только флажком -Q , но и флажком -v собирая любой файл,
итак hello_world.c

GCC 4.3
Core2 Penryn
-march=core2 -mcx16 -msahf --param l1-cache-size=32 --param l1-cache-line-size=64 -mtune=core2
Celeron M390
-march=pentium-m --param l1-cache-size=32 --param l1-cache-line-size=64 -mtune=generic
Atom 330 (не определены размеры кешей!)
-march=core2 -mcx16 -msahf -mtune=core2


GCC 4.4 (для атома - redhat svn версия, т.к. ванильная атом не поддерживает)
-march=core2 -mcx16 -msahf -msse4.1 --param l1-cache-size=32 --param l1-cache-line-size=64 --param l2-cache-size=6144 -mtune=core2
-march=pentium-m --param l1-cache-size=32 --param l1-cache-line-size=64 --param l2-cache-size=1024 -mtune=generic
-march=atom -mcx16 -msahf -mmovbe --param l1-cache-size=24 --param l1-cache-line-size=64 --param l2-cache-size=512 -mtune=atom


GCC4.5 (только для core2)
-march=core2 -mcx16 -msahf -msse4.1 --param l1-cache-size=32 --param l1-cache-line-size=64 --param l2-cache-size=6144 -mtune=core2

выводы достаточно интересны тем, что -msse может как присутствовать, так и отсутствовать, практический вывод - нужно проверять что конкретно у вас.

Тесты для GCC4.4:

1) -O2 -march=core2
686: 394
mmx: 8

2) -O2 -march=core2 -msse4.1 -mmmx
686: 394
mmx: 8

3) -O2 -march=core2 -ftree-vectorize
686: 416
mmx: 17
sse: 1
sse2: 39

4) -O2 -march=core2 -ftree-vectorize -msse4.1 -mmmx
686: 416
mmx: 17
sse: 1
sse2: 39

5) -O2 -march=core2 -fno-tree-vectorize -mfpmath=sse
686: 394
mmx: 8

6) -O2 -march=core2 -fno-tree-vectorize -mfpmath=sse -msse4.1 -mmmx
686: 394
mmx: 8

для GCC 4.3 и GCC 4.5 rc результаты получились аналогичными, разве что у 4.5 число использования «высших» инструкций выросло, как для ppro, так и для mmx/sse

Выводы:

1) -mmmx включен всегда, несмотря на то что -Q показывает его как выключеный
2) -msse не включает генерацию соответствующих инструкций
3) -mfpmath задает только путь fpu/sse , в ассемблерном листинге не отлавливается (?) возможно следует повторить тест на чем-нибудь более интенсивно использующем математику
4) для -ftree-vectorize не имеет значение флаг -msse , достаточно -march=

Так что все подтверждается, -msse имеют лишь пермиссивное значение .
Если будете повторять - попробуйте взять что-нибудь другое, только без asm вставок с инструкциями mmx/sse

★★★★★

686: 1640
mmx: 3389
sse: 1485
sse2: 1215
sse3: 69
ssse3: 1

ICC -O3 -xT , для сравнения абсолютных чисел )

Sylvia ★★★★★ ()

перетестировала на математически ориентированом пакете:
(к сожалению содержит asm вставки, так что сравнение по возрастанию числа инструкций)
GMP5

-march=pentium4 -mfpmath=387
486: 7
586: 0
686: 267
mmx: 26
sse: 0
sse2: 6

-march=pentium4 -mfpmath=sse -msse3
486: 7
586: 0
686: 240
mmx: 44
sse: 0
sse2: 198

-march=pentium4 -O3 -mfpmath=sse -msse3
486: 7
586: 0
686: 317
mmx: 248
sse: 24
sse2: 770

Sylvia ★★★★★ ()
Ответ на: комментарий от Sylvia

ICC:
486: 9
586: 0
686: 732
mmx: 398
sse: 55
sse2: 795
sse3: 148
ssse3: 4
sse4.1: 22

Sylvia ★★★★★ ()

вот ведь кому-то не спиться в ночь тихую

gunja ()
Ответ на: комментарий от Sylvia

>sse3: 148

ssse3: 4

sse4.1: 22



почему gcc этих инструкций негенерил?

madcore ★★★★★ ()
Ответ на: комментарий от madcore

ICC а не GCC
GCC как раз в плане векторизации слабее, sse, sse2, совсем немножко sse3

Sylvia ★★★★★ ()

-mfpmath

Еще как отлавливается. Нарисуй пример с float от руки

vasily_pupkin ★★★★★ ()
Ответ на: комментарий от vasily_pupkin

уже отловила, в GMP, в баше просто нет математики для -mfpmath )

Sylvia ★★★★★ ()

Мамочки мои, и вы еще спрашиваете, почему Вас тут большинство считает до сих пор за бородатого одмина. Кста, а не пробовала случаем кернелу собирать при помощи ICC?

NuclearPhoenix ()

>я переписала в процессе на Си
а выложить?

seed_stil ★★ ()

спасибо :)
пока раскуриваю....

megabaks ★★★★ ()

Силви. После этого мне захотелось закурить, что и как у них там

namezys ★★★★ ()
Ответ на: комментарий от megabaks

>3) -mfpmath задает только путь fpu/sse , в ассемблерном листинге не отлавливается (?) возможно следует повторить тест на чем-нибудь более интенсивно использующем математику

вот этот вывод неверный, в баше просто нет математики для отлова, там перетест с GMP есть, где ясно видно что растет число sse инструкций

Sylvia ★★★★★ ()

Сильви, тебе такая борода не мешает?
p.s. интересный обзор

devl547 ★★★★★ ()
Ответ на: комментарий от Sylvia

хм...да

megabaks@localhost ~/perl $ ./analyze-x86 /usr/bin/mplayer
Checking vendor_id string... GenuineIntel
Disassembling /usr/bin/mplayer, please wait...
i486: 3684 i586:   16 ppro: 6877 mmx: 117671 sse: 4968 sse2: 2080 sse3:  752 sse4.1:    0 sse4.2:    0

This binary was found to contain the cpuid instruction.
It may be able to conditionally execute instructions if
they are supported on the host (i586+).

/usr/bin/mplayer will run on Pentium IV (pentium4) w/ SSE3 or higher processor.
megabaks@localhost ~/perl $ ./analyze-x86 /usr/bin/mplayer
Checking vendor_id string... GenuineIntel
Disassembling /usr/bin/mplayer, please wait...
i486: 3684 i586:   16 ppro: 7047 mmx: 120560 sse: 5414 sse2: 4853 sse3:  755 sse4.1: 1003 sse4.2:    0

This binary was found to contain the cpuid instruction.
It may be able to conditionally execute instructions if
they are supported on the host (i586+).

/usr/bin/mplayer will run on Intel Core 2 Duo (Penryn) w/ SSE4.1 or higher processor.
megabaks@localhost ~/perl $ 
в первом случае
-O2 -march=core2 -mmmx -msse4.1 --param l1-cache-size=64 --param l1-cache-line-size=64 --param l2-cache-size=3072 -floop-interchange -floop-block -floop-strip-mine -ftree-loop-distribution -pipe -g0 -Wno-all
во втором
-O2 -march=core2 -ftree-vectorize -mmmx -msse4.1 --param l1-cache-size=64 --param l1-cache-line-size=64 --param l2-cache-size=3072 -floop-interchange -floop-block -floop-strip-mine -ftree-loop-distribution -pipe -g0 -Wno-all
думаю...

megabaks ★★★★ ()
Ответ на: комментарий от megabaks

только не mplayer там же сплошные вставки ) сколько кстати по времени его перлятина парсит?

$analyze-x86 mplayer
instructions:
cpuid: 29 nop: 9946 call: 68323 count: 2569718
i486: 4543
i586: 3
i686: 12127
mmx: 130116
sse: 26312
sse2: 26950
sse3: 290
ssse3: 942
sse4.1: 40
sse4.2: 1
3dnow!: 1768
3dnowext: 13

Sylvia ★★★★★ ()
Ответ на: комментарий от Sylvia

хорошо - что без вставок 100%?
перлятина дооолго - пару раз покурить можно и чая напиться )))

megabaks ★★★★ ()
Ответ на: комментарий от Sylvia

и на -mfpmath=sse* сплошные маты (

Checking for GCC & CPU optimization abilities ... CPU optimization disabled. CPU not recognized or your compiler is too old.

этож ппц!

localhost megabaks # gcc-config -l

............


[2] i686-pc-linux-gnu-4.4.3 *


............

megabaks ★★★★ ()
Ответ на: комментарий от megabaks

я брала bash, но там математики недостаточно,
qt точно с вставками пойдет, мультимедиа тоже не годится,
даже не знаю, в принципе в configure попадаются ключики --disable-asm

даже у кодеков, можно попробовать

Sylvia ★★★★★ ()
Ответ на: комментарий от megabaks

там есть asm
но обычно без mmx/sse

p7zip 9.04
make 7za

-O2 -march=pentium4

/tmp/p7zip_9.04 :$analyze-x86 bin/7za
instructions:
cpuid: 0 nop: 4593 call: 17422 count: 256860
i686: 668
mmx: 64

Sylvia ★★★★★ ()
Ответ на: комментарий от Sylvia

кстати на моём E7200 и мплеере имеет значение -msse4.1 и -mmmx

с ними

i486: 3684 i586:   16 ppro: 7047 mmx: 120560 sse: 5414 sse2: 4853 sse3:  755 sse4.1: 1003 sse4.2:    0
без них
i486: 3684 i586:   16 ppro: 7049 mmx: 121813 sse: 5414 sse2: 6373 sse3:  755 sse4.1:    0 sse4.2:    0
опять думаю...почему БЕЗ -mmmx собственно mmx БОЛЬШЕ?

megabaks ★★★★ ()
Ответ на: комментарий от megabaks

во втором случае у вас меньше sse 4.1, так что возможно этот код был реализован в mmx и sse2 инструкциях

Sylvia ★★★★★ ()
Ответ на: комментарий от Sylvia

сейчас пересобираю с -msse4.1, но без -mmmx - посмотрим....

megabaks ★★★★ ()
Ответ на: комментарий от megabaks

нашла
gzip 1.4


mfpmath=sse -msse2

cpuid: 0 nop: 270 call: 712 count: 14977
i686: 86
mmx: 3
sse2: 15

msse2 -mfpmath=387
nstructions:
cpuid: 0 nop: 267 call: 712 count: 14963
i686: 86
mmx: 2

Sylvia ★★★★★ ()
Ответ на: комментарий от megabaks

вот что вышло

i486: 3684 i586:   16 ppro: 7047 mmx: 120560 sse: 5414 sse2: 4853 sse3:  755 sse4.1: 1003 sse4.2:    0

megabaks ★★★★ ()
Ответ на: комментарий от megabaks

ппц

 -msse4.1 и -mmmx
с ними
i486: 3684 i586: 16 ppro: 7047 mmx: 120560 sse: 5414 sse2: 4853 sse3: 755 sse4.1: 1003 sse4.2: 0 
без них
i486: 3684 i586: 16 ppro: 7049 mmx: 121813 sse: 5414 sse2: 6373 sse3: 755 sse4.1: 0 sse4.2: 0
с -msse4.1, но без -mmmx
i486: 3684 i586: 16 ppro: 7047 mmx: 120560 sse: 5414 sse2: 4853 sse3: 755 sse4.1: 1003 sse4.2: 0

megabaks ★★★★ ()
Ответ на: комментарий от megabaks

как видите -mmmx не нужен, вывод напрашивается сам собой )

по тому что «без», комментариев давать наверное не стану

Sylvia ★★★★★ ()
Ответ на: комментарий от megabaks

так я убедила в том что -msse* не включает само по себе генерацию инструкций?)

Sylvia ★★★★★ ()
Ответ на: комментарий от Sylvia

-mmmx включается скорее -march

похоже - тест на гзипе

i486:    0 i586:    0 ppro:  109 mmx:   19 sse:    4 sse2:   44 sse3:    0 sse4.1:    0 sse4.2:    0
i486:    0 i586:    0 ppro:  109 mmx:   23 sse:    0 sse2:   44 sse3:    0 sse4.1:    0 sse4.2:    0
первое без - второе с

megabaks ★★★★ ()
Ответ на: комментарий от megabaks

т.е. «с» - больше? ну тогда лучше указывать в CFLAGS чем пропустить

не зря же наверное -Q не показывает этот флаг как включеный

Sylvia ★★★★★ ()
Ответ на: комментарий от megabaks

тот же гзип с march

i486: 0 i586: 0 ppro: 90 mmx: 8 sse: 0 sse2: 4 sse3: 0 sse4.1: 0 sse4.2: 0
-mfpmath=sse хм...

megabaks ★★★★ ()
Ответ на: комментарий от Sylvia

а если внимательно посмотреть, то часть mmx (4 штуки) заменились на sse

megabaks ★★★★ ()
Ответ на: комментарий от megabaks

у меня нет амдшного процессора, то что в выводе по mplayer выше - из ассемблерных вставок.

насколько gcc способен к генерации 3dnow(ext) самостоятельно - пусть проверяют владельцы amd )

Sylvia ★★★★★ ()
Ответ на: комментарий от megabaks

таки gpl ) а что еще? оригинал на перл идет без лицензии
я оттуда ничего не взяла кроме массивов данных, которые в принципе доступны и через гугл элементарным поиском

Sylvia ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.